SpringCloud(二)配置中心 - Go语言中文社区

SpringCloud(二)配置中心


SpringCloud(二)配置中心

SpringCloud配置中心以外部配置文件(键值对或者等效的YAML文件)作为资源的向客户端提供Rest服务,使其通过配置中心即可获取对应的配置信息。SpringCloud配置中心支持本地文件仓库,Git仓库和SVN仓库作为配置文件仓库,并可以实现客户端启动时加载配置文件,动态刷新配置文件。

服务端配置

服务端需要在pom文件中引入依赖,spring-cloud-config-server是服务端最主要的依赖,spring-cloud-starter-bus-amqpspring-cloud-config-monitor主要是为了实现配置的动态刷新。spring-boot-starter-security主要负责配置文件敏感信息的加解密。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--spring cloud 配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

配置中心服务端的启动类需要增加@EnableConfigServer,表明这是一个配置中心的服务端。

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigApplicationStarter {

    public static void main(String[] args) {
        SpringApplication.run(ConfigApplicationStarter.class, args);
    }
}

bootstrap.yml配置文件中需要指定应用名称和配置仓库地址,这里为了实现动态刷新配置仓库使用的是一个Docker里面运行的GitLab(访问端口已修改为10800,初始用户名为root,密码为123456789)。也可以使用本地仓库或者直接使用GitHub。
配置中心也可以根据{application}/{profile}使用正则匹配的方式,实现不同项目或者不同环境设置个性化的配置仓库。spring.cloud.config.server.encrypt.enabled用于是否启用加密解密。

