使用 spring cloud 实现分布式配置管理
分布式配置管理应该是分布式系统和微服务应用的第一步。想象一下如果你有几十个服务或 应用需要配置,而且每个服务还分为开发、测试、生产等不同维度的配置,那工作量是相当大的, 而且还容易出错。如果能把各个应用的配置信息集中管理起来,使用一套机制或系统来管理,那么 将极大的提高系统开发的生产效率,同时也会提高系统开发环境和生产环境运行的一致性。![]()
在传统开发中我们往往需要自己开发“配置管理服务器”,你可以使用 redis、ldap、zookeeper、 db等来存放统一配置信息,然后开发一个管理界面来进行管理。传统的做法没什么问题,和 spring cloud 所提供的配置管理方案相比,就是前者需要自己开发,而后者直接简单使用现成的组件即 可。当然还有很重要的一点,spring 配置管理模块由于是 spring boot 核心来实现的,因此做了大量 的工作,可以把一些启动参数进行外部配置,这在传统的方案中是很难办到的,因为涉及到要改写 第三方组件的问题,难度很大。比如 web 应用的绑定端口,传统应用只能在 tomcat配置文件里 改,而 spring cloud 却可以放到远程,类似的还有数据库连接、安全框架配置等。
@SpringBootApplication @EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args)
{ SpringApplication.run(ConfigServerApplication.class, args);
}
server.port=8888
如此以来,配置文件服务器就建立好了,可以直接启动了,服务端口是 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
此时应用就会加载测试环境下的配置信息。