《Nacos终极指南:集群配置+负载均衡+健康检查+配置中心全解析,让微服务稳如老狗!》

在生产环境比较恶劣的情况下,我们需要通过负载均衡对服务的流量分散到多个服务器中,避免单点故障,而Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等。

1.服务下线

当一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线,等排查完故障后,我们在上线该节点

操作步骤:详情->下线

下线端口号为9091的接口后,当再进行访问订单服务后,发现通过IDEA日志发现该服务没有接收到请求

再次点击上线端口为9091的节点,接着多次访问订单服务,观察运行日志,发现端口号为9091的节点又可以重新接收请求

2.权重配置

2.1 权重配置

除了下线接口性能较差的节点之外,我们还可以配置这个节点的流量权重

操作步骤:找到对应的节点->编辑->在弹出的窗口修改权重值

2.2 开启Nacos的负载均衡策略

如果我们仅仅是在Nacos修改了权重配置,这样是不生效的。

因为Spring Cloud LoadBalance组件自身有负载均衡的配置方式,所以不支持Nacos的权重属性配置,我们需要开启Nacos的负载均衡策略,让权重配置生效

我们需要在服务消费者(订单服务)的配置文件中添加一下配置,如下图

修改完配置后记得重新启动服务,然后继续多次访问订单服务,此时观察日志发现端口号为9090的节点接收到的请求流量就会明显减少

2.3 常见问题

修改权重配置时,可能会出现下图的报错日志

原因:Nacos采用raft算法来计算Leader,并且会计算前一次启动的集群环境,当服务器的IP改变时会导致raft记录的集群地址失效,导致Leader出现问题(网络环境发生变化时,IP地址可能会发生变化)

解决方法:删除Nacos根目录下data文件中的protocol文件夹中的raft文件夹,如下图

3.同集群优先访问

Nacos把可以把同一个机房内的实例,划分为一个集群,所以同集群优先访问,在一定程度上也可以理解为同机房的实例优先访问

在微服务架构中,一个服务通常可以由多个实例共同提供服务,这些实例可以部署在不同的机器上,这些机器也可以分布在不同的机房,比如produc-service

实例1和实例2部署在上海机房,而实例3部署在北京机房

微服务访问时,应尽量访问同机房的实例,当本机房实例不可用时,才去访问其他机房的实例

比如order-service服务在上海机房,product-service在北京和上海都有实例,当使用订单服务时,希望优先访问上海机房,如果上海机房没有实力或者实例不可用,订单服务在去访问部署在上海机房的产品服务。

通常情况下,希望优先访问同一个机房间的服务,因为同一个机房属于一个局域网,局域网的访问速度更快一点

3.1 给实例配置集群名称

通过在添加一下配置来实现

注意:也要添加配置开启Nacos的负载均衡策略,如果之前添加过开启Nacos负载均衡策略的配置,这次就不用再次配置了

此时,就发现有一个product-service的实例是在名字为BJ的集群中的,而orders-service服务也是配置在BJ集群

此时,再去调用订单服务时,订单服务就会先优先访问与自己在同一个集群中的产品服务

此时,在将端口号为9091和9092的产品服务放在SH集群中

通过观察Nacos主页发现成功将端口号为9091和9092的产品服务放在SH集群中,当我们将部署在BJ集群的产品服务下线后,这时候再去调用订单服务时,此时订单服务访问的就是部署在SH集群中的产品服务

4.Nacos检查机制

Nacos作为注册中心,需要感知服务的健康状态,才能为服务消费者提供良好的服务,Nacos中提供了两种健康检查机制:

1.客户端主动上报机制:

1.服务注册方通过上传心跳的上报方式告知Nacos注册中心自己的健康状态,默认心跳的间隔为5秒

2.如果Nacos在15秒内没有接收到来自服务注册方的心跳,会将该服务的健康状态设置为不健康状态,如果Nacos没有接收心跳的时间间隔超过30秒,Nacos就会将该注册的服务删除。

2.服务端反向探测机制:

1.Nacos主动探知客户端的健康状态,默认间隔为20秒

2.健康检查失败后对应注册在Nacos的服务会被标记为不健康的状态,不会立即被删除

但是Nacos中的健康检查机制不能主动设置,健康检查机制是和Nacos的服务实例类型强相关的

4.1 Nacos服务类型实例

Nacos的服务实例(注册的服务)分为临时实例和非临时实例

临时实例:如果该注册的服务宕机超过一定时间,会从服务列表中删除,这是向Nacos注册服务时默认的实力类型

非临时实例:如果实例宕机,不会从服务列表中删除,也可以叫永久实例

Nacos对临时实例采取的是客户端主动上报机制,对非临时实例采取服务端反向探测机制

4.2 配置永久实例

只需要给注册的服务类型添加一下配置即可

重新启动服务,观察Nacos服务列表

去IDEA停止服务,再去观察Nacos服务列表,发现即使停止服务,注册在Nacos中的服务也不会从服务列表中删除

4.3 常见问题

Nacos服务实例类型是不允许改变的,此时如果直接增加上面的配置,重新启动该服务,就会包下图的错误

原因:因为Nacos会记录每个实例的IP和端口号,当发现IP和端口号都没有发生变化时,Nacos不允许服务类型发生变化,比如从临时实例变为非临时实例,或者从非临时实例变成临时实例

解决方法:

1,先停掉Nacos

