集群架构
Nacos Server 多节点集群部署,并通过 Nginx 进行负载均衡。
Nacos 2.x 版本介绍
对比 1.x 版本,2.x 做了许多优化与调整。
- 底层
Nacos Client(业务服务节点)
与Nacos Server(Nacos 节点)
或 Nacos Server 与 Nacos Server 间的通信方式不仅仅在支持 HTTP,新增了 gRPC 通信方式。 - 因为使用了 gRPC 通信的方式,默认的 Nacos Server 节点启动时会占用更多的端口(摘自官网):
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 0 | 主端口,客户端、控制台及OpenAPI所使用的HTTP端口 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft请求服务端端口,用于处理服务端间的Raft相关请求 |
更多的特性可以查看官网,这里提到的这些都影响到我们后面配置 Nginx。
一、创建节点目录
资源有限,直接在 Windows 开发机上搭建了。不同操作系统,步骤都是一样的。使用的 Nacos 版本为 2.x 版本:v2.2.0
,并启动三个节点,主端口
分别为:8100、8200、8300。
注意这三个节点只是主端口,由于 2.x 的版本升级,三个节点完整的占用端口列表为:
- 8100(节点一的主端口:客户端、控制台及OpenAPI所使用的
HTTP端口
)- 9100 (Nacos Client 与 Nacos Server 进行 RPC 通信的端口)
- 9101(Nacos Server 与 Nacos Server 进行 RPC 通信的端口)
- 7100(处理服务端间的Raft相关请求的端口)
- 8200(节点二的主端口)
- 9200
- 9201
- 7200
- 8300(节点三的主端口)
- 9300
- 9301
- 7300
调用时使用的端口关系图如下:
二、配置持久化
解压 Nacos 的安装包后,进入 conf 目录:
我们采用 mysql 作为存储数据库
- 数据库中执行
mysql-schema.sql
- 修改
application.properties
文件中的数据库连接
因为使用的 v2.2.0
版本,还需要添加一下 application.properties
中的 JWT 密钥。
三、集群配置文件
conf 目录下的 cluster.conf
文件:
因为 Nacos 服务之间通过 Raft 算法保证一致性,所以 Nacos 部署的节点数最好设置为>=3 的奇数。
四、修改启动脚本
集群模式默认申请的 JVM 内存过大,修改为 512 m。
五、配置 Nginx 反向代理(重要)
将 Nacos 集群节点在 Nginx 的 nginx.conf
配置文件中配置反向代理,当客户端访问指定端口时,负载均衡轮询访问 Nacos 集群节点。(注意 upstream 中的名称不能含有下划线:_
)
# gRPC 反向代理
stream {
...
# Nacos cluster
upstream nacosClusterGrpc {
server 192.168.1.64:9100;
server 192.168.1.64:9200;
server 192.168.1.64:9300;
}
server {
listen 9000;
listen 9848;
proxy_pass nacosClusterGrpc;
}
...
}
# HTTP 反向代理
http {
...
# Nacos cluster
upstream nacosCluster {
server 192.168.1.64:8100;
server 192.168.1.64:8200;
server 192.168.1.64:8300;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_pass http://nacosCluster/;
}
}
...
}
分为两部分:
- HTTP:转发业务节点 HTTP 访问集群
- gRPC:转发业务节点 gRPC 访问集群
对于 Nacos Server 间相互访问就不需要配置代理了,因为集群配置文件中已经配置了主端口,+1000 则是 gRPC 端口,-1000 则是 Raft 端口。也就是说 Nacos Server 节点间只要配置了集群配置文件,就已经知道各自的存在了。
留下一个小问题:gRPC 的反向代理中需要:listen 9848; 本地测试时,业务服务节点会一直重试访问这个端口,具体原因还不清楚,所以先配置上。
访问:localhost:8000
,即可访问到某一个节点,并可以在Nacos 集群管理菜单
中查看到部署的三个 Nacos 节点。
六、业务服务中接入 Nacos 集群
在前两章中配的 goods-service 与 goods-service 的端口为:9100、9200,已经和当前的 Nacos Server 集群的端口冲突了。所以调整一下业务服务节点为:6100、6200,完整的配置文件如下:
# goods service
server:
port: 6100
logging:
level:
root: info
spring:
mvc:
path-match:
matching-strategy: ANT_PATH_MATCHER
application:
name: goods-service
cloud:
nacos:
# 服务治理
discovery:
# 业务服务集群名称
cluster-name: goods-service-cluster
# nacos 服务地址
server-addr: 127.0.0.1:8000
# 在 nacos 中的服务名,默认为 ${spring.application.name}
service: nacos-goods-service
# nacos 服务用户名与密码
username: nacos
password: nacos
# 负载权重值
weight: 1
# 命名空间与 Group,用于环境隔离(namespace 默认为 public)
namespace: 0298b122-a60d-47f5-9be3-9ea149f17185
group: DEFAULT_GROUP
# order service
server:
port: 6200
logging:
level:
root: info
spring:
mvc:
path-match:
matching-strategy: ANT_PATH_MATCHER
application:
name: order-service
cloud:
nacos:
# 服务治理
discovery:
# 业务服务集群名称
cluster-name: order-service-cluster
# nacos 服务地址
server-addr: 127.0.0.1:8000
# 在 nacos 中的服务名,默认为 ${spring.application.name}
service: nacos-order-service
# nacos 服务用户名与密码
username: nacos
password: nacos
# 负载权重值
weight: 1
# 命名空间与 Group,用于环境隔离(namespace 默认为 public)
namespace: 0298b122-a60d-47f5-9be3-9ea149f17185
group: DEFAULT_GROUP
启动两个业务服务节点后,访问 8000 端口,进入管控台:
业务服务成功注册到了集群中。并且,解锁一个新的配置项:
spring:
cloud:
nacos:
discovery:
# 业务服务集群名称
cluster-name: goods-service-cluster
仅是表示一下业务服务所属的集群名称,用于标识同类型业务节点所属的不同集群,不会影响到前面提到的 服务完整的 id 的构成
。比如我们在启动一个 order-service 节点,修改原有配置的端口与集群名称:
server:
port: 6210
spring:
cloud:
nacos:
discovery:
cluster-name: order-service-cluster2
service: nacos-order-service
group: DEFAULT_GROUP
启动后, 查看服务 id 构成为: 1. 命名空间:test 2. 服务名称:nacos-order-service 3. 分组名称:DEFAULT_GROUP
的服务详情: