Nacos注册中心和服务发现

本文介绍了Nacos作为SpringCloud组件的功能,包括服务发现、配置管理、服务分级存储模型、NacosRule负载均衡以及环境隔离(命名空间)。通过示例展示了如何在SpringCloud应用中集成Nacos,实现服务注册、权重负载均衡以及不同环境间的隔离。
摘要由CSDN通过智能技术生成

Nacos注册中心

image-20240119150425660

01 认识和安装Nacos

Nacos比Eureka功能更为丰富,是SpringCloud中的一个组件,Nacos是阿里巴巴的产品,在国内更流行。

NACOS功能:服务发现(对标Eureka)、配置管理、服务管理

下载见:D:\zwx\weifuwu\nacos-server-1.4.1或者在官网

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

在nacos文件bin页面中cmd打开终端

image-20240119173211930

输入启动语句:startup.cmd -m standalone -m表示模式 standalone表示单机启动

image-20240119173156055

在浏览器输入上图中Console地址 http://10.0.4.94:8848/nacos/index.html 进行登录,初始账号密码均为nacos

image-20240119173015326

登录成功显示如下

image-20240119173441467

02 Nacos快速入门

服务注册到 Nacos

1.在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:

<dependency>    
	<groupId>com.alibaba.cloud</groupId>    
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>    
	<version>2.2.5.RELEASE</version>    
	<type>pom</type>    
	<scope>import</scope>
</dependency>

2.注释掉order-service和user-service中pom文件和yml文件中原有的eureka依赖和配置

3.在order-service和user-service的pom中添加nacos的客户端依赖

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

4.修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:

image-20240122085035126

5.启动并测试

image-20240122085100557

image-20240122092646687

03 Nacos服务分级存储模型

服务—>集群—>实例

image-20240122093133749

为什么要多加一个集群,地域划分

image-20240122093351886

没有配置集群之前,集群是DEFAULT

image-20240122093535831

配置服务集群

image-20240122101528913

image-20240122101850782

image-20240122102336141

小结

image-20240122102129914

04 NacosRule负载均衡

目的:要实现Orderservice远程调用userservice时,优先选择本地集群

先配置orderservice yml中集群

image-20240122103120997

得到结果如下image-20240122103148024

进入浏览器页面访问http://localhost:8080/order/101~6

但8081 8081 8082每个进行了两次sql查询,轮询的负载均衡方式,并没有采用优先同集群

image-20240122103359029

需要在order-service的yml中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务,在本地集群中随机选择实例

userservice: 
	ribbon:  
		NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

之后进入浏览器页面访问http://localhost:8080/order/101~6 结果如下

image-20240122104411109

8082也是HZ集群image-20240122104436694

image-20240122104635332

如果将8081,8082都关掉

image-20240122105149403

再进入浏览器页面访问http://localhost:8080/order/101~3 结果如下

也就是说NacosRule如果没有本地集群,也是会去找别的集群的

image-20240122105430065

但是在orderservice中会出现WARN

01-22 10:52:35:208 WARN 13980 — [nio-8080-exec-1] c.alibaba.cloud.nacos.ribbon.NacosRule : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId=‘10.0.4.94#8083#SH#DEFAULT_GROUP@@userservice’, ip=‘10.0.4.94’, port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName=‘SH’, serviceName=‘DEFAULT_GROUP@@userservice’, metadata={preserved.register.source=SPRING_CLOUD}}]

解释:一个跨集群访问发生了,你想访问的是HZ集群,但访问到的确定SH集群

image-20240122110049373

05 根据权重负载均衡

com.alibaba.cloud.nacos.ribbon.NacosRule 在集群中是随机。而同一集群中有些设备性能好,有些设备性能差,我们希望让性能好的机器承担更多的请求,因此需要根据权重负载均衡。

权重设置方式如下图(权重值 0~1)

image-20240122110547465

将8081端口权重调到0.1

image-20240122110851054

进入浏览器页面访问http://localhost:8080/order/101~6。对比同一集群 8081、8082中反应的情况

六次服务中有五次访问到8082,只有1次访问到8081。差不多就是这个样子!

image-20240122111120668

image-20240122111143537

若把8081权重从0.1调成0,则无论访问多少次,8081都不会被访问。

但权重0可用于版本升级。比如将8081权重调成0,再对8081停机做版本升级,升级完成后,再把8081权重调小点 放少数用户进来做测试看看行不行 若没什么问题则可扩大权重。(平滑升级,用户没有感知)

小结

image-20240122111929258

06 Nacos环境隔离

环境隔离 - namespace 命名空间

image-20240122112249893

namespace使用演示

image-20240122112730238

image-20240122112825860

在服务列表中也体现了命名空间如下图

image-20240122112904032

image-20240122112922703

怎么去修改一个服务的命名空间呢?比如我想修改一个服务的命名空间为dev

答:在yml中添加namespace

例如:修改order-service的application.yml,添加namespace

image-20240122140615072

然后重启orderservice,打开nacos管理页面,可以看到orderservice出现在命名空间dev中

image-20240122140750264

此时访问http://localhost:8080/order/101 失效, 因orderservice与userservice不在同一命名空间,无法从userservice中获取用户信息而导致访问

image-20240122141216768

代码报错如下

01-22 14:12:08:226 ERROR 25516 — [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for userservice] with root cause

image-20240122141309980

小结

image-20240122141504548

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值