nacos 配置中心-共享多配置-实战
环境:
IDEA 2022
NACOS:2.2
nginx :1.22
CentOS7
springCloud 2021.0.5
Springboot 2.6.13
Spring-cloud-alibaba 2021.0.4.0
实现效果:
微服务配置信息(主要是application中的内容)实现远程配置和共享配置
具体操作:
把公共的配置统一拿到nacos配置中心包括如下配置:
1、mysql
spring: #application: # name: cloud-payment-service # 项目名,也是注册的名字 datasource: type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver #mysql驱动包 url: jdbc:mysql://localhost:3306/hztech?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: xxxxxxl inetutils: ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8' mybatis: mapper-locations: classpath:mapper/*.xml # 所有Entity 别名类所在包 type-aliases-package: com.hztech.entities
2、druid
3、nacos register
4、系统默认的配置文件 cloud-payment-service(与服务同名)
设置是否允许本地配置的信息不被远程配置信息覆盖 override-none:false 默认为覆盖,override-none:true 远程配置不覆盖线下配置
注意:如下配置在客户端配置无效,只能在Nacos 服务端配置才可以
spring: cloud: config: # Nacos远程配置是否不覆盖其他属性源(文件、系统),默认为false,即覆盖其他源(文件、系统), #当allow-override:为true时才会生效 override-none: false # 是否允许Nacos远程配置被本地文件覆盖,默认为true allow-override: true # Nacos远程配置是否可以覆盖系统属性源(系统环境变量或系统属性),默认为true,即允许 override-system-properties: false
Nacos服务端配置总览:
以下为provider微服务客户端配置
启用远程配置后,集群部署的相同的服务的不同实例,可以共享一份远程的配置信息,同时本地的pom.xml和bootstrap.yml也可以保持一致
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclound</artifactId> <groupId>com.hztech</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider-payment8002</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- hystrix 需要cloud 的版本支持 见 父项目的POM <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> --> <!--value注入时要用 bootstrap--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--引入nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- nacos注册中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.11</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.hztech</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
bootstrap.yml
注意:
1、与配置中心配合使用的本地配置问件,不是 application而是 bootstrap
2、namespace:必须使用id,名称测试未通过!!!
3、数据库配置的远程配置要在其他配置的前面,否则启动报错
4、如果要使用权限管理,就需要在nacos 服务端开启了 nacos.core.auth.enable=true ,这种场景下必须配置 username和password
#服务名称 spring.application.name=cloud-payment-service #nacos 配置中心地址 此处因为搭建了nginx反向代理所以省略了端口号 直接填写nginx的访问地址 spring.cloud.nacos.config.server-addr=192.168.1.254 #命名控件必须用id #spring.cloud.nacos.config.namespace=6be08475-3019-4d2c-b22f-51676ea80fac # 扩展文件 共享配置 spring.cloud.nacos.config.shared-configs[0].data-id=datasource.yml spring.cloud.nacos.config.shared-configs[0].refresh=true spring.cloud.nacos.config.shared-configs[1].data-id=nacos.yml spring.cloud.nacos.config.shared-configs[1].refresh=true spring.cloud.nacos.config.extension-configs[0].data-id=druid.yml spring.cloud.nacos.config.extension-configs[0].refresh=true #与 nacos.core.auth.enable有关 #spring.cloud.nacos.config.username=nacos #spring.cloud.nacos.config.password=nacos #file-extension默认是propertites spring.cloud.nacos.config.file-extension=yaml #prefix=${spring.application.name} #默认是这个配置 与 ${spring.application.name} 同名 #spring.cloud.nacos.config.prefix=myconfigprefix #{spring.cloud.nacos.config.prefix}+"-"+{spring.profiles.active}+”."+{spring.cloud.nacos.config.file-extension} #spring.profiles.active=dev
测试dev中的远程配置情况
application.yml
在启用远程配置如果,这个文件中可以只保存一个端口号就好
不同的应用可以设置不同的port就可以了。
server: port: 8002
consumer 微服务 88
POM.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springclound</artifactId> <groupId>com.hztech</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>customer-order80</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--value注入时要用 bootstrap--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--引入nacos配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- hystrix <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> --> <!-- nacos注册中心 --> <!-- 由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer, 所以不引入spring-cloud-loadbalancer会报错 解决方法 加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> <!-- openFeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.hztech</groupId> <artifactId>cloud-api-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
bootstrap.yml
使用远程配置 ,只需要nacso 配置,
spring.application.name=payment-order spring.cloud.nacos.config.server-addr=192.168.1.254 #命名控件必须用id #spring.cloud.nacos.config.namespace=6be08475-3019-4d2c-b22f-51676ea80fac # 扩展文件 共享配置 spring.cloud.nacos.config.shared-configs[0].data-id=nacos.yml spring.cloud.nacos.config.shared-configs[0].refresh=true #spring.cloud.nacos.config.username=nacos #spring.cloud.nacos.config.password=nacos #file-extension默认是propertites spring.cloud.nacos.config.file-extension=yaml #prefix=${spring.application.name} #默认是这个配置 与 ${spring.application.name} 同名 #spring.cloud.nacos.config.prefix=myconfigprefix #{spring.cloud.nacos.config.prefix}+"-"+{spring.profiles.active}+”."+{spring.cloud.nacos.config.file-extension} #spring.profiles.active=dev
application.yml
只配置端口
server:
port: 88
项目结构
nacos 服务列表
测试过程中发现nacos服务端控制台有两个BUG;
1、微服务客户端运行期间,客户端IP 地址发生改变,nacos 服务端注册信息未更新---影响consumer 查询和调用服务--
应对方法,重启客户端微服务
2、服务注册信息不显示,任何记录,刷新无效,-------不影响consumer对微服务的调用
应对方法:退出nacos 控制台,重新进入
配置文件优先级
由高到低依此为:
1、profile
2、默认的与服务同名的配置文件
3、extension-configs(下标越大优先级越高)
4、shared-configs(下标越大优先级越高)
另外:
线上配置优先级高于本地配置(同属性覆盖本地)
官方资料
启动配置管理
启动了 Nacos server 后,您就可以参考以下示例代码,为您的 Spring Cloud 应用启动 Nacos 配置管理服务了。完整示例代码请参考:nacos-spring-cloud-config-example
- 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
更多版本对应关系参考:版本说明 Wiki
- 在
bootstrap.properties
中配置 Nacos server 的地址和应用名
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.application.name=example
说明:之所以需要配置 spring.application.name
,是因为它是构成 Nacos 配置管理 dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
- 通过 Spring Cloud 原生注解
@RefreshScope
实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
- 首先通过调用 Nacos Open API 向 Nacos Server 发布配置:dataId 为
example.properties
,内容为useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true"
-
运行
NacosConfigApplication
,调用curl http://localhost:8080/config/get
,返回内容是true
。 -
再次调用 Nacos Open API 向 Nacos server 发布配置:dataId 为
example.properties
,内容为useLocalCache=false
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=false"
- 再次访问
http://localhost:8080/config/get
,此时返回内容为false
,说明程序中的useLocalCache
值已经被动态更新了。
官方网站
https://nacos.io