简介
Nacos 是一个构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 的关键特性包括:服务发现和服务健康监测、动态配置服务、动态 DNS 服务、服务及其元数据管理。
Nacos 作为 Spring Cloud Alibaba 的一员,用于分布式服务解决方案的服务注册与发现和分布式配置。
本文则主要记录在 Docker 上搭建 Nacos 的过程,以及在 Spring Cloud 应用中如何配置。
快速开始(简单测试)
快速地运行一个 Nacos Server 用于简单测试
MODE,指定系统启动方式,standalone为单机,cluster(默认值)为集群
docker run --name nacos-quick \
-e MODE=standalone \
-p 8848:8848 \
-p 9848:9848 \
-d nacos/nacos-server:2.0.2
以嵌入式数据库存储启动
PREFER_HOST_MODE,支持IP还是域名模式,取值ip(默认值)或hostname
NACOS_AUTH_ENABLE,是否开启权限系统,取值true或false(默认值)
-v,挂载卷,/home/nacos/logs是Nacos服务容器存储日志的位置
docker run -d --name nacos \
-p 8848:8848 \
-p 9848:9848 \
-v /Users/wei/data/nacos/standalone-logs/:/home/nacos/logs \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e NACOS_AUTH_ENABLE=true \
nacos/nacos-server:v2.0.4-slim
以外部MySQL数据库存储启动
在单机模式时Nacos可以使用嵌入式数据库实现数据的存储,但是这不便于观察数据存储情况
从0.7版本起,Nacos增加了支持MySQL数据源的能力
在运行此Nacos服务容器前需要先准备好环境变量文件并初始化数据库
--env-file,指定文件并从中读取环境变量,MySQL数据库连接属性即配置在里面
docker run -d --name nacos \
-p 8848:8848 \
-p 9848:9848 \
-v /Users/wei/data/nacos/standalone-logs/:/home/nacos/logs \
--env-file=./env/nacos-standlone-mysql.env \
nacos-server:v2.0.3-arm64
环境变量文件
由于运行容器时需要的环境变量太多,将变量统一写在nacos-standlone-mysql.env
PREFER_HOST_MODE,支持IP还是域名模式,取值ip(默认值)或hostnameMODE,指定系统启动方式,standalone为单机,cluster(默认值)为集群SPRING_DATASOURCE_PLATFORM,单机模式下数据源平台,取值mysql或留空(默认)MYSQL_SERVICE_HOST,数据库连接地址MYSQL_SERVICE_DB_NAME,数据库库名MYSQL_SERVICE_PORT,数据库端口,默认3306MYSQL_SERVICE_USER,数据库用户名MYSQL_SERVICE_PASSWORD,数据库用户密码MYSQL_SERVICE_DB_PARAM,数据库连接参数
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
初始化数据库
1.创建nacos数据库用户
2.创建nacos_config数据库
3.赋予用户nacos对nacos_config数据库的所有权限
4.初始化数据库,数据库脚本:github.com/alibaba/nac…
create user 'nacos'@'%' identified by 'nacos';
CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARSET utf8 COLLATE utf8_bin;
grant all privileges on nacos_config.* to 'nacos'@'%' with grant option;
flush privileges;
Docker Compose编排
官方提供的 Compose 编排用例中使用了官方自制的MySQL镜像,启动运行时会自动初始化数据库
version: "2"
services:
nacos:
image: nacos/nacos-server:v2.0.4
container_name: nacos-standalone-mysql
env_file:
- ../env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9848:9848"
depends_on:
- mysql
restart: always
mysql:
container_name: mysql
image: nacos/nacos-mysql:8.0.16
env_file:
- ../env/mysql.env
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
mysql服务环境变量文件
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=nacos_devtest
MYSQL_USER=nacos
MYSQL_PASSWORD=nacos
自定义Compose编排
实际上在生产中并不建议将MySQL服务以容器化运行,所以应当自定义Compose编排,只存留nacos
version: "2"
services:
nacos:
image: nacos/nacos-server:v2.0.4-slim
container_name: nacos
env_file:
- ./env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
访问Nacos控制台
浏览器访问:localhost:8848/nacos
默认用户名/密码:nacos/nacos
Spring Cloud应用配置
模块及依赖管理
聚合模块的POM
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块的POM
分别引入两个依赖
spring-cloud-starter-alibaba-nacos-discovery用于Nacos服务注册与发现
spring-cloud-starter-alibaba-nacos-config用于Nacos配置中心
<!-- spring cloud alibaba nacos 服务注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- spring cloud alibaba nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
应用属性文件配置
bootstrap.yml
spring.application.name用于构成Nacos配置管理的dataId
spring.cloud.nacos.config.server-addr配置Nacos Server地址
username和password为访问Nacos Server的用户名和密码
file-exetension表示配置内容的数据格式,也用于构成dataId
spring:
application:
name: account-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
file-extension: yml
Nacos配置管理
访问Nacos控制台,选择配置管理-配置列表
创建或配置dataId: account-service.yml
account-service.yml
spring.cloud.nacos.discovery.server-addr配置Nacos Server地址用于服务注册与发现
username和password为访问Nacos Server的用户名和密码
其他属性配置与通常的 Spring Boot 配置一样
server:
port: 8012
spring:
application:
name: account-service
datasource:
url: jdbc:mysql://127.0.0.1:3306/seata_account?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=true&tinyInt1isBit=false&allowMultiQueries=true
username: seata
password: seata
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
mybatis-plus:
mapper-locations:
- classpath:mapper/*.xml
参考
[1] Github nacos-docker: github.com/nacos-group…
[2] Nacos Official nacos-docker: nacos.io/zh-cn/docs/…
[3] Docker Hub Nacos: hub.docker.com/r/nacos/nac…
[4] mysql-schema.sql: github.com/alibaba/nac…