上篇博文我們介紹了Nacos的基本概念以及進行了安裝,相信大家已經對Nacos有了基本認識,其實說白了Nacos就是分佈式註冊中心和分佈式配置中心的集合體。這篇博文我們介紹Nacos的第一個特性,服務的註冊與發現,也就是分佈式註冊中心的核心功能。
什麼是服務註冊與發現
服務註冊與發現是來自於微服務架構的產物。在傳統的架構系統中,服務的數量較少,一般使用靜態配置的方式實現服務信息的配置。而伴隨着微服務架構的發展,服務實例的數量和網絡地址都是動態變化的,此時對系統運維提出了巨大的挑戰。面對成百上千的服務實例,爲保障系統能夠正常的運行,必須需要有一箇中心化的組件來完成對各個服務的整合、管理等。服務提供者能夠通過註冊中心註冊服務,服務消費者通過註冊中心調用服務,完成整個請求調用。
在微服務架構中服務註冊與發現組件是必不可少的,常用的服務協調器有:Eureka、Zookeeper、Etcd,Consule等。相信大家對其中一些組件有一定的認識,甚至使用經驗。
服務註冊與發現的原理
服務註冊與發現是是針對於三大角色的:①:服務提供者 ②:服務消費者 ③:註冊中心
針對他們之間的關係描述就是服務的註冊與發現的運行原理:
1、各微服務在服務啓動的時候,服務提供者將服務的網絡地址(IP地址和端口),服務名稱,服務自身狀態以及訪問協議等信息註冊到註冊中心,註冊中心存儲該數據
2、服務消費者從註冊中心查詢到服務提供者的實例信息,並通過該地址調用服務提供者的接口
3、各個微服務與註冊中心通過一定的機制通信(例如心跳檢測機制),如果註冊中心與某微服務長時間無法通信,就會註銷該實例,即該服務對應的實例會被註冊中心剔除
4、微服務網絡地址發生變化(例如增加實例或IP變動等),會重新註冊到註冊中心,這樣,服務消費者就無需人工修改提供者的網絡地址了
如下圖所示:
瞭解了服務註冊與發現的原理,我們看一下nacos是如何實現的服務註冊與發現。
服務註冊
創建項目
我們先了解一下 Spring Cloud 應用如何接入 Nacos Discovery。
-
首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在nacos-discovery-provider8081 項目的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
-
使用 @EnableDiscoveryClient 註解開啓服務註冊與發現功能
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
-
完成以上配置後,編寫Controller
@RestController
public class HelloWorldController {
@GetMapping("/hello")
public String hello() {
return "hello Nacos Discovery";
}
}
5.啓動應用,支持 IDE 直接啓動和編譯打包後啓動。
- IDE直接啓動:找到 nacos-discovery-provider8081項目的主類
ProviderApplication
,執行 main 方法啓動應用。 - 打包編譯後啓動:在 nacos-discovery-provider8081 項目中執行
mvn clean package
將工程編譯打包,然後執行java -jar nacos-discovery-provider8081.jar
啓動應用。
驗證
驗證之前,我們需要啓動nacos服務,以及服務提供者,例如:
此時我們可以看到,nacos-discovery-provider已經成功註冊到nacos了。
Nacos管理頁面查看我們的服務
Nacos接口查詢服務
我也可以通過Nacos提供的接口的查詢服務。在瀏覽器中輸入此地址 http://127.0.0.1:8848/nacos/v1/ns/catalog/instances?serviceName=nacos-discovery-provider&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=
,並點擊跳轉,可以看到服務節點已經成功註冊到 Nacos Server。
通過管理頁面以及接口返回的信息,我們可以看到服務註冊中心保存了服務提供者的哪些相關信息。
服務發現
創建項目
-
首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在nacos-discovery-consumer8082 項目的 /src/main/resources/application.properties 配置文件中添加基本配置信息
server.port=8082 spring.application.name=nacos-discovery-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
-
使用 @EnableDiscoveryClient 註解開啓服務註冊與發現功能
@SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
-
完成以上配置後,編寫TestController。
@RestController
public class TestController {
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public String test() {
// 通過spring cloud common中的負載均衡接口選取服務提供節點實現接口調用
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");
String url = serviceInstance.getUri() + "/hello/" + "xiaoliang";
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
}
}
-
啓動應用,支持 IDE 直接啓動和編譯打包後啓動。
-
IDE直接啓動:找到 nacos-discovery-consumer8082 項目的主類
ConsumerApplication
,執行 main 方法啓動應用。 -
打包編譯後啓動:在 nacos-discovery-consumer8082 項目中執行
mvn clean package
將工程編譯打包,然後執行java -jar nacos-discovery-consumer8082.jar
啓動應用。
-
驗證
-
同上,在Nacos管理頁面同樣可以看到我們服務消費者,不再貼圖
-
在瀏覽器地址欄中輸入 http://127.0.0.1:8082/test,點擊跳轉,可以看到瀏覽器顯示了 nacos-discovery-provider8081 返回的消息 “Hello xiaoliang , Welcome to Nacos Discovery!!!”,證明服務已經生效。
總結
1、nacos實現服務的註冊與發現非常的簡單,只需要引入jar包,並配置nacos服務地址即可。
2、服務消費者調用服務提供者時,我們是通過LoadBalancerClient
接口來獲取的服務實例。下篇博文,我們解鎖多種服務調用的姿勢,並對服務的負載均衡進行深入的介紹。
代碼示例
本文示例讀者可以通過查看下面倉庫的中的nacos-discovery-provider8081
和nacos-discovery-consumer8082
項目:
如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!