服务治理-Nacos

 Nacos下载:        mac下第一个 windows下的二个

下载地址:https://github.com/alibaba/nacos/releasesicon-default.png?t=M5H6https://github.com/alibaba/nacos/releases 

  1. 进入安装路径的bin目录,通过cmd命令行输入startup.cmd -m standalone即可启动

  2. 访问控制台现实的nacos管理页面,完成登录:用户名和密码:nacos

 


那么之前我们是用的Eureka进行的服务注册,现在使用Nacos进行相同的功能使用。

修改提供者和消费者中的依赖和配置文件。

① 在pom文件中引入nacos-discovery依赖,==注释掉eureka的依赖==  

<!--nacos注册中心客户端依赖-->
<dependency>    
    <groupId>com.alibaba.cloud</groupId>    
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

② 在application.yml中添加nacos地址,==注释掉eureka相关配置==  

spring:  
	cloud:    
		nacos:      
			discovery:        
				server-addr: localhost:8848 # 连接nacos注册中心

然后重启一下微服务,既然我们不使用Eureka了,那么Eureka的服务就不需要再启动了。

然后就可以进行访问测试了。 


服务分级存储 

这里的分级存储实际上就是增加的分类的类别,我们目前讨论的就只有微服务的区别,提供者和消费者,这里的分级存储又引入了服务集群的概念,一个服务可以有多个集群,这里就以地方作为分类类别,同一个服务可以在北京有一个服务集群,也可以在上海有一个服务集群。

服务调用尽可能选择本地集群的服务,跨集群(区域)调用延迟较高 。

① 将部分微服务配置到北京集群

 spring:  
     cloud:    
         nacos:      
             discovery:          
                 server-addr: localhost:8848         
                 cluster-name: BJ # 服务所在集群名称

② 新建1个user微服务配置到上海集群

 -Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

③ 启动三个服务,并访问注册中心观察

④ 修改order-service的负载均衡策略

Ribbon默认的策略并不能实现根据同集群优先来实现负载均衡,需要切换成Nacos中的一个NacosRule来实现。

 user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务  
   ribbon:
     NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

⑤ 访问测试

多访问几次消费者,就会发现,提供者中,会优先查询相同集群下的微服务,而不会跨域查询另一个集群下的微服务,除非本集群中所有的提供者都失效了,才会去访问非同一集群下的提供者

权重配置

nacos支持权重配置来控制不同实例的访问频率,权重越大则访问频率越高。0 <= 权重值 <= 1

 

临时节点

Nacos的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

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

验证:停止掉8082端口,实例会从列表删除

配置一个服务实例为永久实例:

 spring:   
     cloud:     
         nacos:       
             discovery:         
                 ephemeral: false # 设置为非临时实例
 -Dserver.port=8082 -Dspring.cloud.nacos.discovery.ephemeral=false

重启服务,查看Nacos服务列表,可以看到已经不是临时节点

 

临时和持久化的区别主要在健康检查失败后的表现,

==持久化实例健康检查失败后会被标记成不健康,而临时实例会直接从列表中被删除==

  • 对于临时实例,健康检查失败,则直接可以从列表中删除。这种特性就比较适合那些需要应对流量突增的场景,服务可以进行弹性扩容。当流量过去之后,服务停掉即可自动注销了。

  • 对于持久化实例,健康检查失败,会被标记成不健康状态。它的好处是运维可以实时看到实例的健康状态,便于后续的警告、扩容等一些列措施。


Nacos和Eureka的区别

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

模块NacosEureka说明
注册中心服务治理基本功能,负责服务中心化注册
配置中心Eureka需要配合Config实现配置中心,且不提供管理界面
动态刷新Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送
可用区AZ对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换
分组Nacos可用根据业务和环境进行分组管理
元数据提供服务标签数据,例如环境或服务标识
权重Nacos默认提供权重设置功能,调整承载流量压力
健康检查Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳
负载均衡均提供负责均衡策略
管理界面Nacos支持对服务在线管理,Eureka只是预览服务状态

 环境隔离:

 Nacos的环境隔离中有命名空间和分组的概念,那么不同的命名空间之间的服务是不能相互调用的。默认不配的话就是在public命名空间,DefaultGroup分组下。

