简介
Nacos 是 Alibaba 开发的用于微服务管理的平台,核心功能:服务注册与发现和集中配置管理。
Nacos: Naming 与 Configuration 的前两个字母的组合,最后的 s 代表 service 。从其命名也能看出其核心功能。
- - Nacos 作为服务注册发现组件,可以替换Spring Cloud 应用中传统的服务注册与发现组件,如:Eureka、Consul 等,支持服务的健康检查。
-
Nacos 作为服务配置中心,可以替换 Spring Cloud Config、Apollo(阿波罗的分布式配置中心) 等。
注册中心
虽然 Eureka Server 会被 Nacos 替换掉,但是我们仍可使用 Ribbon、OpenFeign 作为远程调用的基础组件。
微服务整合 nacos 服务发现:
-
spring-cloud-starter-alibaba-nacos-discovery 是 spring-cloud-alibaba-dependencies 子项目。所以它们的版本号都不需要我们手动维护,继承自父项目 dependencyManagement 中的定义。
-
spring-cloud-starter-alibaba-nacos-discovery 也默认包含了 spring-cloud-starter-netflix-ribbon ,不需要单独引入 ribbon 。 ribbion 和 openfeign 相关的负载均衡、远程服务调用组件在 nacos 下依然适用。
-
文件配置
- application.yml
spring:
application:
name: spring-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: public
username: nacos
password: nacos
pom文件
<dependency> <!-- 自动引入 Ribbon -->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
SpringBoot启动类加上 @EnableDiscoveryClient 注解,开启 Spring Cloud 的服务注册与发现功能。spring cloud alibaba 遵守 spring cloud 规范,因此 @EnableDiscoveryClient 注解能激活、启用 nacos 的服务发现功能。(新java版本可不加)
微服务 group 分组
Nacos 的微服务分组概念,有两层含义:
-
不同分组的微服务,彼此之间不能发现对方,也就不能进行远程服务调用。逻辑上,不同的分组意味着这是两个不同的独立项目。即微服务从配置中拉取到的注册表是微服务所在组的注册表。
-
将微服务分组,方便我们查看,以及方便配置管理分类。
默认分组是 default_group
spring:
cloud:
nacos:
discovery:
group: public_group
配置中心
Nacos 作为配置管理中心,实现的核心功能就是配置的统一管理。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
连接配置中心的配置信息『必须』写在 bootstrap.yml 配置文件中,而不是 application 配置文件中。bootstrap 优先级高于apllication。
如果想要实现动态刷新功能,那么在 @Value 所在的 @Component(@Controller、@Service、@Repository)上加上 @RefreshScope 即可实现动态刷新。
服务注册与发现的原理
原理
Nacos服务注册中心在服务注册时会维护服务实例的信息,例如IP地址、端口号、服务名等,并把这些信息存储在Nacos中。服务消费方在需要调用服务时,可以向Nacos请求服务的实例信息。Nacos在收到服务消费方的请求后,会从服务注册中心中查询可用的服务实例,并返回给服务消费方。
心跳机制
临时实例每5s向nacos注册中心发一个心跳包,nacos注册中心连续15s收不到心跳包,就认为服务不健康,如果再过15s还没有收到,如果是临时实例就会剔除掉服务。