Microservice - Nacos
注意
由于技术日新月异,本文具有时效性,以官方文档 (opens new window)为准。
什么是 Nacos
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
# 应用场景
# 服务配置
可将 application.yml
中的配置写在 nacos 中,可使得在微服务集群中灵活修改配置。
笔记
在启动服务时,添加指定环境参数 spring.profiles.active
,实现灵活切换配置。
# 服务发现
可将微服务注册到 nacos 上,使得网关服务能将请求转发到对应微服务上。
笔记
这就跟 DNS 一样,对于用户来讲,不需要关心某个网站的 ip 地址是多少,只要在浏览器输入指定的域名就可以访问到该网站(如 google.com
),也就不用担心因为网站更换了服务器导致 ip 地址变更导致的访问失败。
# 部署
# Windows / Linux / Mac
这里演示的是非高可用的开发环境的 nacos 部署
下载:Releases · alibaba/nacos (opens new window)
# Linux/Unix/Mac
启动命令(standalone 代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是 ubuntu 系统,或者运行脚本报错提示 符号找不到
,可尝试如下运行:
bash startup.sh -m standalone
# Windows
启动命令 (standalone 代表着单机模式运行,非集群模式):
startup.cmd -m standalone
http://127.0.0.1:8848/nacos/index.html
username: nacos
password: nacos
# Docker
推荐使用 docker composer,参考示例:nacos-docker/example/standalone-mysql-8.yaml at master · nacos-group/nacos-docker (opens new window)
version: "3.8"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos-standalone-mysql
env_file:
- ../env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
depends_on:
mysql:
condition: service_healthy
restart: always
mysql:
container_name: mysql
build:
context: .
dockerfile: ./image/mysql/8/Dockerfile
image: example/mysql:8.0.30
env_file:
- ../env/mysql.env
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
interval: 5s
timeout: 10s
retries: 10
配置:
在 nacos-group/nacos-docker (opens new window) 中列出了常用属性配置,可在环境变量中配置
如果您有大量自定义配置需求,强烈建议在生产环境中挂载
application.properties
。nacos-docker/example/init.d/application.properties
(opens new window)
笔记
虽然 docker hub 也有 Readme,但显然是很久没有更新的,nacos-group/nacos-docker (opens new window) 中的 Readme 是最新的。
# 示例
# 配置管理
Nacos config · alibaba/spring-cloud-alibaba Wiki (opens new window)
nacos 添加命名空间
添加时需指定 id 与环境变量名称一致,如 dev
,确保切换环境时能正确匹配,如不指定 id,nacos 会自动生成一个随机 id,不便于使用。
nacos 添加配置
- Data Id:相当于配置文件名,需包含后缀,如
hello-service.yml
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>版本号</version>
</dependency>
笔记
版本号与 Spring Boot 版本号一致
Nacos 依赖的版本号与 Spring Boot 的关系,参考版本说明・alibaba/spring-cloud-alibaba Wiki (opens new window)
实践:在本段编写时 RuoYi-Vue-Plus (opens new window) 5.x
分支的 Spring Boot 版本为 3.1.5
,而此时 Nacos 对应 Spring Boot 3.0 的分支最新版本为 2022.0.0.0
,而推荐的 Spring Boot 版本为 3.0.2
,经尝试不支持 Spring Boot 3.1.5
,因此需要将项目的 Spring Boot 版本降到 3.0.x
,这里我使用了当前的 GA 版本 3.0.12
,成功运行。
在服务中创建 bootstrap.yml
配置文件
spring:
profiles:
#启动环境配置
active: #spring.profiles.active#
application:
name: 应用名称("my-application")
cloud:
nacos:
config:
server-addr: ${my.nacos.config-server:192.168.1.123:8848}
namespace: ${my.nacos.config-namespace:${spring.profiles.active}}
file-extension: yml
参考配置:
点击查看
spring:
profiles:
#启动环境配置
active: #spring.profiles.active#
application:
name: 应用名称("my-application")
cloud:
nacos:
config:
# 读取机器bootstrap.yml 开发环境使用server-addr
server-addr: ${my.nacos.config-server:192.168.1.123:8848}
# 生产环境是阿里云ACE服务 需要使用endpoint连接
endpoint: ${my.nacos.config-endpoint:}
namespace: ${my.nacos.config-namespace:${spring.profiles.active}}
file-extension: yml
group: DEFAULT_GROUP
extension-configs:
- data-id: common-configuration.yml
group: DEFAULT_GROUP
- data-id: resources-config.yml
group: DEFAULT_GROUP
- data-id: common-config.yml
group: DEFAULT_GROUP
- data-id: db.yml
group: DEFAULT_GROUP
如何实现加载不同环境的配置?
在不同环境运行应用时,启动时添加 spring.profiles.active
指定运行环境,如果没有指定( my.nacos.config-namespace
)命名空间参数,默认使用 spring.profiles.active
作为命名空间名称。
默认会加载哪些配置?
${spring.application.name}.${file-extension:properties}
${spring.application.name}-${profile}.${file-extension:properties}
# 服务注册
# 生产者
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${latest.version}</version>
</dependency>
- Maven Repository: com.alibaba.cloud » spring-cloud-starter-alibaba-nacos-discovery (opens new window)
- Nacos 版本说明 (opens new window),Spring Cloud Alibaba 对 Spring Boot 版本有对应要求,一般都不是最新版的 Spring Boot
配置
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动类注解
@EnableDiscoveryClient
# 消费者
略,将在网关文章中详述。