Docker-compose 快速配置 nacos 集群环境

5 minute

前言

总体架构

在一台 CentOS 主机上部署,版本为 7.9,IP为 192.168.1.127。

通过 docker 创建三台 nacos 环境的机器,端口均运行在 8848,分别映射到主机的 8848,8858,8868 端口上,名称(hostname)分别为 nacos-server1,nacos-server2,nacos-server3。

主机通过 nginx 监听 8080 端口,通过负载均衡将请求转发到三台 nacos 机器上。

主机作为数据库源,使用 mysql 作为数据库,端口为 3306,三台机器都安装 mysql 环境,端口运行在 3306,映射到主机 3307 端口。

服务说明

创建一个简单的服务,注册到上述 nacos 环境中,通过在 bootstrap.yaml 中读取 nacos 配置来验证环境是否配置成功。

搭建 nacos 环境

编辑 docker-compose

在 nacos 官网下载 nacos-docker 到主机上,编辑 docker-compose.yaml 文件。

根据官网说明,在 nacos2 中需要额外暴露两个端口,分别偏移 8848 这个端口 1000 和 1001。

 1version: "3"
 2services:
 3  nacos1:
 4    hostname: nacos-server-1
 5    container_name: nacos1
 6    image: nacos/nacos-server:${NACOS_VERSION}
 7    volumes:
 8      - ./cluster-logs/nacos1:/home/nacos/logs
 9      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
10    ports:
11      - "8848:8848"
12      - "9848:9848" # 偏移 1000
13      - "9849:9849" # 偏移 1001
14      - "9555:9555"
15    env_file:
16      - ../env/nacos-hostname.env
17    restart: always
18    depends_on:
19      - mysql
20
21  nacos2:
22    hostname: nacos-server-2
23    image: nacos/nacos-server:${NACOS_VERSION}
24    container_name: nacos2
25    volumes:
26      - ./cluster-logs/nacos2:/home/nacos/logs
27      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
28    ports:
29      - "8858:8848"
30      - "9858:9848"
31      - "9859:9849"
32    env_file:
33      - ../env/nacos-hostname.env
34    restart: always
35    depends_on:
36      - mysql
37
38  nacos3:
39    hostname: nacos-server-3
40    image: nacos/nacos-server:${NACOS_VERSION}
41    container_name: nacos3
42    volumes:
43      - ./cluster-logs/nacos3:/home/nacos/logs
44      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
45    ports:
46      - "8868:8848"
47      - "9868:9848"
48      - "9869:9849"
49    env_file:
50      - ../env/nacos-hostname.env
51    restart: always
52    depends_on:
53      - mysql
54      
55  mysql:
56    container_name: mysql
57    image: nacos/nacos-mysql:5.7
58    env_file:
59      - ../env/mysql.env
60    volumes:
61      - ./mysql:/var/lib/mysql
62    ports:
63      - "3307:3306"

配置数据库信息

通过官网提供的 sql 脚本在主机建好数据库。

接着指定 mysql 数据库源信息,编辑 env/nacos-hostname.env 文件如下:

1PREFER_HOST_MODE=hostname # hostname 模式
2NACOS_SERVERS=nacos-server-1 nacos-server-2 nacos-server-3
3MYSQL_SERVICE_HOST=192.168.1.127
4MYSQL_SERVICE_DB_NAME=nacos_config
5MYSQL_SERVICE_PORT=3306
6MYSQL_SERVICE_USER=****
7MYSQL_SERVICE_PASSWORD=******

注意填写好主机的 mysql 账号密码。

最后指定 docker 中 mysql 信息,编辑 env/mysql.env 文件即可:

1MYSQL_ROOT_PASSWORD=******
2MYSQL_DATABASE=nacos_config
3MYSQL_USER=****
4MYSQL_PASSWORD=******

运行 docker

 1docker-compose up
 2
 3nacos2  | 2022-08-07 07:05:41,147 INFO Nacos started successfully in cluster mode. use external storage
 4nacos2  |
 5nacos1  | 2022-08-07 07:05:41,194 INFO Nacos is starting...
 6nacos1  |
 7nacos1  | 2022-08-07 07:05:41,240 INFO Nacos started successfully in cluster mode. use external storage
 8nacos1  |
 9nacos3  | 2022-08-07 07:05:42,097 INFO Nacos is starting...
10nacos3  |
11nacos3  | 2022-08-07 07:05:42,135 INFO Nacos started successfully in cluster mode. use external storage

搭建 nginx 环境

首先安装 nginx,接着编辑 /etc/nginx/nginx.conf 文件如下:

 1...
 2
 3http {
 4    ...
 5    upstream nacos-servers {
 6            server 192.168.1.127:8848;
 7            server 192.168.1.127:8858;
 8            server 192.168.1.127:8868;
 9    }
10    server {
11            location / {
12                    proxy_pass http://nacos-servers;
13            }
14            listen 8080;
15    }
16}

监听 8080 端口,通过 upstream 转发到三台机器上。

接着运行 nginx 即可:

1nginx -c /etc/nginx/nginx.conf

创建微服务

依赖导入

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

基本配置

编辑 bootstarp.yaml 如下:(nacos 的地址即 nginx 配置好的地址 192.168.1.127:8080)

 1spring:
 2  cloud:
 3    nacos:
 4      discovery:
 5        server-addr: 192.168.1.127:8080
 6      config:
 7        server-addr: 192.168.1.127:8080
 8        file-extension: yaml
 9  profiles:
10    active: prod
11  application:
12    name: nacos-config-client
13server:
14  port: 9669

编写服务

启动类开启 @EnableDiscoveryClient 注解,然后编写接口:

 1@RefreshScope
 2@RestController
 3@Slf4j
 4public class ConfigController {
 5    @Value("${config.version}")
 6    private String version;
 7
 8    @GetMapping("/v")
 9    public String getVersion() {
10        return version;
11    }
12}

完成测试

  1. 访问 192.168.1.127:8080,成功访问并登录;
  2. 查看集群管理的节点列表,三个前缀名为 nacos-server 的节点都处在 UP 状态;
  3. 编写 nacos-config-client-prod.yaml 文件,为微服务名+环境的格式,新增变量 config.version 为 1.0;
  4. 开启微服务,再查看服务列表,名为 nacos-config-client 的服务已经成功注册,访问接口 /v,返回 1.0;
  5. 修改配置,version 改为 2.0,再次访问 /v 接口,返回 2.0。