SpringCloudAlibaba - Nacos (2) 集群搭建

集群架构

Nacos集群架构图

Nacos Server 多节点集群部署,并通过 Nginx 进行负载均衡。

Nacos 2.x 版本介绍

对比 1.x 版本,2.x 做了许多优化与调整。

  1. 底层 Nacos Client(业务服务节点)Nacos Server(Nacos 节点) 或 Nacos Server 与 Nacos Server 间的通信方式不仅仅在支持 HTTP,新增了 gRPC 通信方式。
  2. 因为使用了 gRPC 通信的方式,默认的 Nacos Server 节点启动时会占用更多的端口(摘自官网):
端口与主端口的偏移量描述
88480主端口,客户端、控制台及OpenAPI所使用的HTTP端口
98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC请求服务端端口,用于服务间同步等
7848-1000Jraft请求服务端端口,用于处理服务端间的Raft相关请求

更多的特性可以查看官网,这里提到的这些都影响到我们后面配置 Nginx。

一、创建节点目录

资源有限,直接在 Windows 开发机上搭建了。不同操作系统,步骤都是一样的。使用的 Nacos 版本为 2.x 版本:v2.2.0,并启动三个节点,主端口分别为:8100、8200、8300。

Nacos集群安装目录
注意这三个节点只是主端口,由于 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

调用时使用的端口关系图如下:
Nacos2.x版本端口关系图

二、配置持久化

解压 Nacos 的安装包后,进入 conf 目录:
nacos conf 目录
我们采用 mysql 作为存储数据库

  1. 数据库中执行 mysql-schema.sql
  2. 修改 application.properties 文件中的数据库连接

Nacos集群-application.properties-1
因为使用的 v2.2.0 版本,还需要添加一下 application.properties 中的 JWT 密钥。
Nacos集群-application.properties-2

三、集群配置文件

conf 目录下的 cluster.conf 文件:

Nacos集群-cluster.conf
因为 Nacos 服务之间通过 Raft 算法保证一致性,所以 Nacos 部署的节点数最好设置为>=3 的奇数。

四、修改启动脚本

Nacos集群修改启动脚本
集群模式默认申请的 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/;
		}
	}
	
	...
}

分为两部分:

  1. HTTP:转发业务节点 HTTP 访问集群
  2. gRPC:转发业务节点 gRPC 访问集群

对于 Nacos Server 间相互访问就不需要配置代理了,因为集群配置文件中已经配置了主端口,+1000 则是 gRPC 端口,-1000 则是 Raft 端口。也就是说 Nacos Server 节点间只要配置了集群配置文件,就已经知道各自的存在了。

留下一个小问题:gRPC 的反向代理中需要:listen 9848; 本地测试时,业务服务节点会一直重试访问这个端口,具体原因还不清楚,所以先配置上。

访问:localhost:8000,即可访问到某一个节点,并可以在Nacos 集群管理菜单中查看到部署的三个 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 端口,进入管控台:

业务服务中接入 Nacos 集群-1
业务服务成功注册到了集群中。并且,解锁一个新的配置项:

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 的服务详情:

Nacos相同服务下的不同集群-1

Nacos相同服务下的不同集群-2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值