不同环境之间隔离:

  • Namespace —> 不同环境

  • Group —> 不同项目 / 模块

  • Data Id —> 不同配置文件

 

第四步这里,除了可以添加命名空间,还可以添加分组,创建分组之后,在namespace之后配置分组即可:

spring:
  application:
    name: user-service
#  profiles:
#    active: test # 指定环境
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos 配置中心地址
        file-extension: yaml  # 文件扩展名
        namespace: f81a11fe-73f4-4dff-b70d-04009fa36710 # 指定namespace的id
        group: USER_GROUP # 指定组名

 

配置完成后,重启服务,服务注册信息就会跑到对应的命名空间下 。此时,两个不同命名空间中的微服务就不能再相互调用了。所以我们明白,要想让服务可以相互访问要放到相同的环境下。


Nacos配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用。

统一配置管理

在nacos中添加配置

① 点击配置列表,添加新的配置信息

 ② 然后在弹出的表单中,填写配置信息

==注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。==

从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此springboot引入了一种新的配置文件:bootstrap.yml文件,它会在application.yml之前被读取,而且其内容优先级高于application.yaml

① 引入nacos-config依赖

在微服务中,引入nacos-config的客户端依赖:

<!--nacos配置管理依赖-->
<dependency>
 	<groupId>com.alibaba.cloud</groupId>
 	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

② 添加bootstrap.yml

在微服务中添加一个bootstrap.yml文件,内容如下:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos 配置中心地址
        file-extension: yaml  # 文件扩展名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

${spring.application.name}.${spring.cloud.nacos.config.file-extension}作为文件==Data ID==,来读取nacos的配置。

③ 在代码中读取配置信息

在微服务中的使用到配置文件信息的地方添加业务逻辑,读取conf对象的相关配置

最后可以查看到读取到的配置信息,证明微服务的配置信息拉取成功。

 


配置热更新 

局部热更新:方式一,搭配@Value使用

使用@RefreshScope注解标注在使用配置信息的类上

 全局热更新:方式二,搭配@ConfigurationProperties使用

先使用@ConfigurationProperties注解将配置读取读取到一个对象上,然后在需要使用配置的类中注入配置对象

 

 


 多环境共享配置:

 

 这个图片中配置信息可以读到userservice-dev.yaml和userservice.yaml两个配置文件,问题来了!带后缀的和不带后缀的配置文件都读取到之后,使用哪个呢?万一代码中的application.yml中也有相同名称的配置信息,又该使用哪个呢?这里就涉及到优先级的问题:

当nacos、服务本地同时出现相同属性时,优先级有高低之分:

 

总结: 

 

 


Nacos集群搭建:

Nacos集群搭建使用到了nginx的负载均衡。

这里就需要配置多台Nacos服务,并且修改端口号,不能全是8848,要修改成不一样的,然后供nginx做负载均衡。

配置多台Nacos,

搭建步骤:

 

 

 1、搭建数据库,文件在nacos的conf文件中有

2、nacos的下载

在文章开头

3、配置nacos

 复制三份nacos到非中文目录下,然后:

在这个配置文件中添加集群的地址信息:这里就是后面那三个

 

配置配置文件中mysql的信息:

 

 

 

 

到这里,将所有注释都去掉之后,保存关闭,完成nacos集群配置。

仍然在application.properties中修改端口

 

4、启动三台nacos 因为是集群模式启动,默认就是这个模式,所以命令就输入下面的就可以了

startup.cmd 

 5、配置nginx反向代理和负载均衡

6、启动nginx    

然后访问localhost:80/nacos就能看到nacos的界面了

那么我们的JAVA代码中怎么配置呢?没那么麻烦,直接将原来的8848改成80就可以了

这样配置完成之后,再创建爱配置文件,配置文件的信息就会保存在mysql中的config_info表中,完成持久化。