Nacos学习:一、Nacos注册中心

你的名字 2023-10-04 20:31 128阅读 0赞

Nacos

1. Nacos注册中心

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

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构的服务基础设施。

服务发现产品对比:

目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。

































































































比较项 Nacos Eureka Consul Zookeeper
一致性协议 支持AP和CP模型 AP模型 CP模型 CP模型
健康检查 TCP/HTTP/MYSQL/ClientBeat ClientBeat TCP/HTTP/gRPC/Cmd KeepAlive
负载均衡策略 权重/metadata/Selector Ribbon Fabio
雪崩保护
自动注销实例 支持 支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS TCP
监听支持 支持 支持 支持 支持
多数据中心 支持 支持 支持 不支持
跨注册中心同步 支持 不支持 支持 不支持
SpringCloud集成 支持 支持 支持 不支持
Dubbo集成 支持 不支持 不支持 支持
k8s集成 支持 不支持 支持 不支持

1.1 安装nacos

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

1.1.1 windows安装

开发阶段采用单机安装即可

第一步:下载安装包

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

中文官方网站: https://nacos.io/zh-cn/

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

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

具体搭建那个版本的Nacos,最好根据需要整合的SpringCloud版本来决定。
在这里插入图片描述

如图:

在这里插入图片描述

本课程采用SpringCloud Alibaba版本是2.2.7.RELEASE,所以选择的Nacos版本是2.0.3

第二步:解压

在这里插入图片描述

将这个包解压到任意非中文目录下,如图:
在这里插入图片描述

目录说明:

  • bin:启动脚本
  • conf:配置文件
1.1.2 端口配置

Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

在这里插入图片描述

修改其中的内容:
在这里插入图片描述

1.1.3 启动

启动非常简单,进入bin目录,结构如下:

在这里插入图片描述

然后执行命令即可:

  • windows命令:

    1. startup.cmd -m standalone

执行后的效果如图:

在这里插入图片描述

1.1.4 访问

在浏览器输入地址:http://127.0.0.1:8848/nacos即可:
在这里插入图片描述

默认的账号和密码都是nacos,进入后:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmceAj3I-1675155259661)(assets/image-20220918163241291.png)\]

1.2 服务注册到nacos

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

主要差异在于:

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

第一步: 引入依赖

在shop-parent父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  5. <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
  6. <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
  7. </properties>
  8. <dependencyManagement>
  9. <dependencies>
  10. <!--spring-cloud版本-->
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-dependencies</artifactId>
  14. <version>${spring-cloud.version}</version>
  15. <type>pom</type>
  16. <scope>import</scope>
  17. </dependency>
  18. <!--spring-cloud-alibaba-->
  19. <dependency>
  20. <groupId>com.alibaba.cloud</groupId>
  21. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  22. <version>${spring-cloud-alibaba.version}</version>
  23. <type>pom</type>
  24. <scope>import</scope>
  25. </dependency>
  26. </dependencies>
  27. </dependencyManagement>

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

  1. <!--nacos-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

注意

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

第二步:配置nacos地址

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

  1. spring:
  2. cloud:
  3. nacos:
  4. server-addr: localhost:8848

注意

不要忘了注释掉eureka的地址

第三步:重启

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

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfU794rP-1675155259662)(assets/image-20220918172739367.png)\]

1.3 服务分级存储模型

Nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满 足服务在所有场景下的数据存储和管理。

Nacos服务分级存储模型

  • 一级是服务,例如userservice
  • 二级是集群,例如北京或上海
  • 三级是实例,例如上海机房的某台部署了userservice的服务器

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

  • 127.0.0.1:7777
  • 127.0.0.1:7778
  • 127.0.0.1:7779

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

  • 127.0.0.1:7777 上海机房
  • 127.0.0.1:7778 上海机房
  • 127.0.0.1:7779 北京机房

Nacos就将同一机房内的实例 划分为一个集群

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

在这里插入图片描述

服务

对外提供的软件功能,通过网络访问预定义的接口。

服务名

服务提供的标识,通过该标识可以唯一确定要访问的服务。

实例

提供一个或多个服务的具有可访问网络地址(IP:Port)的进程,启动一个服务,就产生了一个服务实例。

元信息

Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标 签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

集群

服务实例的集合,服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同 集群下的实例才能相互感知。

通过数据模型可知:

应用通过Namespace、Service、Cluster(DEFAULT)的配置,描述了该服务向哪个环境(如开发环境)的哪个集群 注册实例。

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72vVoysN-1675155259665)(assets/image-20210713232658928.png)\]

