前言:
微服务的特点,在本系列文章的第一篇已经介绍了。我们只描述了他的优点,分布独立,模块之间耦合度低,但是这些优点相应的也会带来很多问题,比如,运维困难。产品上线之后,各个微服务都运行着,有着独立的配置文件,当我们需要修改配置配置文件时,需要一个一个去修改 ,这样异常的不方便。那么有没有一种方式能把所有微服务的配置文件集中管理起来呢。spring cloud这么强大,当然给出了对应解决方案-----------------------springcloud config。
1、Spring Cloud Config分布式配置中心
为微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部支持。分为 服务端 和客户端两部分(Eureka类似)
- 服务端 也称为分布式配置中心,是一个独立的微服务应用,用来连接配置服务器,并为客户端提供获取配置信息,加密、解密等访问接口。
- 客户端则是通过制定的配置中心来管理资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息 配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。(如下图)
这个交互过程大概如下:我们的配置文件统一放在远程厂库中,也就图上的Repository
。微服务充当这个配置中心的客户端也就是Client
。当它需要配置文件的时候,问Config server
索要,这个就是配置中的服务端。服务端再从远程厂库
获得对应的配置文件。
主要能干嘛:
1、集中管理配置文件
2、运行期间动态调整配置,不需要再为每一个部署在服务器上的机器上编写配置文件,服务器会向配置中心统一拉取配置文件
3、当配置发生变动时,服务不需要重启既可以感知配置的变化
4、配置的信息以Rest接口的形式暴露
2、Spring Cloud config工程搭建
搭建目标
1、搭建microservice_config_server3344 模块
2、搭建工程microservice_config_client 模块
在搭建这个测试模块之前,还得先解决一个问题,那就是远程仓库。我这选择Github
充当远程厂库。我事先在上面建立好了一个仓库。
等一下我们编写的配置文件,都要上传在上面了。
我们先搭建配置中心的服务端。看他能否获取github上的配置文件。先创建一个
1、编写一个测试的配置文件application.yml
内容如下
spring:
profiles:
active:
- dev
---
spring:
profiles: dev #开发环境
application:
name: microservice-config-dev
---
spring:
profiles: test #测试环境
application:
name: microservice-config-test
# 保存方式 必须 utf-8 不然提交会出错
注意编码格式必须是utf-8 不然提交的时候,可能会报错。
2、我们使用git
命令 将他提交到我们刚刚建立的那个远程仓库中。过程省略…
现在开始搭建工程microservice_config_server3344
1、在父工程下面新建一个model
2、引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--配置中心 服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
3、编写配置中心的配置文件application.yml
server:
port: 3344
spring:
application:
name: microservice-config-server3344
# github上的地址
cloud:
config:
server:
git:
uri: [email protected]:Liuzihao169/microservice-config.git
4、编写启动类 开启Config服务端注解
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication3344.class,args);
}
}
5、开始测试
启动服务之后,浏览器输出http://localhost:3344/application-dev.yml
spring:
application:
name: microservice-config-dev
profiles:
active:
- dev
浏览器输出http://localhost:3344/application-test.yml
spring:
application:
name: microservice-config-dev
profiles:
active:
- dev
说明我们的config-server已经跟github连接起来,能够读取到gitHub上的配置文件信息。只要我们的客户端与服务端一连接起来,那么客户端就可以通过服务端,读取github上的信息。也就达到了集中管理的目的。
创建一个配置的服务端microservice_config_client3355
通过服务端向config-server中获取配置信息。在配置之前创建一个配置文件microservice-config-client.yml
然后上传到githu上。
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev #生产环境
application:
name: microservice-config-dev
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7001:7001/eureka
---
server:
port: 8202
spring:
profiles: test #测试环境
application:
name: microservice-config-test
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7002:7002/eureka
上穿过程省略…
下面开始搭建:
1、创建model
2、编写配置文件bootstrap.yml
虽然我们的配置文件是放在远程仓库当中,但是我们配置的客户端要与config-server联系的配置信息,也需要一个配置文件来指定,这就是bootstrap.yml
.
application.yml
是用户的资源配置
bootstrap.yml
是系统级别的配置文件,优先级别更高
spring:
cloud:
config:
profile: dev #激活那种环境下的配置文件
label: master
uri: http://localhost:3344 #config-server配置中心的地址
name: microservice-config-client #github上需要访问的配置文件名 不需要带有.yml
3、编写启动类
@SpringBootApplication
public class MicroCloudServiceConfigClient3355 {
public static void main(String[] args) {
SpringApplication.run(MicroCloudServiceConfigClient3355.class,args);
}
}
4、开始测试
为了测试配置的内容是否加载到容器当中。我使用spel表达式从容器中获取。创建一个controller
@RestController
public class DemoTestController {
@Value("${server.port}")
private String port;
@Value("spring.profiles")
private String profiles;
@Value("${eureka.client.service-url.defaultZone}")
private String eureka;
@GetMapping("/config")
public String config(){
return "port===>"+port+"====="+"profiles=====>"+profiles+"=========>eureka"+eureka;
}
}
启动服务,microservice_config_client3355
microservice_config_server3344
我们预期效果是使用 test配置下的信息。我们看到客户端的控制台打印了下面的信息:
2019-07-31 17:19:33.835 INFO 7388 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8202 (http)
我们能够预测,已经成功读取到了配置文件了。我们浏览器输入http://localhost:8202/config
port===>8202=====profiles=====>spring.profiles=========>eurekahttp://eureka7002:7002/eureka
说明我们正常读取到了配置文件中的信息啦。
总结:
1、我们通过Cloud config集中管理我们的配置文件,便于后期对配置文件的修改