上次回顧:
上次博客,我們主要說了微服務的發展歷程和nacos集群單機的搭建,單機需要-m standalone啟動,集群建議使用nginx做一下反向代理,自行保證mysql和ngxin的高可用。
本次定位:
一、nacos的內部概念
二、nacos的基本使用
三、為下次ribbon組件做准備
nacos的內部概念
上次我們搭建好了nacos集群,這次我們就在那個集群基礎上來繼續說,上次我們只說到了服務如何注冊到我們的nacos,但是調用還沒說,這次我們來說說各種調用吧(調用的負載均衡算法在ribbon去說)。
①.調用,我們先來一個最簡單的調用,用戶系統去調用訂單系統,查詢訂單。
建立兩個springboot項目,加入注冊中心配置。配置上次博客說過了,這里就不再贅述了,在訂單服務內寫一個方法。
@RestController public class OrderController { @GetMapping("/getOrderData") public String getOrderData(){ return "獲得訂單服務的數據"; } @GetMapping("/getOrderData-B") public String getOrderDataB(){ return "獲得訂單服務的數據B"; } }
我就簡單寫一個了,能獲取到下面的字符串也說明調用時可以的。
在用戶服務中,編寫config配置。
@Configuration public class ClientConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
開始調用啦
@RestController public class UserController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/getOrder") public String getOrderData(){ List<ServiceInstance> orderInfo = discoveryClient.getInstances("nacos-order"); if(null == orderInfo || orderInfo.isEmpty()) { return "用戶微服務沒有對應的實例可用"; } String targetUri = orderInfo.get(0).getUri().toString(); String forObject = restTemplate.getForObject(targetUri + "/getOrderData", String.class); System.out.println("forObject = " + forObject); return forObject; } }
就這樣,最簡單的調用也就可以實現了。(沒有任何負載均衡算法,我直接get(0)了)。
②.namespace
這里我們來看看什么是namespace,如果我們開發,測試環境共用一個nacos,必定我們的接口地址也是不同,而且你在開發過程中,也是不建議隨意配置測試環境的,這時我們就應該用namespace來隔離我們的空間。
打開我們的nacos的頁面,點擊命名空間,新建,輸入信息即可。
我們再來看一下代碼實現,如何實現隔離的。
首先在配置文件中添加namespace配置。namespace:命名空間ID
spring:
application:
name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 server: port: 8888
訂單服務的配置為開發環境,用戶服務配置為測試環境的,我們來運行一下代碼,理論上應該調用不通的,我們來看一下結果。
現實如此無法調用,也就做到了我們的隔離環境。如果不寫namespace,默認是public命名空間。
③.group
group分組,也是用來隔離的,打個比方啊,加入我們的用戶服務,訂單服務,倉儲服務和物流服務四個服務,訂單服務中有一個接口叫getData,倉儲服務中也有一個接口叫getData,我們的用戶服務只想調用到我們的訂單服務的getData,不想調用到倉儲服務的getData,這時我們可以用group分組來隔離。
我們來看一下配置吧。只需要加入group:分組名稱即可,nacos客戶端不需要任何設置,這里需要注意的是你的父類項目依賴,2.1.0.RELEASE版本是沒有group的,也無法設置group(反正我沒找到什么好辦法)。需要改配置為2.1.1.RELEASE
<!--spring cloud alibaba依賴--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
spring:
application:
name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 group: pay server: port: 8888
④.還有一個概念是service服務集群,什么意思呢?先上個圖。
就是什么呢,我們現在有兩組集群,一個是北京的訂單服務集群,一個是北京的用戶服務集群,還有一個上海的訂單服務集群,我們希望北京的用戶集群,優先去調用北京的訂單系統,上海的優先調用上海的集群服務。並不希望我們跨地區遠程調用(如果組內實在沒有服務了,也可以調用,但是優先考慮同一集群的)。配置文件如下所示
spring:
application:
name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 group: pay cluster-name: BJ-cluster server: port: 8888
⑤.再就是版本了,也是我知道的最后一個了,比如我們要進行灰度發布了,我們有100台服務集群,但是這次新功能很重要,不能一次性全部更新,我們選擇灰度發布,我們選出5台服務作為新版發布的,我們定義為V2,內部接口時不兼容的,所以我們只能要5台新用戶服務去調用5台訂單服務,原有的95台用戶服務還是繼續調用那95台訂單服務,我們定義為V1。
我們來看一下代碼配置
spring: application: name: nacos-order cloud: nacos: discovery: server-addr: 192.168.138.119:8848 namespace: 0610f97e-c25d-4f49-bfb8-b340e3584b82 group: namespace-one cluster-name: BJ-cluster metadata: version: v1 server: port: 8888
劇透一下,nacos是用map來進行隔離的,大致結構式Map<namespace,Map<group::serviceName,Service>>,也是我們為什么cluster-name和版本為什么做不到完全隔離,后面的源碼博客會說詳細說這個問題的。
總結:
這次我們主要說了nacos的使用,原理?原理還沒說,等到我們的源碼帶着說一下吧,不難,就是一個心跳的問題。nacos要知道namespace、group、cluster-name、版本主要是用來做什么的,什么時候我們該選擇什么。下次我們來說一下Ribbon,也就是我們服務直接調用的一個插件。
最進弄了一個公眾號,小菜技術,歡迎大家的加入