Nacos 提供了一組簡單易用的特性集,可快速實現動態服務發現、服務配置、服務元數據及流量管理。
更敏捷和容易地構建、交付和管理微服務平台。
關鍵特性:
服務發現和服務健康監測
動態配置服務
動態 DNS 服務
服務及其元數據管理
1.啟動服務
下載 地址
解壓
雙擊 startup.cmd

2.服務端provider
(1)添加依賴
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.1.RELEASE</nacos.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)添加配置
server.port=8010 spring.application.name=service-provider spring.cloud.nacos.discovery.enabled=true spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.service=${spring.application.name} management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always
(3)測試方法
package com.xyz.provider1.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class demoController { @RequestMapping("/hello") public String Hello(){ return "hello, provider"; } }
再添加provider1,端口8011,測試方法輸出
"hello,another provider"
3.客戶端customer
(1)添加依賴
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.1.RELEASE</nacos.version>
<spring-cloud.version>Greenwich.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)添加配置
server.port=8015 spring.application.name=service-comsumer management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always spring.cloud.nacos.discovery.enabled=true spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.service=${spring.application.name} #service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.file-extension=properties
(3)測試方法
package com.xyz.comsumer.controller; 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.discovery.DiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RefreshScope @RestController public class HelloController { @Autowired private LoadBalancerClient loadBalancer; @Autowired private DiscoveryClient discoveryClient; private String serviceName = "service-provider"; /** * 獲取所有服務 */ @RequestMapping("/services") public Object services() { return discoveryClient.getInstances(serviceName); } /** * 從所有服務中選擇一個服務(輪詢) */ @RequestMapping("/discover") public Object discover() { return loadBalancer.choose(serviceName).getUri().toString(); } @RequestMapping("/hello") public String hello() { ServiceInstance serviceInstance = loadBalancer.choose(serviceName); String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class); callServiceResult += ",throw service"; return callServiceResult; } }
4.網關Zuul
(1)添加依賴
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.1.RELEASE</nacos.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
(2)添加配置
server.port=8090 spring.application.name=service-zuul spring.cloud.nacos.discovery.enabled=true spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.service=${spring.application.name} management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always zuul.routes.api.path=/api/** zuul.routes.api.serviceId=service-provider
(3)啟動類
package com.xyz.zuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy @SpringBootApplication public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
4.測試
啟動provider,provider1,customer
http://localhost:8848/nacos/ ,用戶名nacos,密碼nacos

http://localhost:8090/api/hello
交替返回
hello,provider或hello,another provider
5.修改客戶端,添加統一配置
(1)修改添加依賴
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.1.RELEASE</nacos.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2)修改配置 application.properties
server.port=8015 spring.application.name=service-comsumer management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always spring.cloud.nacos.discovery.enabled=true spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.service=${spring.application.name} spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.file-extension=properties
(3)測試方法
添加注解@RefreshScope,開啟配置的動態更新
package com.xyz.comsumer.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RefreshScope @RestController public class HelloController { @Value("${hello-string}") private String helloString; @RequestMapping("/configTest") public String configTest() { return helloString; } }
登錄http://localhost:8848/nacos
添加配置service-comsumer.properties
hello-string=customer

重新啟動customer
http://localhost:8015/configTest
輸出
customer
修改配置發布后,再次請求,會輸出新設定的值
注:
使用nacos服務配置,如果resource下,帶有bootstrap.properties,且配置寫入application.properties,這時會報錯
***************************
APPLICATION FAILED TO START
***************************
Description:
Application failed to connect to Nacos server: ""
Action:
Please check your Nacos server config
解決方法:將bootstrap.properties刪掉,或將配置寫入bootstrap.properties
原因:可以查看下他們的區別 查看
