在开发普通的 web 应用中,我们通常是将配置项写在单独的配置文件中,比如application.yml,application.properties,但是在微服务架构中,可能会出现数百个微服务,如果每个微服务将配置文件写在自身的配置文件中,会导致配置文件的管理非常复杂。因此集中式的配置管理是非常有必要的,每个服务启动时从集中式的存储库中读取需要的配置信息。其模型如下:
简单来说就是如下几点:
启动一个微服务实例时向配置管理服务请求获取其所在环境的特定配置文件
实际的配置信息驻留在存储库中。可以选择不同的实现来保存配置数据,包含:源代码控制下的文件、关系数据库或键值数据存储
应用程序配置数据的实际管理和应用程序无关。配置的更改通常通过构建和部署管道来处理
进行配置管理更改时,必须通知使用该配置的服务实例
由于本系列为 spring cloud,所以使用Spring Cloud Config来构建配置管理,当然还有很多其他优秀的解决方案(Etcd,Eureka,Consul...)。
二、构建配置服务spring cloud 是建立在 spring boot 的基础上的,因此需要有 spring boot 的构建基础。
1、pom 编写pom 主要依赖如下(篇幅原因列出主要内容,完整代码请到 github 上查看),spring boot 版本和 spring cloud 版本如下,之后不在赘述:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.4.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Camden.SR5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> 2、注解引导类只需在 spring boot 启动类上加入一个@EnableConfigServer注解即可。
3、配置服务配置编写(使用文件存储)这里是给配置服务使用的配置文件,用于声明端口,存储库类别等信息,并不是给其他微服务使用的配置。配置如下(使用文件存储配置信息):
server: port: 8888 spring: profiles: # 使用文件系统来存储配置信息,需要设置为native active: native cloud: config: server: native: # 使用文件来存放配置文件,为每个应用程序提供用逗号分隔的文件夹列表 searchLocations: file:///D:/configFolder/licensingservice 4、创建供应用程序使用的配置文件通过上面的searchLocations可知目前有一个名为 licensingservice 的应用程序,在对应目录下创建如下三个配置文件:
licensingservice.yml
server: port: 10010 spring: application: name: licensingservicelicensingservice-dev.yml
server: port: 10011licensingservice-prod.yml
server: port: 10012配置文件命名约定为:应用程序名称-环境名称.yml。现在启动应用便能通过 http 请求来获取配置了。
请求localhost:8888/licensingservice/default,返回结果如下:
{ "name": "licensingservice", "profiles": ["default"], "label": null, "version": null, "state": null, "propertySources": [ { "name": "file:///D:/configFolder/licensingservice/licensingservice.yml", "source": { "server.port": 10001, "spring.application.name": "licensingservice" } } ] }请求localhost:8888/licensingservice/dev,返回结果如下:
{ "name": "licensingservice", "profiles": ["dev"], "label": null, "version": null, "state": null, "propertySources": [ { "name": "file:///D:/configFolder/licensingservice/licensingservice-dev.yml", "source": { "server.port": 10011 } }, { "name": "file:///D:/configFolder/licensingservice/licensingservice.yml", "source": { "server.port": 10001, "spring.application.name": "licensingservice" } } ] } 二、和 spring boot 客户端集成