分散式配置管理应该是分散式系统和微服务应用的第一步。想象一下如果你有几十个服务或应用需要配置,而且每个服务还分为开发、测试、生产等不同维度的配置,那工作量是相当大的,而且还容易出错。如果能把各个应用的配置资讯集中管理起来,使用一套机制或系统来管理,那么将极大的提高系统开发的生产效率,同时也会提高系统开发环境和生产环境执行的一致性。
在传统开发中我们往往需要自己开发“配置管理服务器”,你可以使用redis、ldap、zookeeper、db等来存放统一配置资讯,然后开发一个管理界面来进行管理。传统的做法没什么问题,和spring cloud所提供的配置管理方案相比,就是前者需要自己开发,而后者直接简单使用现成的元件即可。当然还有很重要的一点,spring 配置管理模组由于是spring boot核心来实现的,因此做了大量的工作,可以把一些启动引数进行外部配置,这在传统的方案中是很难办到的,因为涉及到要改写第三方元件的问题,难度很大。比如web应用的系结埠,传统应用只能在tomcat配置档案里改,而spring cloud却可以放到远端,类似的还有数据库连线、安全框架配置等。
要使用spring cloud分散式配置档案总体上分为3个大的步骤,首选你需要建立存放配置档案的仓库,然后建立一个配置档案服务器,该服务器将配置档案资讯转化为rest界面资料,然后建立一个应用服务,该服务演示使用分散式配置档案资讯。
1)建立配置档案存放仓库
Spring cloud使用git或svn存放配置档案,预设情况下使用git,因此你需要安装git私服或者直接使用互联网上的github或者git.oschina,这里推荐使用git.oschina。本文示例使用的是git.oschina,建立好git工程后,也就是文章开头所提到的工程,在此工程再建立一个资料夹cloud-config-repo来存放配置档案。然后建立两个配置档案:
cloud-config-dev.propertiescloud-config-test.properties 这两个档案分别对应开发环境和测试环境所需要的配置资讯,配置资讯如下:
mysqldb.datasource.url=jdbc:mysql://10.0.12.170:3306/test?useUnicode=true&characterEncoding=utf-8
mysqldb.datasource.username=csst
mysqldb.datasource.password=csst
logging.level.org.springframework.web:DEBUG
配置资讯提供了数据库连线引数等,这是因为后面的应用服务中使用到了数据库。
2)建立spring cloud配置服务器
配置档案仓库建立好了后,就需要建立配置管理服务器,如前所述该服务器只是将配置档案转换为rest界面服务,不做其它用途。这个服务器的功能也是spring cloud提供的,所以我们只需要引入相关jar包,稍微设定一下即可。建立该服务应用,你需要首选建立一个空的maven工程:
然后在这个工程中增加一个类,命名为:ConfigServerApplication,程式码如下:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
可以看到,我们只需要用@EnableConfigServer启用该应用为配置档案服务器即可。如此以来该应用启动后就会完成前面提到的功能,即:读取远端配置档案,转换为rest界面服务。
当然,需要配置远端配置档案读取路径,在application.properties中:
server.port=8888
spring.cloud.config.server.git.uri=https://git.oschina.net/zhou666/spring-cloud-7simple.git
spring.cloud.config.server.git.searchPaths=cloud-config-repo
其中server.port是配置当前web应用系结8888埠,git.uri指定配置档案所在的git工程路径,searchPaths表示将搜寻该资料夹下的配置档案(我们的配置档案放在spring-cloud-7simple这个工程的cloud-config-repo资料夹下)。
最后,还需要在pom档案中增加配置服务器的相关依赖:
org.springframework.cloud
spring-cloud-config-server
如此以来,配置档案服务器就建立好了,可以直接启动了,服务埠是8888,应用只需要系结改服务器的uri和埠号就可以拿到配置资讯了。
3) 建立一个服务使用该远端配置
现在可以建立一个服务使用该远端配置了,你可以在远端配置中定义一个简单的自定义资讯,比如:
my.message=helloword
然后使用前面我们提到的spring boot helloworld应用来读取这个资讯。当然,限于篇幅我们直接使用比较复杂的一个服务来演示这个配置管理器的使用,这个服务需要用到数据库访问,数据库访问层我们使用的是mybaits,资料表只有一个,DDL如下:
CREATE TABLE `user` (
`id` varchar(50) NOT NULL DEFAULT '',
`username` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立好资料表后,回到我们的应用服务:
该服务使用DataSourceProperties封装了mybatis载入配置资讯。要拿到远端配置资讯,需要设定配置管理服务器地址,该配置设定在:
bootstrap.properties
该配置档案资讯如下:
spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}
spring.cloud.config.name=cloud-config
spring.cloud.config.profile=${config.profile:dev}
其中config.uri指定远端载入配置资讯的地址,就是前面我们刚建立的配置管理服务器的地址,系结埠8888,其中config.port:8888,表示如果在命令列提供了config.port引数,我们就用这个埠,否则就用8888埠。config.name表示配置档名称,检视我们前面建立配置档案,是这个名称:
cloud-config-dev.properties
可以分成两部分: {application}- {profile}.properties
所以我们配置config.name为cloud-config,config.profile为dev,其中dev表示开发配置档案,配置档案仓库里还有一个测试环境的配置档案,切换该配置档案只需要将dev改为test即可,当然这个引数也可以由启动时命令列传入,如:
java -jar cloud-simple-service-1.0.0.jar --config.profile =test
此时应用就会载入测试环境下的配置资讯。