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

  1. 添加依赖:
<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

  1. 在 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 类型。
  1. 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}
  1. 首先通过调用 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"
  1. 运行 NacosConfigApplication,调用 curl http://localhost:8080/config/get,返回内容是 true

  2. 再次调用 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"
  1. 再次访问 http://localhost:8080/config/get,此时返回内容为false,说明程序中的useLocalCache值已经被动态更新了。

 

官方网站

  https://nacos.io

 

posted on 2023-02-22 15:43  hztech  阅读(809)  评论(0编辑  收藏  举报

导航