服务注册中心是微服务的核心组件之一,目前常见的服务注册中心包括Eureka(参考:Spring Cloud(一):服务注册中心Eureka),Zookeeper,Consul,CoreDNS,及 Nacos。

Nacos 介绍

Nacos 是阿里开源的一个服务注册与配置管理的实现,提供动态的服务发现、服务配置、服务元数据及流量管理等功能。项目地址: https://github.com/alibaba/nacos

Nacos的关键特性包括:

  • 服务发现与服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用原生 SDK、OpenAPI、或一个独立的 Agent TODO 注册服务后,服务消费者可以使用 DNS TODO 或 HTTP&API 来发现服务。
同时,Nacos 提供对服务的实时健康检查,阻止向不健康的服务实例发送请求。Nacos 支持传输层 (PING 或 TCP) 和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。

  • 动态配置服务

动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置使得配置更新时,服务不需要重启就能完成动态更新。配置的中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的控制台界面来管理所有的服务和应用的配置。Nacos 还提供了包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表。

  • 服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos 部署

下载:https://github.com/alibaba/nacos/releases , 目前最新版 1.4.0

单机模式

启动

windows 下:

1
nacos-1.3.2\bin\startup.cmd -m standalone

linux下:

1
nacos-1.3.2\bin\startup.sh -m standalone

单机模式适合在本地或开发测试环境中使用,如果是生产环境,则需要搭建集群模式或通过 k8s 部署来实现高可用。

集群模式

  1. 集群配置

将 nacos conf 目录下的 cluster.conf.example 文件重命名为 cluster.conf,添加集群节点:

1
2
3
4
5
#it is ip
#example
192.168.40.111:8848
192.168.40.112:8848
192.168.40.113:8848

需要配置3个或3个以上的 Nacos 节点才能构成集群。

  1. 数据源配置

使用 数据库脚本文件 创建 MySQL 数据库
在 conf 目录下的 application.properties 配置文件中配置数据源

1
2
3
4
5
6
7
8
9
10
11
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.40.113:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=nacos

生产环境可采用主备模式,或者高可用数据库。

  1. 启动服务器

在三台服务器节点上依次启动。

启动

1
sh startup.sh

关闭

1
sh shutdown.sh

可以结合使用 keepalived 来实现集群的访问,部署结构如图(因作者使用 k8s 部署,集群的具体部署实现这里不详述,可自行查阅 keepalived 相关资料)

nacos-cluster

k8s部署

Nacos 也可以以 StatefulSet 类型的控制器部署在 k8s 中,并且可借助 NFS 与 MySQL 来实现自动扩容缩容和数据持久化功能。如何在 k8s 中部署,我们后续再单独详细介绍。

Nacos 注册中心集成

在 Spring Cloud 中使用 Nacos,只需要简单的配置就可以完成服务的注册与发现。

  1. pom.xml 中添加依赖
1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. bootstrap.yaml 中添加配置:
1
2
3
4
5
6
7
8
9
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 此部分为动态配置服务相关
config:
server-addr: localhost:8848
file-extension: yaml
  1. 在启动类上添加 @EnableDiscoveryClient 注解。不加也没关系。

启动服务后,其它注册到 Nacos 的服务就可以通过 Feign 或 @LoadBalance 注解的 RestTemplate 来负载均衡地调用该服务接口了。

  1. 访问 Nacos 控制台

浏览器访问 http://localhost:8848/nacos ,账号密码默认为: nacos/nacos。

点击 服务管理/服务列表,即可看到已经注册的服务,如图

nacos-reg1

进入 服务详情,可对服务的元数据,服务下线、上线进行编辑控制,如图

nacos-reg2

对服务实例进行下线后,其它服务将不再往该服务实例发送请求(可能有数秒的延迟)。

  1. openAPI支持

服务注册:

1
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=192.168.40.234&port=8080'

服务发现:

1
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

其它注册中心了解

  • Eureka:Eureka 包含 Eureka Server 与 Eureka Client 两个端,Eureka Client 通过服务注册接口将微服务所在的 IP,端口,hostname,健康检查 url 等信息注册到 Eureka Server,其它微服务可通过服务发现接口从 Eureka Server 获取服务列表信息。Eureka Server 可以运行多个实例来构成集群,提供注册服务的高可用。Eureka Server 集群采用的是 Peer to Peer 去中心化的架构,每一个实例都是对等的,彼此通过相互注册与数据复制同步来提高可用性。从 CAP 原则的角度说,Eureka 遵循的是 AP,即 Eureka 保障可用性与分区容忍性,但不保障一致性。这样 Eureka Client 获取服务列表信息时,有可能存在不一致性,比如针对某个服务新增一个实例,在注册信息还未在各个 Eureka Server 之间完成同步时,有可能部分 Eureka Client 能获取该实例信息,部分获取不到。但这对服务间的交互影响并不大,因为服务调用最终是通过负载均衡从服务实例列表中选取一个进行的。 Eureka 的具体介绍可参考 Spring Cloud(一):服务注册中心Eureka

  • Zookeeper: Zookeeper 就是个分布式的协调服务,服务提供者通过在 Zookeeper 的某一路径上创建一个 znode 节点完成服务注册,该节点存储了服务的 IP,端口,调用方式等信息。服务消费者通过 Zookeeper 获取到相应服务的 IP 地址列表,通过负载均衡算法从 IP 地址列表中取一个进行服务调用。与 Eureka 不同, Zookeeper 集群采用 Master/Slave 架构,如果集群中的 Master 挂了,集群就要进行 Master 的选举,在此过程中是无法处理请求的。因此 Zookeeper 在 CAP 原则中遵循的是 CP,保证了强一致性与分区容忍性,但并不保证高可用。

  • Consul: Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 使用 Go 语言编写,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key/Value 存储、多数据中心方案等,Consul 不需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单。Consul 同样遵循 CAP 原理中的 CP 原则,保证了强一致性和分区容错性。但服务注册的时间会稍长一些,因为 Consul 的 Raft 协议要求必须过半数的节点都写入成功才认为注册成功。并且同样在 leader 挂掉了之后,重新选举出 leader 之前会导致 Consul 服务的不可用。

  • CoreDNS: CoreDNS 是目前 Kubernetes 默认的 DNS 方案,其目标是成为云原生环境下的 DNS 服务器和服务发现解决方案。CoreDNS 采用 Go 编写,区别于 kube-dns,CoreDNS 编译出来就是一个单独的二进制可执行文件,内置了 cache,backend storage ,health check 等功能,无需第三方组件来辅助实现其他功能,从而使得部署更方便,内存管理更为安全。

总结

Nacos 不仅能提供动态服务注册发现功能, 也能提供动态配置管理功能(不需要重启服务就能使配置生效)。从注册中心的功能角色来说,一致性要求并不太高,因此遵循 AP 的 Eureka 与 Nacos(Nacos 在服务注册中遵循 AP, 在配置管理中遵循 CP)更适合用于注册中心。但因为 Eureka 2.x Netflix 已经停止更新维护了,所以新项目可以使用 Nacos 来充当服务注册与配置管理的服务。

参考:https://nacos.io/zh-cn/docs/what-is-nacos.html

评论