目录
前言
本章内容就是学习springcloud中的服务配置中心(config)
什么是服务配置中心?
在一开始我们就知道微服务的架构与单机项目之间有什么区别,也就是多台服务器之间的区别。那么因为微服务的分布式架构往往一个项目需要分开部署到各台服务器上,所以也代表着如果要更改一些yml配置文件的话,那相对而言是一个非常大的一个工程了,比如:mysql配置的一个用户名和密码。那么为了简化维护项目的工程,springcloud增加了服务配置中心(config)的一个解决措施,也就是来加快开发人员维护的效率。
本次我的项目的配置文件存放在github上https://github.com/liwangwang321/configserver
当然也可以放到码云等平台,svn本地仓库也行。
config-server从github获取数据
1、创建模拟配置数据
代码可参考git上:https://github.com/liwangwang321/configserver
2、创建config-server服务配置中心服务端
创建项目名:microservice-config-server-4001
这个项目的配置文件就增加了这个依赖
<!--服务配置中心的config服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--保持使用版本的一致1.0-SNAPSHOT-->
<parent>
<groupId>com.liwangwang</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-config-server-4001</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--服务配置中心的config服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml文件
server:
port: 4001
spring:
application:
name: microservice-config
cloud:
config:
server:
git:
uri: https://github.com/liwangwang321/configserver.git
search-paths: aaa,bbb
启动类:
3、测试
仓库中的配置文件会被转换成web接口,访问可以参照以下的规则:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
以springcloud-config-dev.properties为例,它的application是springcloud-config,profile是dev,label是分支的意思,如果只有一个主分支,可以不写,默认会访问master分支,client会根据填写的参数来选择读取对应的配置。
我们对上面的一个代码进行一个改造咱们再来看看
看结果:
路径:http://localhost:4001/application-test.yml
路径:http://localhost:4001/application-dev.yml
config-client(Erueka)从config-server获取配置
1、创建模拟配置文件(erueka_config.yml)
代码可参考git上:https://github.com/liwangwang321/configserver
yml文件讲解:
配置文件控制
2、创建config-client-erueka配置中心客户端
创建名:microservice-eureka-server-config-2004
pom.xml增加文件
<!--从配置中心的获取-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- eureka是一个服务注册,服务发现框架基于rset的服务,这个是服务注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
pom.xml全文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--保持使用版本的一致1.0-SNAPSHOT-->
<parent>
<groupId>com.liwangwang</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-eureka-server-config-2004</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--从配置中心的获取-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- eureka是一个服务注册,服务发现框架基于rset的服务,这个是服务注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
简单的说:bootstrap.yml会比application.yml读取的优先级更高,读完了bootstrap.yml文件才会读后面的配置
bootstrap.yml
spring:
application:
name: microservice-eureka-server-config
cloud:
config:
name: eureka_config
uri: http://configserver.javawwl.com:4001 # 配置configserver地址
profile: test # 级别
label: master # 分支 git中 默认master
application.yml
spring:
application:
name: microservice-eureka-server-config
启动类
3、测试
在bootstrap文件中使用dev级别(2004)。
测试路径:http://localhost:2004
在bootstrap文件中使用test级别(2005)。
测试路径:http://localhost:2005
config-client(provider)从config-server获取配置
1、创建配置模拟数据(provider_config.yml)
代码可参考git上:https://github.com/liwangwang321/configserver
因为长度问题,自行看代码即可,跟上面的案例差不多
2、创建config-client-provider配置中心客户端
创建名字:microservice-student-provider-config-1004
pom.xml增加了
<!--config配置中心的客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
全体pom.xml文件
额,有很多文件都不是本次测试所需要的,但是装了也不影响
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--保持使用版本的一致1.0-SNAPSHOT-->
<parent>
<groupId>com.liwangwang</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-student-provider-config-1004</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--相当于全局的一个依赖关系,这个导入能确保整个项目使用的包版本一致
比如全局中的: spring-cloud-dependencies
spring-boot-dependencies
druid-spring-boot-starter
-->
<dependency>
<groupId>com.liwangwang</groupId>
<artifactId>microservice-common</artifactId>
</dependency>
<!--处理web请求-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--test测试的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--使用的数据库关系映射框架是jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--使用的是mysql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--使用tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!--druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--需要引入公共模块的实体类等(在导入的时候出现)-->
<dependency>
<groupId>com.liwangwang</groupId>
<artifactId>microservice-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- actuator监控引入,点击后的追责 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--添加注册中心Eureka相关配置,就是说这个是客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--config配置中心的客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--Hystrix相关依赖,用来处理服务处理异常情况-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
bootstrap.yml
spring:
application:
name: microservice-student-provider-config
cloud:
config:
name: provider_config
uri: http://configserver.javawwl.com:4001 # 配置configserver地址
profile: dev # 级别
label: master # 分支 git中 默认master
application.yml
spring:
application:
name: microservice-student-provider-config
启动类
3、测试
可以自行修改测试。
在bootstrap文件中使用dev级别(1007)。
provider_config.yml
http://localhost:2004
成功注册进了erueka的中心,这也代表着成功从配置中心获取到了配置信息。
配置搜索路径
代码可参考git上:https://github.com/liwangwang321/configserver
在application.yml文件中
打开config-server配置中心:
输入:http://localhost:4001/nns-test.yml
输入:http://localhost:4001/nns2-dev.yml
自行测试
输入:http://localhost:4001/nns-dev.yml
输入:http://localhost:4001/nns3-dev.yml
后记
一个仓库的的配置文件都存放在这,
简单的说就是自己的本地仓库。
随着分布式项目越来越大,勤劳的程序猿们会开始面临一个挑战,配置文件会越来越繁杂,虽然spring提供了一个鸡肋版的解决方案,spring.profiles.active,在大型的分布式项目体系中,聊胜于无吧,手动维护配置文件的痛苦,生产,UAT,测试,开发环境的隔离,额外的配置文件,如:logback.xml日志的配置文件,bootstrap.properties配置文件,当系统中有几十个服务,相应的会有上百个配置文件,简直就是史诗级的灾难大片,每次发布上线,都要手动去检查配置文件,相应的服务都需要重启,那么,有没有一种方案,可以自动更新配置,并且对版本做出相应的控制,恰好,springcloud为我们提供了这样一种工具,虽然很多方面都还不完善,配置能力比较弱,但是也给我们提供了一种思路。
市面上有很多配置中心,BAT每家都出过,360的QConf、淘宝的diamond、百度的disconf都是解决这类问题。国外也有很多开源的配置中心Apache Commons Configuration、owner、cfg4j等等。这些开源的软件以及解决方案都很优秀,也存在这样或者那样的缺陷。今天我们要了解的Spring Cloud Config,可以无缝的和spring体系相结合,够方便够简单颜值高。
参考博客:https://www.cnblogs.com/babycomeon/p/11134717.html