2,删除nacos目录下的/data/protocol中的raft文件夹,raft文件夹里面会保存应用实例的元数据信息,注意如果你访问的是云服器上的Nacos,就去删云服务器上的raft文件夹,如果是本机上的Nacos,就去删除本机上的raft文件夹,路径都是一样的

5. Nacos环境隔离

在开发中,一个服务会分为开发环境,测试环境和生产环境,我们希望开发环境的服务只能访问开发环境中的服务,不能跨环境访问

Nacos中提供了namespace(命名空间)来实现环境的隔离,不同的namespace的服务之间不可相互访问

先在Nacos创建几个环境,如下图

新增命名空间

在服务列表页面就可以看到三个环境了

配置namespace

namespace创建完成后,对服务进行配置 ,如下图

重新启动服务,发现两个服务都被部署在了test的环境下

进行测试:发现服务调用成功

测试不同环境下能否访问成功:

public环境下只有product-service服务

dev环境下只有order-service

此时去访问订单服务,会出现下图的报错

通过实验证明,在Nacos中,不同环境下的服务是不可相互调用的。

6.Nacos配置中心

除了注册中心和负载均衡之外,Nacos还是一个配置中心,具备配置管理的功能

为什么需要配置中心呢?

我们当前的代码有一个问题,就是我们的配置都是写在代码里面的,当我们需要对配置进行修改时,就要对代码的配置文件进行修改,然后重新打包和上线,且一个微服务中可能有成百个实例,挨个部署容易出错

配置中心就是对这些配置项进行统一管理,通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提供效率的同时,也降低了出错的分险

6.1配置中心的工作流程

1.服务启动时,从配置中心读取配置项的内容,进行配置的初始化

2.当配置中心的配置项发生改变时,配置中心会通知微服务,实现配置的更新加载

6.2Nacos配置中心的快速上手

1.添加配置

在Nacos控制台中添加配置项

注意事项:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的,默认都是public,也就是服务列表的命名空间≠配置管理的命名空间

新建配置项

2.获取配置

1.在对应项目中的pom文件中引入下面的依赖

XML 复制代码
        <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.propertities配置文件

微服务启动前,需要先获取Nacos中的配置,并于application.yml配置合并,在微服务启动前,Nacos要求必须使用bootstrap.properties配置文件来配置Nacos Server地址

3.编写controller层代码

java 复制代码
@RefreshScope
@RestController
public class NacosController {

    @Value("${nacos.config}")
    private String config;

    @RequestMapping("/getConfig")
    public String getConfig(){
        return "从Nacos中获取配置信息nacos.config:"+config;
    }

}

4.测试接口

发现获取配置成功

此时,修改配置中心的配置,刷新发现此时也成功获取修改后的配置信息

3.常见问题

1.配置格式出现错误

此时访问接口时会出现下面的报错

此时如果重新启动服务则会出现下图的报错

2.未引入相关依赖

出现下图的报错

原因:bootstrap.properties是系统及的资源配置文件,用于程序执行更加早期配置信息读取,但是SpringCloud2020.*之后的版本把bootstrap禁用了,导致在读取文件时读取不到而报错,此时将bootstrap包重新导入进来进行了

6.3配置中心详解

1.设置命名空间

Nacos配置中心的命名空间和服务列表的命名空间是分别设置,默认都是public,Nacos命名空间的配置依然是在bootstrap.properties文件中进行配置

添加一下配置

重启服务,接着去获取Nacos配置中心的配置,此时就是从test环境下获取配置

2.Data Id详解

Data Id格式介绍

在Nacos Spring Cloud中,Data Id的完整格式如下:

{prefix}-{spring.profiles.active}.${file-extension}

信息介绍

1.prefix默认为spring.application.name的值

2.spring.profiles.active对应当前环境的profile,当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成{prefix}.{file-extension}

3.file-extension为配置内容的数据格式,现在只支持yaml和properties这两种格式

当微服务启动时,会从Nacos中读取读个配置文件,我们可以通过启动服务时的日志来观察

要想读取product-service.properties和product-service-test.properties里面的配置信息,需要在bootstrap配置文件中添加下面的配置

这三个配置文件的读取的优先级为:
product-service-test.properties>product-service.properties>product-service

实验证明

有这3个配置文件时,从Nacos中获取配置时

在Nacos中 product-service-test.properties配置

然后从Nacos中删除product-service.properties

相关推荐
蓝色天空的银码星4 小时前
SpringCloud微服务架构下的日志可观测解决方案(EFK搭建)
spring cloud·微服务·架构
IT_10245 小时前
springboot从零入门之接口测试!
java·开发语言·spring boot·后端·spring·lua
皮皮林5515 小时前
项目终于用上了 Spring 状态机,太优雅了!
spring
迢迢星万里灬6 小时前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
java·spring boot·spring·mybatis·spring mvc·面试指南
Hanson Huang8 小时前
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(2)——Prompt(提示词)
java·人工智能·spring·spring ai
.生产的驴9 小时前
SpringBoot 服务器监控 监控系统开销 获取服务器系统的信息用户信息 运行信息 保持稳定
服务器·spring boot·分布式·后端·spring·spring cloud·信息可视化
没有烦恼的猫猫10 小时前
有关Spring事务的传播机制
spring·事务
magic 24510 小时前
事务传播行为详解
spring
layman052811 小时前
Nginx 负载均衡、高可用及动静分离
运维·nginx·负载均衡