SpringCloud实践分享 Config配置中心

853 阅读5分钟

简介

在服务中经常会遇到一些易变的参数,例如数据库地址、超时时间等等。这些参数与代码关系耦合度低,但是每改一次就去修改代码中的参数,再去编译部署 显得很蠢,于是就有了配置中心得个实现。目前用的比较多的配置中心有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的大致内容就说完了,可能还差配置内容加密,稍微有些繁杂,有机会再补充,急需可以查一下 官方文档,或者别的中文博客