小Cの已经记不起来的博客

用 Docker 搭建配置中心的完整流程

最近迁移一个跑了快两年的小项目,才发现配置文件散落在三台服务器上,改个 Redis 地址得挨个登上去 sed 一遍再重启服务,中间还漏改了一台,排查半天才发现是两边配置不一致。痛定思痛,决定搭个配置中心。选型看了一圈,Apollo 功能是全但太重了,Consul 又没有原生的配置管理界面,最后选了 Nacos,单机模式一个容器就能跑,对我这种小项目来说刚刚好。

下面是实测可用的搭建流程,全程借助 docker,不然你就慢慢装 JDK、配 MySQL 吧.

准备工作

先交代下版本。我用的是 Nacos 2.3.2 的镜像,2.x 的客户端走 gRPC 通信,除了 8848 还要多占一个 9848 端口,这是待会儿要踩的第一个坑,先记着。另外 Nacos 默认用内嵌的 derby 存数据,重启倒不至于丢,但备份和迁移都麻烦,所以顺手切到 MySQL。数据库直接复用机器上已有的 5.7,没有的话自己起一个也很简单,这里不展开。

初始化数据库

先建库:

CREATE DATABASE nacos_config DEFAULT CHARSET utf8mb4;

然后去官方仓库下载建表脚本,路径在 distribution/conf/mysql-schema.sql:

wget https://raw.githubusercontent.com/alibaba/nacos/2.3.2/distribution/conf/mysql-schema.sql

国内直连 raw.githubusercontent.com 大概率不通,本地下载好再传上去就行,别死磕。导进刚才的库:

mysql -unacos -p nacos_config < mysql-schema.sql

十来张表,config_info、his_config_info 之类的,导完什么都不用改。

用 docker-compose 启动

拉镜像 docker pull nacos/nacos-server:v2.3.2, 太慢或者报错的话,可以在前面加个镜像加速域名,没准儿等你用的时候这个加速地址已经失效了。

因为环境变量有点多,直接 docker run 写成一长串容易漏,我用的 docker-compose:

services:
  nacos:
    image: nacos/nacos-server:v2.3.2
    container_name: nacos
    environment:
      - MODE=standalone
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.1.10
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=nacos123
    ports:
      - "8848:8848"
      - "9848:9848"
    restart: always

然后 docker compose up -d, docker logs -f nacos 盯一下日志,看到 Nacos started successfully in stand alone mode. use external storage 就算起来了,use external storage 说明连的是外部 MySQL 而不是内嵌 derby。

建配置和客户端接入

浏览器打开 http://服务器IP:8848/nacos, 默认账号密码都是 nacos/nacos。先建两个命名空间把 dev 和 prod 分开,再到配置管理里新建配置,Data ID 按项目习惯来,我一般就是 项目名.yaml, Group 用默认的 DEFAULT_GROUP。内容直接贴 YAML,保存之后页面自带历史版本,改错了能一键回滚,这点比登服务器手改强太多了。

客户端这边,Spring Boot 项目引入 spring-cloud-starter-alibaba-nacos-config,bootstrap.yml 里写上:

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.1.10:8848
        namespace: dev的namespaceID
        file-extension: yaml

启动日志里能看到拉取到的配置就通了。之后改配置在页面上点一下发布,几秒内服务就热更新,不用再挨个重启。

踩过的坑

  1. 9848 端口。我最开始只映射了 8848,控制台一切正常,结果客户端死活连不上,一直报 Client not connected, current status: STARTING。查了半天才知道 2.x 的 gRPC 端口固定是 8848+1000,也就是 9848,端口映射和防火墙都得放行。上面 compose 里已经加上了,你要是照抄记得别删。

  2. namespace 的坑。客户端配置里填的得是命名空间那串自动生成的 ID,不是你起的名字,填名字是连不上的,这个页面上一眼不容易看出来。

  3. 鉴权。跑通了才想起来这台机器有公网 IP,不开鉴权等于裸奔,于是加了 NACOS_AUTH_ENABLE=true,结果第一次启动直接失败,日志里提示必须自己配置 token。还得再加三个环境变量:

      - NACOS_AUTH_TOKEN=xxx
      - NACOS_AUTH_IDENTITY_KEY=serverIdentity
      - NACOS_AUTH_IDENTITY_VALUE=security

TOKEN 是个 base64 字符串,原文长度要超过 32 个字符,我随手编了一段不够长,又起不来,来回折腾了两回。用下面这个命令生成一段填进去就行:

echo -n 'my-nacos-secret-key-0123456789-abcdefg' | base64

顺带把控制台默认的 nacos/nacos 密码也改了。

  1. 备份。所有配置都在 MySQL 里,容器删了都没事,所以备份重点是数据库。mysqldump 挂个 crontab 每天凌晨导一次,够用了。

至此整套流程就算跑通了。后面服务多了再研究集群部署,眼下这个规模,单机一个带 restart: always 的容器,稳稳当当跑着没什么问题。

评论

还没有评论。

发表评论

提交后评论将经过自动审核,审核通过后公开展示。

未在播放