1.介绍
分布式系统面临的-配置文件的问题:
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的.SpringCloud提供了配置服务器来解决这个问题,我们每一个微服务自己带着一个应用程序.yml,那上百的配置文件要修改起来,岂不是要发疯!
springcloud-config配置中心:
Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
Spring Cloud Config 分为服务端和客户端两部分:
服务端也称为分布式配置中心,是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。
配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理。并且可以通过git客户端工具来方便的管理和访问配置内容。
SpringCloud config分布式配置中心能干嘛
- 集中管理配置文件
- 不同环境,不同配置,动态化的配置更新,分环境部署,比如/dev /test/ /prod /beta /release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
- 将配置信息以REST接口的形式暴露
2.使用
1.我们使用github远程连接的方式,所以先在github建立远程仓库
2.建立本地仓库,将远程仓库与本地关联,这样就可以本地修改,push到远程仓库了
3.在改项目下建立application.yml文件,并进行编辑,然后push到远程
spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
4.创建两个新module,一个作为服务server端:spring-cloud-config-server,一个作为client端:spring-cloud-config-client
server端:spring-cloud-config-server
依赖:
<dependencies>
<!--eureka依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- config-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
spring配置
server:
port: 3344
spring:
application:
name: spring-cloud-config-server
cloud:
config:
server:
git:
uri: https://github.com/dlqqdl/springcloud-config.git
skip-ssl-validation: true
在启动类开启注解:@EnableConfigServer,启动服务,注意由于国内github很慢,老是timeout,报错就多重启几次,或者直接用gitee
通过:http://localhost:3344/application-dev.yml,就可以返回相关的配置信息
注意,读取方式有以下几种:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
client端:spring-cloud-config-client
依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
在git上添加spring配置:config-client.yml
spring:
profiles:
active: dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: spring-cloud-config-client
#eureka配置
eureka:
client:
service-url: #获取服务的地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
---
server:
port: 8202
spring:
profiles: test
application:
name: spring-cloud-config-client
#eureka配置
eureka:
client:
service-url: #获取服务的地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
配置该模块client服务的配置:
有两个:bootstrap.yml和application.yml,bootstrap.yml是系统级的,可以防止多个配置之间的冲突,优先级高于application.yml
bootstrap.yml:
#系统级的配置,优先级大于application.yml
spring:
cloud:
config:
uri: http://localhost:3344 #这是客户端,需要从服务端去获取配置,而服务端去git上获取数据
label: master #需要寻找的分支 branch
name: config-client #需要服务端从git上获取的资源名称,不用跟后缀名
profile: dev #对于一个配置文件的多套环境,如dev test等,这里选择需要的配置块
application.yml:
spring:
application:
name: spring-cloud-config-client
我们可以通过RestController来看一下,是否获取到了配置信息:@Value是注入信息,这些信息都是放在github上的
@RestController
public class ClientController {
@Value("${spring.application.name}")
private String application;//服务名称
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;//Eureka信息,这里我们是配置在git上的,所以可以在这里获取一下
@Value("${server.port}")
private String serverPort;//端口
@GetMapping("/getConfig")
public String getConfig(){
return "application.name:"+application+"<br/>"+
"eureka.client.service-url.defaultZone:"+eurekaServer+"<br/>"+
"server.port:"+serverPort;
}
}
编写启动类,启动服务,通过getMapping的url测试:
可以看出我们没有在本模块配置这些信息,但是都获取到了,包括启动需要的8201端口,这是因为在启动时就会用bootstrap.yml去对于的git获取相应的信息并配置到本服务中。
3.实例
既然前面讲了怎么使用spring-cloud-config,那我们就可以将前面用到的模块的配置信息都放到远程看看。
这里我们试一下将spring-cloud-eureka和spring-cloud-provider-dept的配置文件放到github
为了和以前的区分,还是新建项目,除了配置文件,全部都按照以前的代码复制进去即可
将原有的application放到github:
除了已有的依赖还要添加新的依赖:以spring-cloud-eureka的备份:spring-cloud-config-eureka为例
<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>
新建bootstrap.yml:不需要application.yml,因为已经放在github上面了
spring:
cloud:
config:
uri: http://localhost:3344
label: master
name: config-eureka
profile: dev
先启动spring-cloud-config-server这个服务,然后启动spring-cloud-config-eureka,测试:访问http://localhost:7001/
可以看到,服务内是没有配置端口的,github上配置的是7001端口,获取信息并启动成功了,其他的也是一样的。