SpringCloud 07 —— Config

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server,您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与SpringEnvironment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用。随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。可以轻松添加替代实现,并使用Spring配置将其插入

简单来说,就是对于已经发布后的系统,可以通过修改config 的配置进行动态的更新当前系统的配置,无需重启。

Spring Cloud Config 的功能并没有国内一些如携程的 Apollo、蚂蚁金服的 disconf、阿里的Nacos等功能强大。在后面章节会进行选择替换讲解。另外,这里仅介绍git和本地模式,SVN模式感觉并不如git...(一般本地开发用本地模式,远程线上用git模式)

config服务端

config的git模式(github为例)

新建项目模块cloud-config-native-server,引入依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--服务发现的方式-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

新建启动类,并且加上@EnableConfigServer

@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigNativeServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigNativeServerApplication.class, args);
    }
}

新建配置文件bootstrap.yml添加配置

server:
  port: 8778
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xxxx/xxxx.git #设置自己的git地址
          username: 账号
          password: 密码
          search-paths: cloud-config-repo #仓库里面如果没有见文件夹,不需要加此配置

eureka: #已服务发现的方式可以加,否则不用加
  client:
    service-url:
      defaultZone: http://xunfei:12345@127.0.0.1:8761/eureka

在仓库中添加配置信息

test.yml 默认

version: default-1.0

test-dev.yml 开发

version: dev-1.0

test-prod.yml 生产

version: prod-1.0

test-uat.yml uat

version: uat-1.0

register-eureka-client.yml 项目演示

eureka:
  client:
    service-url:
      defaultZone: http://xunfei:123456@127.0.0.1:8761/eureka
logging:
  level:
    group.zhouning: debug
version: eureka-2.0

项目启动

浏览器或Postman 输入地址127.0.0.1:8778/test/default。获取到test配置的对应信息。可以看到返回的JSON中应用名是test,环境是默认的,因为请求的是default,分支名label是null,默认是master,version 就是Git CommitId,propertySources里面就是配置的属性

同样我们可以通过浏览器或Postman 输入127.0.0.1:8778/register-eureka-client.yml

访问配置信息的URL与配置文件的映射关系如下:

  • //[/]
  • /-.yml
  • //-.yml
  • /-.properties
  • //-.properties

就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。
就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-.yml 加以区分,例如application-dev.yml、application-uat.yml、application-prod.yml。
表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。

不管服务端使用什么模式,对客户端均不受影响

config 本地模式

searchLocations的配置描述

  • 绝对路径: 如 file:D:/workspace/fw-repo
  • 相对路径:如classpath:/native
  • 默认路径:classpath:/

在application.yml 中设置本地的配置

#config server native模式
spring:
  application:
    name: config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          searchLocations: classpath:/native #  绝对路径 如 file:D:/workspace/repo 相对路径:如classpath:/native

eureka:
  client:
    service-url:
      defaultZone: http://xunfei:12345@127.0.0.1:8761/eureka

比如我们使用的是相对路径:如classpath:/native,将配置复制过来

启动项目浏览器或Postman 输入地址127.0.0.1:8778/register-eureka-client.yml。获取到对应的配置内容,添加其它的配置同理添加对应yml即可.

config客户端

用于向config服务端的git获取数据
新建模块cloud-config-native-client,引入依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>

创建启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class ConfigNativeClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigNativeClientApplication.class, args);
    }
}

创建一个controller

@RestController
@RefreshScope //开启更新功能
@RequestMapping("api")
@Slf4j
public class TestController {


    @Value("${version}")
    private String versionValue;

    /**
     * 返回配置文件中的值
     */
    @GetMapping("/version")
    @ResponseBody
    public String returnFormValue(){
        log.debug("输出信息{}",versionValue);
        return versionValue;
    }
}

添加boostrap.yml配置文件(boostrap.yml里的配置优先于application.properties和application.yml加载)

server:
  port: 8779
spring:
  application:
    name: register-eureka-client #对应 git 的配置文件名称
  cloud:
    config:
      uri: http://127.0.0.1:8778/  #Config Server 地址
      profile: dev  #环境名
      label: master  #分支名
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info #暴露监控的点

配置中心的更新配置的坑,2.0前调用/refresh更新配置的方法,不再适用。
现在的方法如下:
management.endpoints.web.exposure.include=/actuator/refresh,/actuator/health,/actuator/info

这里并没有配置eureka信息,在register-eureka-client.yml配置的
日志级别配置的debug模式

eureka:
  client:
    service-url:
      defaultZone: http://xunfei:12345@127.0.0.1:8761/eureka
logging:
  level:
    group.zhouning: debug
version: eureka-1.0

先启动服务端后,启动项目。访问127.0.0.1:8779/api/version测试。
可以看到在启动时就会到服务端获取配置信息。

请求127.0.0.1:8779/api/version

返回结果
eureka-1.0

修改git中version的内容,并提交

我们refresh一下,post请求127.0.0.1:8779/actuator/refresh

再次请求127.0.0.1:8779/api/version

返回结果
eureka-2.0

注意点

注意点
server:
  port: 8779
spring:
  application:
    name: register-eureka-client
  cloud:
    config:
      #uri: http://127.0.0.1:8778/  自己指定的
      profile: dev
      label: master
      discovery: #基于服务发现的
        enabled: true
        service-id: config-server
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info
  • 如果自己指定的方式配置的Config Server不需要配置eureka和discovery.enabled和discovery.service-id的配置
  • 如果基于eureka发现的方式,需要注释掉spring.cloud.config.uri,加入eureka客户端依赖并且开启discovery.enabled和discovery.service-id的配置

config 属性覆盖

在application.yml中添加配置

spring.cloud.config.allow-override #设置为true,表示开启覆盖的操作

配置需要覆盖的属性

spring.cloud.config.server.overrides 本身是一个Map集合,可以配置多个,一些公共属性可以通过这种方式配置

spring:
  cloud:
    config:
      server:
        overrides:
          version: 覆盖优先1.0
      allow-override: true

请求127.0.0.1:8779/api/version
返回结果
覆盖优先1.0

这说明了设置覆盖的属性的优先级比较高

更新时间:2020-04-24 11:52:10

本文由 寻非 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.zhouning.group/archives/springcloud07config
最后更新:2020-04-24 11:52:10

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×