目录
1.Nacos健康检查
1.1两种健康检查机制
Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务
Nacos中提供了两种健康检查机制:
客户端主动上报机制
- 客户端通过心跳上报方式告知服务端(Nacos注册中心)健康状态,默认新条件间隔5秒
- Nacos会在超过15秒未收到心跳后将实例设置为不健康状态,超过30秒将实例删除
服务器端反向探测机制
- Nacos主动探知客户端健康状态,默认间隔为20s
- 健康检查失败后实例会被标记为不健康,不会被立即删除
比如领导管理员⼯的⼯作1. 员工主动汇报: 员工每天主动汇报自己工作进度2. 领导主动问询: 领导每周向员工了解工作进度
Nacos中的健康检查机制不能主动设置,健康检查机制是和Nacos的服务实例类型强相关的
1.2Nacos服务实例类型
Nacos的服务实例(注册的节点)分为临时实例和非临时实例
- 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认类型。
- 非临时实例:如果实例宕机,不会从服务列表中剔除,也可以叫永久实例
对临时实例,采取的是客户端主动上报机制。
对非临时实例,采取服务器端反向探测机制。
配置一个服务实例为永久实例
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为⾮临时实例
停止服务, 再观察控制台:节点依然不会消失
1.3常见问题
Nacos服务实例类型不允许改变
设置服务实例类型,重新启动Nacos可能会报错
报错信息参考
原因:Nacos会记录每个服务实例的IP和端口号,当发现IP和端口都没有发生变化时,Nacos不允许一个服务实例类型发生变化,比如从临时实例变成非临时实例
解决办法:
1.停掉Nacos
2.删除Nacos目录下/data/protocol/raft信息,里面会保存应用实例的元数据信息
2.Nacos环境隔离
企业开发中,一个服务会分为开发环境,测试环境和生产环境
- 开发环境:开发人员用于开发的服务器,是最基础的环境.一般日志级别设置较低,可能会开启一些 调试信息。
- 测试环境:测试人员用来进行测试的服务器,是开发环境到生产环境的过渡环境.
- 生产环境:正式提供对外服务的环境,通常关掉调试信息
通常情况下,这几个环境不能互相通信
Nacos提供了namespace(命名空间)来实现环境的隔离.不同的namaspace的服务不可见.
2.1创建Namespace
默认情况下,所有的服务都在同一个namespace,名为public
新增命名空间
2.2配置namespace
namespace创建完成后,对服务进行配置
修改order-service的命名空间
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 0329e708-c889-45ab-820b-5271e8615ba7
2.2测试远程调用
1.启动服务,观察Nacos控制台
public命名空间下只有product-service服务
order-service在dev命名空间下
2.访问接口测试远程调用
发现服务报错:
3.Nacos配置中心
除了注册中心和负载均衡之外,Nacos还是一个配置中心,具备配置管理的功能
Namespace的常用场景之一是不同环境的配置区分隔离,例如开发测试生产环境的配置隔离
3.1为什么需要配置中心
当前项目的配置都在代码中,会存在以下问题:
- 配置文件修改时,服务需要重新部署,为服务架构中,一个服务可能有成百个实例,挨个部署比较麻烦且容易出错
- 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突
配置中心就是对这些配置项进行统⼀管理. 通过配置中心, 可以集中查看, 修改和删除配置, 无需再逐个修改配置文件. 提⾼效率的同时, 也降低了出错的风险.
1.服务启动时,从配置中心读取配置项的内容,进行初始化
2.配置项修改时,通知微服务,实现配置的更新加载
3.2快速上手
参考文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
3.2.1添加配置
在Nacos控制台添加配置项
注意: 配置管理的命名空间和服务列表的命名空间是隔离的, 两个是分别设置的. 默认是public也就是服务管理命名空间配置 ≠ 配置管理的命名空间
新建配置项
注意:
- Data ID设置为项目名称
- 配置内容的数据格式,目前只支持properties和yaml类型
- 设置配置内容
3.2.2获取配置
1.引入Nacos Config依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.配置bootstrap.properties
微服务启动前,需要先获取nacos中配置,并与application.yml配置合并,在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server的地址
spring.application.name=product-service
spring.cloud.nacos.config.server-addr=110.41.51.65:10020
或者使用bootstrap.yml
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:10020
spring.application.name需要和nacos配置管理的Data ID一致
spring.cloud.nacos.config.server-addr为Nacos Server的地址
3.编写程序
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 NacosController {
@Value("${nacos.config}")
private String nacosConfg;
@RequestMapping("/getConfig")
public String getConfig(){
return "从Nacos获取配置项nacos.config:"+nacosConfg;
}
}
@Value读取配置
@RefreshScope配置进行热更新
4.测试
启动程序访问接口:http://127.0.0.1:9090/getConfig
在Nacos控制台修改nacos.config
再次访问接口:
3.3配置中心详解
3.3.1设置命名空间
Nacos配置管理的命名空间和服务列表的命名空间是分别设置的,默认是public
Nacos命名空间配置依然在bootstrap.properties中进行配置
spring.cloud.nacos.config.namespace=51152a13-7911-49e3-bbdc-16fd5670a257
对应bootstrap.yml配置
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: b460e95c-d4b9-42a3-810f-cdf0051ce008 #配置中心的命名空间
value对应命名空间的ID,如下图所示:
如果设置命名空间后,项目启动时,会从该命名空间下找对应的配置项
重新访问接口,观察结果
3.3.2Data Id
Data Id格式介绍
在Nacos Spring Cloud中,dataId的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix默认为spring.application.name的值,可以通过配置项spring.cloud.nacos.config.prefix来配置
spring.profiles.active即为当前环境对应的profile.当spring.profiles.active 为空时,对应的连接符-也将不存在,datald的拼接格式变成${prefix}.${file- extension}
file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型.默认为properties
${spring.application.name}, ${spring.profiles.active} 等通过配置文件来指定时, 必须放在bootstrap.properties 文件中
在bootstrap.yml中添加spring.profiles.active值
spring:
profiles:
active: dev
启动服务,观察日志
4.Nacos和Eureka的区别
Nacos和Eureka都是服务注册与发现的工具,它们在微服务架构中扮演着重要的角色。然而,两者在多个方面存在显著的差异,以下是对这些差异的详细分析:
1. 功能范围
- Nacos:不仅提供了服务注册与发现的功能,还集成了配置管理、动态DNS服务等功能。它旨在帮助开发者构建弹性、高可用性的微服务架构。
- Eureka:主要关注于服务注册与发现,通过RESTful API实现服务实例的注册和发现,并具备自我保护机制。Eureka虽然不直接提供配置管理功能,但通常可以与其他配置中心(如Spring Cloud Config)配合使用。
2. 支持模式
- Nacos:支持CP(一致性)和AP(可用性)两种模式。它可以根据业务需求在一致性和可用性之间做出选择,当集群中存在非临时实例时,默认采用CP模式。
- Eureka:只支持AP模式,即更倾向于保证系统的可用性。当注册中心出现问题时,客户端仍然可以基于缓存中的信息进行服务调用。
3. 连接方式
- Nacos:使用Netty进行长连接通信,这意味着Nacos与服务之间保持持久的连接,能够更快地响应服务状态的变化。
- Eureka:使用短连接,客户端定时向注册中心发送心跳信息以维持连接。这种方式可能不如长连接响应迅速,但在某些场景下可能更为适合。
4. 健康检查
- Nacos:对临时实例采用心跳模式检测,对永久实例则采用主动请求来检测。这种机制能够更准确地判断实例的健康状态。
- Eureka:只支持基于HTTP的心跳模式健康检查,客户端定时向注册中心发送请求以表明自己仍然存活。
5. 服务发现
- Nacos:支持定时拉取和订阅推送两种模式。注册中心每次服务列表变化都会实时推送给订阅者,确保数据的及时性。
- Eureka:基于拉模式进行服务发现,客户端定时从注册中心拉取服务列表信息。这种方式可能导致数据存在一定的延迟。
6. 元数据管理
- Nacos:提供了丰富的元数据支持,包括服务分类、权重、健康状态等信息,有助于实现更细粒度的服务管理和路由策略。
- Eureka:元数据信息相对简单,主要包括服务名、IP地址和端口号等基本信息。
7. 部署和集成
- Nacos:部署相对复杂,但提供了统一的配置管理平台,可以集中管理各个应用程序的配置信息。它支持多种服务注册和发现方式,如DNS、HTTP和API等。
- Eureka:部署较为简单,与Spring Cloud深度集成,开箱即用。但配置管理功能较弱,通常需要与其他组件配合使用。
8. 维护和更新
- Nacos:仍在不断更新和维护中,提供了更多的功能和改进。
- Eureka:虽然曾经是Netflix微服务架构中的重要组件,但现在已经不再维护。这意味着在未来可能无法获得官方的技术支持和更新。
综上所述,Nacos和Eureka在功能范围、支持模式、连接方式、健康检查、服务发现、元数据管理、部署和集成以及维护和更新等方面都存在显著的差异。选择使用哪个工具取决于具体的业务需求和技术架构。对于需要更全面的服务治理和配置管理功能的场景,Nacos可能是一个更好的选择;而对于简单的服务注册与发现需求,Eureka则可能更为适合。