spring:
  application:
    name: config-server
  profiles:
    #active: dev,native
    active: dev,git
  cloud:
    config:
      server:
        #本地文件
        native:
          #用本地文件夹存储配置
          search-locations: file:d:\springcloud\config
        encrypt:
          enabled: true
        #git仓库 gitlab地址
        git:
          uri: http://172.16.4.105:10800/root/springCloudConfig.git
          #git项目可能有多个目录,但是配置文件可能会在某一目录下,可以指定目录
          search-paths: /
          username: root
          password: 123456789
          repos:
            #不同环境的不同配置仓库
            sms-serivce-production:
              pattern: '*/production'
              uri: http://172.16.4.105:10800/root/sms-serivce-production.git
            #不同项目不同库
            web-app-service:
              pattern:
                - web-app-service/**
                - web-app-service*
              uri: file:d:\springcloud\config

encrypt:
  #秘钥
  key: 123

作为一个SpringCloud项目,application.yml中要进行Eureka客户端的配置。另外需要设置management.security.enabledfalse使得刷新配置不需要权限验证。另外还需要配置访问时提供的用户名和密码,此处需要忽略/monitor路径,保证Git上配置文件后能够不用权限验证自动刷新配置。rabbitmq的配置主要是为了实现配置刷新。

info:
  name: Config Server

server:
  port: 8200


#rabbitmq的地址、用户名和密码
spring:
  rabbitmq:
    host: 172.16.4.39
    username: rabbitmq
    password: rabbitmq
  profiles:
    active: dev

#使得/refresh不需要权限验证
management:
  security:
    enabled: false
#访问时需要提供用户名和密码
security:
  #/monitor接口用于接收git刷新通知,不需要用户名密码校验
  ignored: /monitor
  user:
    name: chenxyz
    password: 123

# 不同环境的配置
---
spring:
  profiles: dev
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    preferIpAddress: true
---
spring:
  profiles: production
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
  instance:
    preferIpAddress: true

我们在GitLab上使用root用户创建springCloudConfig项目并新增web-app-service.ymlsms-service.yml文件。
启动配置中心(当然首先得启动Eureka服务端),访问http://localhost:8200/web-app-service/default读取到的内容和web-app-service.yml文件的内容一致。证明配置中心搭建成功。
服务端读取配置信息

客户端配置

客户端需要引入spring-cloud-starter-configspring-cloud-starter-bus-amqp两个依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- spring bus 事件通知实现自动刷新 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

WebApp项目

bootstrap.yml文件中增加配置中心的相关配置。配置中心的配置文件命名就是根据spring.cloud.config.name来匹配的,,profilelabel分别决定采用的环境化配置和Git项目的不同版本。Eureka通过serviceId查找配置中心的服务,同时这里也要配置访问配置中心的用户名和密码。

label可以使用commit idbranch或者tag。如果label中包含反斜杠/需要使用(_)替换。比如labelfoo/bar需要修改为foo(_)bar

spring:
  application:
    name: web-app-service
  cloud:
    config:
      discovery:
        enabled: true
        #配置中心的服务id
        service-id: config-server
      username: chenxyz
      password: 123
      #配置中心会覆盖本地配置
      override-none: false
      fail-fast: true
      name: ${spring.application.name}
      profile: ${spring.profiles.active}
      #git仓库中,可以使用label来做不同版本的配置管理 默认是master
      #label: '1.0'

application.yml需要配置注册中心Eureka的相关信息

spring:
  profiles:
    active: dev

---
spring:
  profiles: dev
#eureka配置
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      default-zone: http://eureka1:8761/eureka/
  instance:
    #心跳间隔
    lease-renewal-interval-in-seconds: 30
---
spring:
  profiles: production
#eureka配置
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      default-zone: http://eureka1:8761/eureka/,http://eureka1:8762/eureka/,http://eureka3:8761/eureka/
  instance:
    #心跳间隔
    lease-renewal-interval-in-seconds: 30

修改Git中的web-app-service.yml文件,配置对应的spring.rabbitmqmanagement.security.enabled=false以及sms.template属性。其中spring.rabbitmq.password对密码进行了加密。

info:
  name: Web App Service

server:
  port: 8101

#调用refresh的时候不校验权限
management:
  security:
    enabled: false

spring:
  profiles:
    active: dev
  rabbitmq:
      host: 172.16.4.39
      username: rabbitmq
      #password: rabbitmq
      passowrd: '{cipher}c0b6a30bcea3bdd48c8bb3459fae9dc7119943f96ee5233ea2fe5cfeb1ad4fa3'

sms:
  template: '{user_name},感谢您参与我们的活动'

要实现属性的加解密,首先要在配置中心中启用加密,并且设置加密秘钥。发送post请求至/encrypt接口获取到加密字符串。

curl localhost:8200/encrypt -d rabbitmq

请求加密接口
加密字符串需要使用{cipher}作为开头,这样从配置中心获取配置时会对加密字符串进行解密。
如果调用加解密方法失败。可参考SpringCloud不能加密,希望可以帮助到你。

实现一个读取配置文件的Controller。

@Controller
@RequestMapping("/sms")
@RefreshScope
public class SMSController {

    @Value("${sms.template}")
    private String smsTemplate;

    @RequestMapping("getSMSTemplate")
    @ResponseBody
    public String getSMSTemplate() {
        return smsTemplate;
    }
}

请求/sms/getSMSTemplate接口,可以看到成功读取到GitLab上的配置文件信息。其实如果没有读取成功项目启动就会启动失败,这里调用接口可以很直观的看到读取到的配置。
web-app成功读取配置

SMS短信服务

和WebApp项目类似,SMS短信服务(spring.applicain.name=sms-service)也进行配置中心客户端的设置。

配置文件刷新

当配置文件改变时,我们希望运行的客户端能够在不重启的情况下动态地修改配置项。SpringCloud配置中心提供了局部刷新、全局刷新和自动刷新三种刷新方式。在需要动态刷新的配置上添加@RefreshScope注解,当需要刷新的时候配置中心服务端会从Git上重新clone对应的项目,读取配置信息并且通知客户端重新加载。

局部刷新

当Git上针对某个应用的配置文件修改后,我们需要调用该应用/refresh接口。该应用的配置文件会自动刷新,并且不会导致其它应用的刷新。
调用局部刷新接口
局部刷新后的接口显示

全局刷新

当我们需要刷新所有应用的配置项时,可以调用任一应用的/bus/refresh接口(POST请求)实现全局刷新。
全局刷新

自动刷新

实现自动刷新需要设置在Git上设置Webhook,当有文件提交的时候触发服务端的/monitor接口,实现自动刷新。
如GitLab上的springCloudConfig项目,点击Setting>>Integrations
url设置为http://172.16.4.149:8200/monitor,这个地址是服务端的局域网地址,我们需要保证GitLab可以访问配置中心的服务端。如果使用GitHub实现动态刷新需要将配置中心部署到一个外网可以访问的服务器。


相关代码
SpringCloudDemo-Config


参考:
Spring Cloud Config Server

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chenxyz707/article/details/80467447
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 22:09:08
  • 阅读 ( 1182 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