zoukankan      html  css  js  c++  java
  • spring cloud config —— git配置管理

    talk is cheep, show your the code

    废话不多说,直接开干

    本文基于 2.1.1版本
    github地址

    例如我们目前将配置放在了github上的这个目录下

    Server端

    pom.xml

    需要添加一个依赖,一般我们配置中心和注册中心可以放在一起,因此我就和eureka注册服务器一起了

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
            </dependency>
        </dependencies>
    

    server的application.yml

    导入了jar包,按照spring的尿性,当然是要继续写配置信息了

    server:
      port: 8761
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    spring:
      application:
        name: service-center
    
      cloud:
        config:
          server:
            git:
              uri: # 你的git地址
              # git账号
              username: '你的账号'
              # git密码
              password: '你的密码'
              # 默认从master分支读取配置文件
              default-label: develop # for test
              # 配置文件的路径,因为我项目的根目录是 my-demo,因此这里查询的路径就是 m.../conf-repo, 可以配置多个,按逗号分割
              search-paths: microservice/conf-repo  # 
    

    配置文件

    关于配置文件,必须按照约定的命名, 就是 {application}-{profile}.properties{application}-{profile}.yml,不这么命名的话,是没法后面被加载到的

    例如我创建的文件名为 demo-dev.properties,里面的内容为

     version=1
    
    name=demo
    

    测试Server

    spring cloud config会将文件生成对应的接口,

    明显看出接口是按照 {application}/{profile} 这样的方式来自动生成的

    官方文档表明有以下几种

    • /{application}/{profile}[/{label}]
    • /{application}-{profile}.yml
    • /{label}/{application}-{profile}.yml
    • /{application}-{profile}.properties
    • /{label}/{application}-{profile}.properties

    client端

    pom.xml

    需要导入一个jar包

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    

    添加配置文件,不是application.yml

    spring cloud config 通过bootstrap.yml 中的内容来对配置文件进行读取

    spring:
      cloud:
        config:
          discovery:
            enabled: true
          # 对应配置中心的 spring.application.name
            service-id: service-center
          # name 表示配置文件的 {application} 部分
          name: demo
          # profile 表示配置文件的 {profile}部分
          profile: dev
          # label 表示 git上的分支
          label: develop
          # uri 表示 访问配置中心的uri
          uri: http://localhost:8761/
    
    

    测试的controller

    @RestController
    public class ConfigClientController {
    
        @Value("${version}")
        private String v;
    
        @GetMapping("/get")
        public String get(){
            return this.v;
        }
    
    }
    

    测试client

    启动,然后发送http请求 http://localhost:8989/get

    读取多个配置文件

    我们的配置文件可能需要读取的不止一个,那么要怎么配置呢,查看了官方文档以后,配置的方式如下

    我们添加一个属性 demo-prod.properties

    spring:
      profiles:
        active: dev,prod   # 添加这个属性可以读取多个文件
      cloud:
        config:
          discovery:
            enabled: true
            service-id: service-center
          # name 表示配置文件的 {application} 部分
          name: demo
          # profile 表示配置文件的 {profile}部分
    #      profile: dev
          # label 表示 git上的分支
          label: develop
          # uri 表示 访问配置中心的uri
          uri: http://localhost:8761/
    
    

    相应的,controller的代码也需要进行修改

    @RestController
    public class ConfigClientController {
    
        @Value("${version}")
        private String v;
    
        @Value("${namespace}")
        private String ns;
    
        @GetMapping("/get")
        public String get(){
            return this.v;
        }
    
        @GetMapping("/namespace")
        public String getNs(){
            return this.ns;  // 应该得到 demo
        }
    
    }
    

    配置更新

    spring cloud config 能够监听github上配置的变化,但它不会进行进行变化的通知,而是需要client自己主动的进行pull的操作,将配置更新
    这里就需要引入 spring-cloud-starter-actuator了。

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    

    application.yml中添加配置属性,将更新的接口暴露出来

    management:
      endpoints:
        web:
          exposure:
            include: refresh
    

    在我们希望能够进行配置更新的地方,添加注解 @RefreshScope

    @RestController
    @RefreshScope
    public class ConfigClientController {
    
        @Value("${version}")
        private String v;
    
        @Value("${namespace}")
        private String ns;
    
        @GetMapping("/get")
        public String get(){
            return this.v;
        }
    
        @GetMapping("/namespace")
        public String getNs(){
            return this.ns;
        }
    
    }
    

    到此,我们的准备工作就好了,然后启动,访问/get接口,然后修改配置文件,再访问的时候还是旧的值,这个时候使用工具进行post的调用

    刷新结束后,再次访问

    在github上可以通过配置webhook的方式,当有新的push操作时,让github去调用 client的refresh接口
    这个方案在client数量较少是还可以,但数量一多,并且每次新增机器都需要修改webhook,显然不够智能,因此后面就需要考虑使用 spring-cloud-bus来进行解决了

  • 相关阅读:
    java基础之switch
    String的getBytes()方法
    Android adb命令
    shell中grep命令详解
    su root 和su
    adb shell 命令详解
    adb shell am 的用法
    adb logcat 基本用法
    Android、iOS和Windows Phone中的推送技术
    Android客户端消息推送原理简介
  • 原文地址:https://www.cnblogs.com/westlin/p/11453341.html
Copyright © 2011-2022 走看看