转载

SpringCloud实践分享 Config配置中心

在服务中经常会遇到一些易变的参数,例如数据库地址、超时时间等等。这些参数与代码关系耦合度低,但是每改一次就去修改代码中的参数,再去编译部署 显得很蠢,于是就有了配置中心得个实现。目前用的比较多的配置中心有SpringCloudConfig和携程的 Apollo 。 SpringCloudConfig的好处是和SpringCloud绑定,全家桶(有好处有坏处,你懂的),部署简单;而Apollo部署比较麻烦,它首先要把部署地址写死在apollo-client中编译出来, 然后在配置项目中引用apollo-client……(既然是配置中心,为什么配置中心本身不能做到代码和参数的解耦?!)当然,这都是我一些私货, 事实上apollo功能十分强大,权限功能完整,并且支持多语言,大家都知道携程的技术栈主要是.net。两种各有长短,有兴趣的同学可以去github上看看, 文档说明十分详细。书归正传,接下来主要讲Spring Cloud Config。

启动Config

Config的配置同样简单:加入依赖 spring-cloud-config-server ,入口类加入注解 @EnableConfigServer@EnableDiscoveryClient , 前一个注解是使能Config注册中心,后一个则是注册到Eureka上,让其他服务找到该服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
复制代码
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class, args);
    }
}
复制代码

Config Server配置

首先说注册中心Eureka相关内容,服务注册地址 eureka.client.serviceUrl.defaultZone 以及自己是谁 spring.application.name 即可。 我在这里加上 prefer-ip-address 的配置,后面会相信说明。

spring:
  application:
    name: config-server
eureka:
  instance:
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
复制代码

然后是就是配置中心相关内容。配置中心一般采用git或svn才作为配置存储端,官方文档上还有以jdbc数据库来存储的,本文以git来说明。 其中 spring.cloud.config.server.uri 是配置文件存放的git地址,为了更直观演示,我在gitee上配置相应的内容。 而 search-paths 则是在该库下的搜索路径,我们这里配置成了 '{application}' 代表不同服务会去git项目下找与项目名( spring.application.name )对应的文件。 其规则为 {application}-{profile}.yml

例如,服务A中 spring.application.name: fuwu1 ,则服务A在启动的时,配置中心则会找 git.uri 下的 fuwu1.yml 文件交给服务A作为配置。 服务A启动时,带有 -Dspring.profiles.active=master 参数时,则会配置中心则会找 git.uri 下的 fuwu1-master.yml 文件交给服务A作为配置。

配置同样需要有权限管理,而配置中心的权限逻辑和git相同(如果你使用git作为存储后端)。 我们可以配置 usernamepassword ,如果需要有更高的要求,还可以和git一样,配置公钥私钥。在git上放上公钥, 在 private-key 这里直接填写私钥内容,你甚至可以代码上去掉权限信息,而在部署的服务器中配上私钥。总之,git是怎么配它就是怎么配置。 (git相关内容点击这里)

还有一种配置路径的逻辑大概是这样: uri: git@your-git-address:your-config-repo/{application}.git ,不同的项目配置放在不同的仓库, 这样可以配置不同仓库的权限。如果是这样配置,仓库里的文件命规则是 application-{profile}.yml

spring:
  cloud:
    config:
      server:
        git:
          uri: git@gitee.com:yangzijing/config.git
          search-paths: '{application}'
          #uri: git@your-git-address:your-config-repo/{application}.git
          #private-key:
          #username: yourusername
          #password: yourpassword
复制代码

Config客户端配置

客户端配置同样也是两类,eureka的配置和config的配置,要注意这些配置要写在bootstrap.yml中。简单来讲bootstrap和application的区别, bootstrap.yml中的配置先启动,application.yml中的配置后启动,而需要动态配置的配置项则写在application.yml中。

Eureka相关的配置不再赘述,主要关心一下config的配置。配置可以有两种,1)指定config的ip,直接在 spring.cloud.config.uri 配上地址即可。 2)通过Eureka找到Config的地址,配置 spring.cloud.config.discovery.enabled=truediscovery.service-id (这里的service-id和config项目的 spring.application.name 名字一致,其默认值是configserver)。

spring:
  application:
    name: api-admin
  cloud:
    config:
      #uri: http://ip:port
      discovery:
        enabled: true
        service-id: config-server
复制代码

在api-admin项目中,增加了一个 from 配置,在 application.yml 可写可不写,如果写,还可以添加默认值 from: ${from:hello} ;如果不写,也可以, 同样也可以在java文件中直接引用,例如:

@Value("${from}")
private String from;
复制代码

但是要注意的是,使用了配置中心功能后,如果占位符(${xxx})没有被正确替换,整个程序是会报错了,不管你用了没用默认值,这个是不科学的。

利用WebHook自动刷新

在引用了配置的类上添加 @RefreshScope 注解,即可实现自动刷新,还有一点,需要在git中的webhook(例如GitHub,GitLab,Gitee)添加上http://config-ip:port/bus/refresh即可。

流程大致为: git仓库更新 -> 触发webhook-> 触发config的刷新端点-> config通知应用 -> 应用刷新配置内容。

遇到的一个prefer-ip-address问题

在调试过程中发现一个问题,如果在config服务端 prefer-ip-address 没有打开,客户端则会找不到config服务端。在网上找了一下关于该配置的解释, 希望对大家有用 prefer-ip-address机制解释

config的大致内容就说完了,可能还差配置内容加密,稍微有些繁杂,有机会再补充,急需可以查一下官方文档,或者别的中文博客

原文  https://juejin.im/post/5d84a8756fb9a06b065cade0
正文到此结束
Loading...