java架構之路-(微服務專題)nacos叢集精講實戰
上次回顧:
上次部落格,我們主要說了微服務的發展歷程和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,也就是我們服務直接呼叫的一個外掛。
最進弄了一個公眾號,小菜技術,歡迎大家的加入