5. 服务注册发现
引入jar:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
bootstrap.yml增加以下配置:
spring: cloud: nacos: discovery: server-addr: ip:prot #nacos的地址
工程启动类添加以下注解:
- @EnableDiscoveryClient
6.生产部署方案
6.1 说明
生产环境中部署nacos首先肯定是使用集群模式cluster保证高可用,本文主要详细介绍最佳的集群方案怎样搭建,然后spring cloud程序怎样集成。
6.2 集群方案
下图是官方推荐的集群方案,通过域名 + VIP模式的方式来实现,可读性好,而切换ip方便:
这里的VIP直接使用 Nginx就可以实现了
6.3 方案实现
nacos集群最低配置是至少需要3个实例,因为我在本地搭建只有一台机器所以通过修改端口的方式来部署这3个实例,端口分别为:8848、8849、8850
6.3.1 修改集群配置
nacos的conf目录下有配置文件cluster.conf,请每行配置成ip:port。
- 192.168.28.130:8848
- 192.168.28.130:884
- 192.168.28.130:8850
192.168.28.130是我本机ip,三个nacos实例都配置一样即可
6.3.2 配置 MySQL 数据库
集群模式必须使用MySQL数据库,生产使用建议至少主备模式,或者采用高可用数据库
1.初始化 MySQL 数据库
脚本在nacos的conf目录下有配置文件nacos-mysql.sql,直接执行即可
2.修改 application.properties 添加数据库配置
配置文件在nacos的conf目录下,添加以下配置
db.num=1 db.url.0=jdbc:mysql://192.168.28.131:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
db.num 为数据库实例数量
如果有多个数据库实例通过 db.url.0、db.url.1… 指定不同的数据库链接
3. 其他实例修改Nacos端口
- 修改nacos的conf目录下application.properties下的server.port变量,三个实例分别为:
8848、8849、8850
如果是不同机器部署集群的话这步可以忽略
4. 启动Nacos集群:
- 分别把3个实例都启动起来,执行nacos的bin目录下startup.sh,该启动文件默认就是集群模式
5. 修改Nginx配置:
修改conf/nginx.conf配置
upstream nacos { server 192.168.28.130:8848; server 192.168.28.130:8849; server 192.168.28.130:8850; } server { listen 80; server_name test.nacos.com; location / { proxy_pass http://nacos; } }
配置域名test.nacos.com绑定VIP
6. 程序集成Nacos集群
nacos的地址server-addr配置域名test.nacos.com
6.4 Nacos集群管理
参考资料:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
7.通过Nginx来实现环境隔离
7.1 原理说明
基于 Nacos 去隔离多个物理集群的,同时,在 Nacos 客户端不需要做任何代码改动的情况下,就可以实现环境的自动路由。
开始前,我们先做一些约束:
- 一台机器上部署的应用都在一个环境内;
- 一个应用进程内默认情况下只连一个环境的 Nacos;
- 通过某种手段可以拿到客户端所在机器 IP;
- 用户对机器的网段有规划;
基本原理是:
- 网络中 32 位的 IPV4 可以划分为很多网段,如192.168.1.0/24,并且一般中大型的企业都会有网段规划,按照一定的用途划分网段。我们可以利用这个原理做环境隔离,即不同网段的 IP 属于不同的环境,如192.168.1.0/24属于环境A, 192.168.2.0/24属于环境B等。
- Nacos 有两种方式初始化客户端实例,一种是直接告诉客户端 Nacos 服务端的IP;另一种是告诉客户端一个 Endpoint,客户端通过 HTTP 请求到 Endpoint,查询 Nacos 服务端的 IP 列表。这里,我们利用第二种方式进行初始化。
- 增强 Endpoint 的功能。在 Endpoint 端配置网段和环境的映射关系,Endpoint 在接收到客户端的请求后,根据客户端的来源 IP 所属网段,计算出该客户端的所属环境,然后找到对应环境的 IP 列表返回给客户端。如下图
7.2 一个环境隔离 Server 的示例
前面讲了基于 IP 段做环境隔离的约束和基本原理,那么如何实现一个地址服务器呢。
最简单的方法是基于Nginx实现,利用 Nginx 的 Geo 模块,做 IP 端和环境的映射,然后利用Nginx 返回静态文件内容。
- 安装Nginx:http://nginx.org/en/docs/install.html
- 在nginx-proxy.conf 中配置 Geo 映射,参考这里:
geo $env {default ""; 192.168.1.0/24 -env-a; 192.168.2.0/24 -env-b;}
配置nginx根路径及转发规则,这里只需要简单的返回静态文件的内容:
# 在http模块中配置根路径 root /tmp/htdocs; # 在server模块中配置 location / { rewrite ^(.*)$ /$1$env break; }
配置Nacos服务端IP列表配置文件,在/tmp/hotdocs/nacos目录下配置以环境名结尾的文件,文件内容为IP,一行一个:
$ll /tmp/hotdocs/nacos/ total 0 -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist-env-a -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist-env-b $cat /tmp/hotdocs/nacos/serverlist 192.168.1.2 192.168.1.3
验证:
curl 'localhost:8080/nacos/serverlist' 192.168.1.2 192.168.1.3
至此, 一个简单的根据 IP 网段做环境隔离的示例已经可以工作了,不同网段的 Nacos 客户端会自动获取到不同的 Nacos 服务端 IP 列表,实现环境隔离。
这种方法的好处是用户不需要配置任何参数,各个环境的代码和配置是一样的,但需要提供底层服务的同学做好网络规划和相关配置。