一、Nacos Discovery簡介
為什么叫Nacos?
前四個字母分別為 Naming 和 Configuration 的前兩個字母,最后的 s 為 Service。所以組成 N A C O S。
是什么?
Nacos 是一個易於構建雲原生應用的動態服務發現,配置管理和服務管理平台。使用 Spring Cloud Alibaba Nacos Discovery,你可以基於 Spring Cloud 的編程模型快速訪問 Nacos 服務注冊功能。
-
Nacos:Dynamic Naming and Configuration Service。
-
Nacos:其實就是 Eureka 服務注冊中心 + Config 服務配置中心 + Bus消息總線的組合。
二、安裝並運行Nacos
去哪下載?
進入 Nacos 官網后,然后單擊 Release Note of V1.2.0 版本:
運行Nacos:
解壓 Nacos 安裝包成功后,找到自己下載 Nacos 服務的 bin 目錄,有個 startup.cmd 命令,鼠標雙擊啟動即可運行:
此時,一個標准的單機模式 Nacos 服務就啟動成功了,Nacos 默認 Tomcat 端口號為 8848。看到 8848 這個數字,不由自主的讓我想起很早以前打廣告牛逼的 8848 鈦金手機,吐槽一波!!!
如何驗證是否運行成功呢?
很簡單,命令運行成功后直接訪問http://localhost:8848/nacos/,進入到 Nacos 網站首頁管理界面,看到有 Nacos Logo 這個界面之后,就代表你的 Nacos 服務沒有任何問題了,這樣界面有點類似於平時我們做項目的后台管理頁面。
我使用的是 1.2.0 版本,不需要進入 Nacos 登錄頁面就可以進行使用。這時不管點哪個菜單都沒有數據顯示!
三、基於Nacos的服務提供者
創建gradle模塊provider-nacos並添加web、actuator監控與alibaba-nacos-discovery依賴
dependencies { compile group: 'org.springframework.boot', name: 'spring-boot-starter-web' compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator' compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE' }

server: port: 8081 spring: application: name: provider-nacos cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #指定Nacos服務地址 management: endpoints: web: exposure: include: '*'
注意:如果不想使用 Nacos 服務注冊和發現功能,則 properties 配置文件中設置 spring.cloud.nacos.discovery
為 false
。或者使用 yaml 格式:

spring:
cloud:
nacos:
discovery: false
啟動類添加@EnableDiscoveryClient注解,將Spring Boot應用程序注冊服務至 Nacos。

package org.wesson.cloudalibaba.nacos; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ProviderNacosApplication { public static void main(String[] args) { SpringApplication.run(ProviderNacosApplication.class, args); } }

package org.wesson.cloudalibaba.nacos.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/client") public class ProviderNacosController { @Value("${server.port}") private String serverPort; @GetMapping("/info") public String info() { return "hello, nacos registry center serverPort:" + serverPort; } }
Step1:上述已經成功啟動 Nacos 服務了
Step2:直接運行 provider-nacos 啟動類,端口為8081
Step3:先訪問http://localhost:8081/client/info,輸出結果如下:
-
hello, nacos registry center serverPort:8081
Step4:然后訪問http://localhost:8848/nacos,找到服務管理下的服務列表,就能夠看到一個服務名為 provider-nacos 的應用程序注冊至 Nacos 服務管理頁面了:
此時,Nacos 服務注冊中心 + 服務提供者構建成功了。
四、基於Nacos的服務消費者
1)build.gradle項目依賴
dependencies { compile group: 'org.springframework.boot', name: 'spring-boot-starter-web' compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator' compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.0.RELEASE' }

server: port: 8000 spring: application: name: consumer-nacos cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #指定Nacos服務地址 management: endpoints: web: exposure: include: '*' service-url: provider-nacos: http://provider-nacos #消費者將要去訪問的微服務名稱(注冊進Nacos的微服務提供者)
3)啟動類ConsumerNacosApplication.java
通過 Spring Cloud 原生注解 @EnableDiscoveryClient
開啟服務注冊發現功能。給 RestTemplate 實例添加 @LoadBalanced
注解,開啟 @LoadBalanced
與 Ribbon 的集成:

package org.wesson.cloudalibaba.nacos; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient @SpringBootApplication public class ConsumerNacosApplication { // 實例化一個RestTemplate Bean @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerNacosApplication.class, args); } }

package org.wesson.cloudalibaba.nacos.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/client") public class ConsumerNacosController { private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerNacosController.class); @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @Value("${service-url.provider-nacos}") private String consumerServiceUrl; @GetMapping("/info") public String info() { // getForObject方法 return restTemplate.getForObject(consumerServiceUrl + "/client/info", String.class); } @GetMapping("/log-info-instance") public void logInfo() { ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-nacos"); // 打印當前選擇的是哪個節點 ConsumerNacosController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort()); } }
5)測試
Step1:上述已經成功啟動 Nacos 服務了
Step2:運行 provider-nacos 啟動類2個實例,端口為8081、8082
Step3:運行 consumer-nacos 啟動類,端口為8000
Step4:多次訪問http://localhost:8000/client/info,返回結果如下:
-
hello, nacos registry center serverPort:8081
Step5:多次訪問http://localhost:8000/client/log-info-instance,控制台會打印如下日志信息:
6)為什么Nacos支持負載均衡?
因為阿里后面技術整合的非常好,Spring Cloud Alibaba 技術會吸收前面 Spring Cloud Netflix 技術的優點,所以天生默認自帶負載均衡功能。我們打開 IDEA 找到最右側 Gradle 依賴:
只要是使用過 Netflix Ribbon 都清楚,第一支持負載均衡(Load Balance),第二可以調用 RestTemplate,進行REST風格遠程調用。