SpringCloud 微服务全栈体系(三)

第五章 Nacos 注册中心

  • 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba 也推出了一个名为 Nacos 的注册中心。

一、认识和安装 Nacos

1. 认识 Nacos

  • Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

2. 安装 Nacos

2.1 Windows 安装
  • 开发阶段采用单机安装即可。
2.1.1 下载安装包
2.1.2 解压
  • 将这个包解压到任意非中文目录下,如图:

  • 目录说明:

    • bin:启动脚本
    • conf:配置文件
2.1.3.端口配置
  • Nacos 的默认端口是 8848,如果你电脑上的其它进程占用了 8848 端口,请先尝试关闭该进程。
  • 如果无法关闭占用 8848 端口的进程 ,也可以进入 nacos 的 conf 目录,修改配置文件中的端口:
  • 修改其中的内容:
2.1.4 启动
  • 启动非常简单,进入 bin 目录,结构如下:

  • 然后执行命令即可:

    • windows 命令:
    bash 复制代码
    startup.cmd -m standalone
  • 执行后的效果如图:

2.1.5 访问
2.2 Linux 安装
2.2.1 安装 JDK
  • Nacos 依赖于 JDK 运行,所以 Linux 上也需要安装 JDK 才行。

  • 上传 jdk 安装包:

  • 上传到某个目录,例如:/usr/local/

  • 然后解压缩:

sh 复制代码
tar -xvf jdk-8u144-linux-x64.tar.gz
  • 然后重命名为 java

  • 配置环境变量:

sh 复制代码
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
  • 设置环境变量:
sh 复制代码
source /etc/profile
2.2.2 上传安装包
  • 如图:
  • 上传到 Linux 服务器的某个目录,例如/usr/local/src目录下:
2.2.3 解压
  • 命令解压缩安装包:
sh 复制代码
tar -xvf nacos-server-1.4.1.tar.gz
  • 然后删除安装包:
sh 复制代码
rm -rf nacos-server-1.4.1.tar.gz
  • 目录中最终样式:
  • 目录内部:
2.2.4 端口配置
  • 与 windows 中类似
2.2.5 启动
  • 在 nacos/bin 目录中,输入命令启动 Nacos:
sh 复制代码
sh startup.sh -m standalone
2.3 Nacos 的依赖
  • 父工程:
xml 复制代码
<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>
  • 客户端:
xml 复制代码
<!-- nacos客户端依赖包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

二、服务注册到 nacos

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

1. 引入依赖

  • 在 cloud-demo 父工程的 pom 文件中的<dependencyManagement>中引入 SpringCloudAlibaba 的依赖:
xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
  • 然后在 user-service 和 order-service 中的 pom 文件中引入 nacos-discovery 依赖:
xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:不要忘了注释掉 eureka 的依赖。

2. 配置 nacos 地址

  • 在 user-service 和 order-service 的 application.yml 中添加 nacos 地址:
yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848

注意:不要忘了注释掉 eureka 的地址

3. 重启

  • 重启微服务后,登录 nacos 管理页面,可以看到微服务信息:

三、服务分级存储模型

  • 一个服务 可以有多个实例,例如我们的 user-service,可以有:

    • 127.0.0.1:8081
    • 127.0.0.1:8082
    • 127.0.0.1:8083
  • 假如这些实例分布于全国各地的不同机房,例如:

    • 127.0.0.1:8081,在上海机房
    • 127.0.0.1:8082,在上海机房
    • 127.0.0.1:8083,在杭州机房
  • Nacos 就将同一机房内的实例 划分为一个集群

  • 也就是说,user-service 是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:

  • 微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:
  • 杭州机房内的 order-service 应该优先访问同机房的 user-service。

1. 给 user-service 配置集群

  • 修改 user-service 的 application.yml 文件,添加集群配置:
yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称
  • 重启两个 user-service 实例后,我们可以在 nacos 控制台看到下面结果:
  • 我们再次复制一个 user-service 启动配置,添加属性:
sh 复制代码
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
  • 配置如图所示:
  • 启动 UserApplication3 后再次查看 nacos 控制台:

2. 同集群优先的负载均衡

  • 默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。

  • 因此 Nacos 中提供了一个NacosRule的实现,可以优先从同集群中挑选实例。

2.1 给 order-service 配置集群信息
  • 修改 order-service 的 application.yml 文件,添加集群配置:
yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称
2.2 修改负载均衡规则
  • 修改 order-service 的 application.yml 文件,修改负载均衡规则:
yaml 复制代码
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

四、权重配置

  • 实际部署中会出现这样的场景:

  • 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

  • 但默认情况下 NacosRule 是同集群内随机挑选,不会考虑机器的性能问题。

  • 因此,Nacos 提供了权重配置来控制访问频率,权重越大则访问频率越高。

  • 在 nacos 控制台,找到 user-service 的实例列表,点击编辑,即可修改权重:

  • 在弹出的编辑窗口,修改权重:

注意:如果权重修改为 0,则该实例永远不会被访问

五、环境隔离

  • Nacos 提供了 namespace 来实现环境隔离功能。

    • nacos 中可以有多个 namespace
    • namespace 下可以有 group、service 等
    • 不同 namespace 之间相互隔离,例如不同 namespace 的服务互相不可见

1. 创建 namespace

  • 默认情况下,所有 service、data、group 都在同一个 namespace,名为 public:
  • 我们可以点击页面新增按钮,添加一个 namespace:
  • 然后,填写表单:
  • 就能在页面看到一个新的 namespace:

2. 给微服务配置 namespace

  • 给微服务配置 namespace 只能通过修改配置来实现。

  • 例如,修改 order-service 的 application.yml 文件:

yaml 复制代码
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
  • 重启 order-service 后,访问控制台,可以看到下面的结果:


  • 此时访问 order-service,因为 namespace 不同,会导致找不到 userservice,控制台会报错:

六、Nacos 与 Eureka 的区别

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

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

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

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

yaml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例
  • Nacos 和 Eureka 整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
  • Nacos 与 eureka 的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos 与 Eureka 的区别

    • Nacos 支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos 集群默认采用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka 采用 AP 方式
相关推荐
sg_knight2 小时前
Ribbon负载均衡实战指南:7种策略选择与生产避坑
java·spring boot·spring·spring cloud·微服务·ribbon·负载均衡
书语时3 小时前
Spring @Autowired解析
java·后端·spring
HGW6894 小时前
为什么已经有 Nginx 了,还需要服务网关?
nginx·spring cloud·微服务·架构
迢迢星万里灬6 小时前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
java·spring boot·spring·mybatis·spring mvc·面试指南
肥仔哥哥19306 小时前
最新SpringBoot+SpringCloud+Nacos微服务框架分享
spring boot·spring cloud·微服务·nacos微服务·最新nacos微服务
面朝大海,春不暖,花不开7 小时前
Spring AI与Spring Modulith核心技术解析
人工智能·spring·flask
有梦想的攻城狮8 小时前
spring中的ImportSelector接口详解
java·后端·spring·接口·importselector
LUCIAZZZ9 小时前
Java设计模式基础问答
java·开发语言·jvm·spring boot·spring·设计模式
IsPrisoner9 小时前
Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)
开发语言·微服务·golang
KotlinKUG贵州10 小时前
Spring开发,从Kotlin开始
spring boot·spring·kotlin