SpringCloud Alibaba (二):Nacos 注册中心
什么是 Nacos?
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Nacos 的关键特性包括:
-
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
-
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
-
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos下载
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
-
64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
2.下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
从 Github 上下载源码方式
git clone https://github.com/alibaba/nacos.git cd nacos/ mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U ls -al distribution/target/ # change the $version to your actual path cd distribution/target/nacos-server-$version/nacos/bin
下载编译后压缩包方式
您可以从 最新稳定版本 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令:
cmd startup.cmd
或者双击startup.cmd运行文件。
4.访问nacos注册中心
访问地址(nacos默认启动端口为8848):nacos启动主机ip:8848/nacos
如: 在本机启动就是 localhost:8848/nacos
在SpringCloud Alibaba项目中使用Nacos
服务提供者
1.创建服务提供者,并导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>SpringCloudAlibaba</artifactId> <groupId>com.gofy.alibaba</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud-alibaba-provider8070</artifactId> <packaging>jar</packaging> <properties> <nacos-discovery.version>2.1.0.RELEASE</nacos-discovery.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- nacos服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${nacos-discovery.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.gofy.alibaba.Provider8070</mainClass> </configuration> </plugin> </plugins> </build> </project>
2.在application.yaml配置文件中添加配置
server:
port: 8070
spring:
application:
name: provider-8070 #服务名
cloud:
nacos:
discovery:
server-addr: 192.168.11.132:8848 # 启动nacos的主机ip:端口
# 暴露服务的端点
management:
endpoints:
web:
exposure:
include: "*"
@SpringBootApplication @EnableDiscoveryClient public class Provider8070 { public static void main(String[] args) { SpringApplication.run(Provider8070.class, args); } }
4.创建controller类
@RestController public class ProviderController { @GetMapping("/echo/{string}") public String echo(@PathVariable("string")String string){ return "Hello Nacos Discovery "+string; } }
服务消费者
1.创建服务消费者,并导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>SpringCloudAlibaba</artifactId> <groupId>com.gofy.alibaba</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud-alibaba-consumer8080</artifactId> <packaging>jar</packaging> <properties> <nacos-discovery.version>2.1.0.RELEASE</nacos-discovery.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- nacos服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${nacos-discovery.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.gofy.alibaba.Consumer8080</mainClass> </configuration> </plugin> </plugins> </build> </project>
2.在application.yaml配置文件中添加配置
server:
port: 8080
spring:
application:
name: consumer-8080 # 服务名
cloud:
nacos:
discovery:
server-addr: 192.168.11.132:8848 # 启动nacos的主机ip:端口
# 暴露服务端点
management:
endpoints:
web:
exposure:
include: "*"
@SpringBootApplication @EnableDiscoveryClient public class Consumer8080 { public static void main(String[] args) { SpringApplication.run(Consumer8080.class, args); } }
4.调用服务提供者,有俩种调用方法:RestTemplate 和 feign
创建配置类, 把RestTemplate加入容器中,方便注入
@Configuration public class ConsumerConfig { @Bean @LoadBalanced //nacos-discovery整合了ribbon,所以可以使用ribbon的负载均衡 public RestTemplate restTemplate(){ return new RestTemplate(); } }
创建controller
@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/echo/{string}") public String echo(@PathVariable("string")String string){ return restTemplate.getForObject("http://provider-8070/echo/"+string, String.class); } }
添加feign依赖
注意:因为spring-cloud-starter-alibaba-nacos-discovery
和spring-cloud-starter-openfeign
都带有archaius-core包,所以整合nacos-discovery和openfeign组件时,需要除去openfeign中的archaius-core包, 否则会有冲突而导致openfeign或nacos-discovery异常
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.0.RELEASE</version> <exclusions> <exclusion> <groupId>com.netflix.archaius</groupId> <artifactId>archaius-core</artifactId> </exclusion> </exclusions> </dependency>
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class Consumer8080 { public static void main(String[] args) { SpringApplication.run(Consumer8080.class, args); } }
创建对应服务的接口
@FeignClient(name = "provider-8070") //name对应要调用服务的服务名(spring.application.name) public interface EchoService { //对应调用服务controller里的方法 @GetMapping("/echo/{string}") String echo(@PathVariable("string")String string); }
创建controller
@RestController public class FeignController { @Autowired private EchoService echoService; @GetMapping("/feign/echo/{string}") public String echo(@PathVariable("string")String string){ return echoService.echo(string); } }
访问nacos注册中心
启动服务消费者和服务提供者后,可以在服务列表查看到已注册的服务
Nacos动态配置
Nacos 提供了一个简洁易用的UI帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
nacos注册中心添加配置
点击nacos注册中心配置列表右上角的加号添加配置, 把之前服务消费者application.yml文件里的配置移到nacos服务中心,添加完后删除服务消费者的application.yml文件
注意:配置内容不能有注释,否则会报错
服务添加配置
添加nacos动态配置的依赖
<nacos-config.version>2.1.0.RELEASE</nacos-config.version> <!-- nacos动态配置 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${nacos-config.version}</version> </dependency>
在consumer-8080服务创建 bootstrap.properties ,添加配置
spring.application.name=consumer-8080-config #服务中心上的服务配置文件名,不用加后缀 spring.cloud.nacos.config.server-addr=192.168.11.132:8848 #服务中心地址 spring.cloud.nacos.config.file-extension=yaml #服务中心上的服务配置文件格式
在controller类上添加 @RefreshScope 开启实时获取最新配置
@RefreshScope @RestController public class FeignController { @Autowired private EchoService echoService; @GetMapping("/feign/echo/{string}") public String echo(@PathVariable("string")String string){ return echoService.echo(string); } }