HM-SpringCloud微服务系列1.6【Nacos注册中心】


1 认识和安装nacos

1-1 nacos介绍

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
官网:https://nacos.io/zh-cn/index.html
源码:https://github.com/alibaba/nacos/
SC: https://spring.io/projects/spring-cloud-alibaba

1-2 下载安装

安装包下载https://github.com/alibaba/nacos/releases
解压到任意非中文目录下即可

1-3 端口配置

1-4 启动


win环境下的nacos单机启动命令:startup.cmd -m standalone
(后续可能涉及集群启动)

1-5 访问



2 服务注册到nacos

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异在于:

  • 依赖不同
  • 服务地址不同

2-1 引入依赖

2-1-1 父工程

在cloud-demo父工程的pom文件中的中引入SpringCloudAlibaba的依赖:


    com.alibaba.cloud
    spring-cloud-alibaba-dependencies
    2.2.6.RELEASE
    pom
    import

2-1-2 客户端

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

记得注释掉eureka依赖


2-2 配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

记得注释掉eureka配置




2-3 启动微服务&登录nacos

注意:要startup.cmd -m standalone开启nacos服务,不然启动微服务时报错





启动成功后清空UserApplication和UserApplication服务的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
http://localhost:8080/order/104






3 服务分级存储模型

3-1 模型&调度问题




3-2 服务集群属性


给user-service配置集群,模拟跨集群部署微服务
首先再次复制一个user-service服务(将UserApplication复制为UserApplication3),并配置属性:
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH






3-3 同集群优先的负载均衡(根据集群负载均衡,集群负载均衡策略)

默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。
1)给order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称




此时,8080和8081 8082都在杭州集群,8083则在上海集群
清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103



可以看出OrderService在发起远程调用时并没有有限考虑同集群的实例(实际上依然采用的是之前设置的随机策略,默认是轮询负载均衡策略)

2)修改负载均衡规则
修改order-service的application.yml文件,修改负载均衡规则:

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


清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
依次访问
http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
http://localhost:8080/order/104



可以看出,8080-OrderService优先调用了同集群的实例(8081-UserApplication和8082-UserApplication2),且8081和8082之间是被随机调用的
停掉UserApplication & UserApplication2
依次访问订单101 102 103

老师演示:

本地实测:




警告信息:跨集群调用
想访问clusterName = HZ集群,实际访问clusterName='SH'集群

01-10 15:08:37:506  WARN 10592 --- [nio-8080-exec-3] c.alibaba.cloud.nacos.ribbon.NacosRule   : A cross-cluster call occurs,name = userservice, clusterName = HZ, instance = [Instance{instanceId='192.168.2.104#8083#SH#DEFAULT_GROUP@@userservice', ip='192.168.2.104', port=8083, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='SH', serviceName='DEFAULT_GROUP@@userservice', metadata={preserved.register.source=SPRING_CLOUD}}]

4 权重配置(根据权重负载均衡)

实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。
因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。


启动UserApplication & UserApplication2

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
在弹出的编辑窗口,修改权重:
注意:如果权重修改为0,则该实例永远不会被访问


此处假设8081是一台老机器性能较差,8082则是新机器性能较强,将8081的权重调低点(0.1,即8082:8081=10:1)


清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
浏览器访问101订单11次(后10次刷新即可)




将8081的权重调低至0

清空UserApplication & UserApplication2 & UserApplication3的控制台日志信息
浏览器访问101订单11次(可以发现8080一直都是在调用8082,8081一次也没被调用)

权重应用:系统版本升级可以实现平滑升级,用户体验友好,不影响系统正常使用;也可以做一部分用户内测等

5 环境隔离

环境隔离实质就是服务隔离

5-1 课件







5-2 实操











清空OrderApplication的控制台服务启动日志信息
访问http://localhost:8080/order/101


可以看出,环境隔离生效了

6 Nacos与Eureka的区别

6-1 nacos注册中心原理

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

6-2 临时实例与非临时实例

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

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

默认&常用:临时实例





idea停止OrderApplication服务


idea启动OrderApplication服务

6-3 Nacos与Eureka的异同

  • Nacos与eureka的共同点
    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别
    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式