Nacos注册中心
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打开终端
输入启动语句:startup.cmd -m standalone
-m表示模式 standalone表示单机启动
在浏览器输入上图中Console地址 http://10.0.4.94:8848/nacos/index.html 进行登录,初始账号密码均为nacos
登录成功显示如下
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地址:
5.启动并测试
03 Nacos服务分级存储模型
服务—>集群—>实例
为什么要多加一个集群,地域划分
没有配置集群之前,集群是DEFAULT
配置服务集群
小结
04 NacosRule负载均衡
目的:要实现Orderservice远程调用userservice时,优先选择本地集群
先配置orderservice yml中集群
得到结果如下
进入浏览器页面访问http://localhost:8080/order/101~6
但8081 8081 8082每个进行了两次sql查询,轮询的负载均衡方式,并没有采用优先同集群
需要在order-service的yml中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务,在本地集群中随机选择实例
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
之后进入浏览器页面访问http://localhost:8080/order/101~6 结果如下
8082也是HZ集群
如果将8081,8082都关掉
再进入浏览器页面访问http://localhost:8080/order/101~3 结果如下
也就是说NacosRule如果没有本地集群,也是会去找别的集群的
但是在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集群
05 根据权重负载均衡
com.alibaba.cloud.nacos.ribbon.NacosRule 在集群中是随机。而同一集群中有些设备性能好,有些设备性能差,我们希望让性能好的机器承担更多的请求,因此需要根据权重负载均衡。
权重设置方式如下图(权重值 0~1)
将8081端口权重调到0.1
进入浏览器页面访问http://localhost:8080/order/101~6。对比同一集群 8081、8082中反应的情况
六次服务中有五次访问到8082,只有1次访问到8081。差不多就是这个样子!
若把8081权重从0.1调成0,则无论访问多少次,8081都不会被访问。
但权重0可用于版本升级。比如将8081权重调成0,再对8081停机做版本升级,升级完成后,再把8081权重调小点 放少数用户进来做测试看看行不行 若没什么问题则可扩大权重。(平滑升级,用户没有感知)
小结
06 Nacos环境隔离
环境隔离 - namespace 命名空间
namespace使用演示
在服务列表中也体现了命名空间如下图
怎么去修改一个服务的命名空间呢?比如我想修改一个服务的命名空间为dev
答:在yml中添加namespace
例如:修改order-service的application.yml,添加namespace
然后重启orderservice,打开nacos管理页面,可以看到orderservice出现在命名空间dev中
此时访问http://localhost:8080/order/101 失效, 因orderservice与userservice不在同一命名空间,无法从userservice中获取用户信息而导致访问
代码报错如下
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
小结