Spring Config 高可用配置中心

曾经我们都把配置文件跟应用放在一起,在单体应用的时代,没什么问题。随着业务的增长,促使我们的系统架构往服务化发展,应用越来越多,配置也越来越多了,还会有很多重复的配置,一次修改,需要部署重启所有节点。后来有了很多开源的配置中心,有接触过的有Disconf,都很不错。在spring cloud的整个生态下,我们有Spring Confg帮我们解决配置管理的问题,结合Spring Cloud Bus,我们能够实现配置的动态刷新。

1.快速开始

Spring Config默认的配置仓库是使用git,其实大多数公司还是沿用以前的svn来管理代码,接下来,我们来用svn来做配置仓库,存储配置信息。

1.1新建config-server项目

用Spring Tool Suit中的 Spring starter Project新建一个config-server项目

在接下来的步骤中,选择maven依赖:Cofig Server,Eureka Discovery,不用STS集成环境的,可以自己在pom文件中加入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--将config-server注册成eureka服务,实现高可用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--用于连接svn服务器-->
<dependency>  
    <groupId>org.tmatesoft.svnkit</groupId>  
    <artifactId>svnkit</artifactId>  
</dependency>  

注意一下svnkit这个包是为了连接svn服务器用的,一定要加上。

接下来,在项目的启动类上加上注解:

@SpringBootApplication
@EnableConfigServer
public class Application {

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

1.2配置文件

在application.properties文件中增加以下配置:

#注册到eureka的服务名称
spring.application.name=config-server
server.port=4999
#eureka服务器使用ip注册发现服务
eureka.instance.prefer-ip-address=true
#eureka服务器地址
eureka.client.service-url.defaultZone=http://192.168.10.31:1111/eureka

#开启spring config配置服务
spring.cloud.config.enabled=true
#使用svn作为配置仓库,必须显示声明profiles.active=subversion,不然还是用的git  
spring.profiles.active=subversion
#svn仓库位置
spring.cloud.config.server.svn.uri=svn://192.168.10.31/workspace/config-center
#svn用户名
spring.cloud.config.server.svn.username=config.server
#svn密码
spring.cloud.config.server.svn.password=123456
#指定搜索仓库中的某个目录,目录通过application占位符指定
spring.cloud.config.server.svn.search-paths={application}
#svn默认的目录是trunk
spring.cloud.config.server.svn.default-label=trunk
#默认在系统临时目录下面,需要调整一下避免临时文件被系统自动清理
spring.cloud.config.server.svn.basedir=/data
#默认是使用安全认证的
management.security.enabled=false
logging.level.org.springframework.boot=debug

配置完成之后,我们启动config-server服务,完成配置服务器的搭建。 接下来,我们在svn指定目录中新建我们的配置文件。

上图中:myProject为我们的项目,默认的配置文件为myProject.properties。 myProject-dev.properties为测试环境配置,myProject-prod.properties为生产环境配置。 通过设置spring.profiles.active属性可激活对应的配置文件,profile的配置会覆盖默认的配置。 Spring Config服务默认提供HTTP的接口来访问配置信息,返回JSON格式数据。HTTP接口访问遵循以下URL格式

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

application是Spring应用中的spring.config.name指定的名称。 profile:配置文件所对应的多环境配置 label是可选的标签,git默认为master,svn默认是trunk。 启动服务器,我们通过 http://localhost:4999/myProject/dev 即可获取到对应的dev环境的配置 返回的数据会包括myProject.properties,myProject-dev.properties两个文件中的配置信息。

1.3客服端访问

新建一个客户端项目 config-client pom文件中增加以下依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</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-eureka</artifactId>
    </dependency>

为了能够加载外部的配置信息,client端的配置只能写在bootstrap文件中,bootstrap文件优先级是最高的。

#应用名称
spring.application.name=myProject
#默认激活的配置
spring.profiles.active=dev
#eureka服务器使用ip注册发现服务
eureka.instance.prefer-ip-address=true
#eureka服务器地址
eureka.client.service-url.defaultZone=http://192.168.10.31:1111/eureka
#高可用配置中心通过服务Id去自动发现config-server服务组  
spring.cloud.config.discovery.enabled=true
#配置服务在eureka中的服务id
spring.cloud.config.discovery.service-id=config-server
#需要激活的配置
spring.cloud.config.profile=dev
#使用svn配置时lable是trunk  
spring.cloud.config.label=trunk
management.security.enabled=false

logging.file=d:/logs/${spring.application.name}.log
logging.level.org.springframework.boot=debug

为了方便测试,我们用暴露一个HTTP方法来获取配置

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class Application {

    @Value("${test.name}")
    private String test;

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

    @RequestMapping("/test")  
    public String from() {  
        return this.test;  
    }  

}

启动之后,通过浏览器访问 http://localhost:4306/test 返回配置文件中配置的值:hello word!

当然,我们需要在配置文件中加入配置信息

test.name=hello word!

同时,你会发现,我们的bootstrap中并没有配置服务端口4306,这个配置我们放在myProject-dev文件中,证明启动的时候,就已经正确的从配置服务器加载配置信息了。

配置中心高可用

Spring Config配置服务实现高可用非常简单,只要按照以上配置,将config-server注册到eureka服务注册中心,启动多个实例即可实现高可用。

子目录管理项目配置

前面我们已经可以通过Spring Config管理配置,也实现了配置中心的高可用。伴随的项目的逐渐增多,我们发现配置文件都放在一个文件夹下面,容易搞混淆,我们需要每个项目的配置文件放在一个独立目录下,并且所有项目能共享一些公共的配置。 Spring Config支持占位符的形式来查找配置仓库,可以支持{application},{profile},{label},经过测试,要现实子目录的形式,需要用到{application}的方式。 要现实子目录的方式,我们需要在配置服务端增加以下配置:

#指定搜索仓库中的某个目录,目录通过application占位符指定
spring.cloud.config.server.svn.search-paths={application}

这样指定之后,我们的trunk目录下就变成这样了,每个项目的配置单独一个文件夹,非常清晰。

项目文件夹(红色划线部分,名称必须一致)

重启我们的配置服务器,通过以下地址,即可访问到myProject-1项目的dev配置

http://localhost:4999/myProject-1/dev

自动刷新

通过以上步骤,我们已经实现了高可用配置中心,并实现了在客服端访问配置中心的配置信息。 这个时候,你突然发现,修改了一个配置,提交到svn服务器之后,客户端并没有获取到最新的配置。这样就存在一个问题,当我们在线上环境修改了配置之后,我们必须要重新受影响的应用服务(配置服务客户端,配置服务器端可以不重启)才能得到最新的配置信息。 后续,我们将通过Spring Cloud Bus实现配置的自动更新。

results matching ""

    No results matching ""