杭州机房内的order-service应该优先访问同机房的user-service。

1.3.1 给user-service配置集群

修改shop-user的application.yml文件,添加集群配置:

  1. server:
  2. port: 7777
  3. spring:
  4. application:
  5. name: userservice
  6. cloud:
  7. nacos:
  8. server-addr: localhost:8848
  9. discovery:
  10. cluster-name: SH

重启两个user-service实例后,我们可以在nacos控制台看到下面结果:

在这里插入图片描述

我们再次复制一个shop-user启动配置,添加属性:
在这里插入图片描述

  1. -Dserver.port=7779 -Dspring.cloud.nacos.discovery.cluster-name=BJ

在这里插入图片描述

启动7779后再次查看nacos控制台:

在这里插入图片描述

1.3.2 同集群优先的负载均衡

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

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

1)给shop-order配置集群信息

修改shop-order的application.yml文件,添加集群配置:

  1. spring:
  2. application:
  3. name: orderservice
  4. cloud:
  5. nacos:
  6. server-addr: localhost:8848
  7. discovery:
  8. cluster-name: SH # 集群名称

2)修改负载均衡规则

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

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

通过测试,我们发现.我们请求的大部分是SH集群中的7777和7778节点.

NacosRule负载均衡策略

  • 优先选择同集群服务实例列表
  • 本地集群找不到提供者,才去其它集群寻找,并且会报警告
  • 确定了可用实例列表后,再采用随机负载均衡挑选实例

1.4 权重配置

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

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

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

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

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PWoWP6G-1675155259673)(assets/image-20220929174432831.png)\]

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

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6apmmV3v-1675155259674)(assets/image-20220929175849367.png)\]

注意:

如果在修改权重时报如下错误:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rrng2Jyk-1675155259675)(assets/image-20220929180010488.png)\]

原因:

Nacos 采用 raft 算法来计算 Leader,并且会记录前一次启动的集群地址,所以当我们自己的服务器 IP 改变时,会导致 raft 记录的集群地址失效,导致选 Leader 出现问题

解决方案:

只要删除 Nacos 根目录下 data 文件夹下的 protocol 文件夹即可

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tQ3XfbQO-1675155259677)(assets/image-20220929180135896.png)\]

nacos权限控制:

  • Nacos控制台可以设置实例的权重值,0~1之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为0则完全不会被访问

1.5 环境隔离

Nacos提供了namespace来实现环境隔离功能。**命名空间(Namespace)**用于进行租户粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试 ,环境和生产环境的资源(如配置、服务)隔离等。

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

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NR6RcD4d-1675155259677)(assets/image-20210714000101516.png)\]

1.5.1 创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMVffDO5-1675155259678)(assets/image-20220930215919668.png)\]

我们可以点击页面新增按钮,添加一个namespace:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNCj9axR-1675155259678)(assets/image-20220930215952888.png)\]

然后,填写表单:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUV9ZD2Z-1675155259679)(assets/image-20220930220120535.png)\]

就能在页面看到一个新的namespace:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EDBCS45Z-1675155259679)(assets/image-20220930220149619.png)\]

1.5.2 给微服务配置namespace

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

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

  1. spring:
  2. cloud:
  3. nacos:
  4. server-addr: localhost:8848
  5. discovery:
  6. cluster-name: SH # 集群名称
  7. #命名空间
  8. namespace: fcf3b542-db87-49c6-84dd-dc1dbfbfb9cd

重启shop-order后,访问控制台,可以看到下面的结果:

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xH2eJqqK-1675155259680)(assets/image-20220930220512824.png)\]

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

在这里插入图片描述

Nacos环境隔离

  • 每个namespace都有唯一id
  • 服务设置namespace时要写id而不是名称
  • 不同namespace下的服务互相不可见

1.6 Nacos细节

1.6.1 Nacos服务实例分类

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

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

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

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. ephemeral: false # 设置为非临时实例

我们把shop-order设置为永久实例, 然后我们把shop-order宕机, 此时我们发现nacos管理页面并没有把shop-order实例剔除:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ehrMdZNl-1675155259681)(assets/image-20220930222846110.png)]

1.6.2 Nacos的注册中心模型

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

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kEahEYnb-1675155259682)(assets/image-20220930223047073.png)\]

  • Nacos与eureka的共同点

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

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

发表评论

表情:
评论列表 (有 0 条评论,128人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nacos 注册中心

    现如今市面上注册中心的轮子很多,我实际使用过的就有三款:Eureka、Gsched、Nacos,由于当前参与 Nacos 集群的维护和开发工作,期间也参与了 Nacos 社区的