完整源码:https://gitee.com/wan-lianglin/springcloud-test
分布式系统面临的--配置文件的问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的的配置文件要修改起来,岂不是要发疯!
1.什么是SpringCloud config分布式配置中心
Spring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
Spring Cloud Config 分为服务端和客户端两部分;
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以通过git客户端工具来方便的管理和访问配置内容。
SpringCloud config分布式配置中心能干嘛
集中管理配置文件
不同环境,不同配置,动态化的配置更新,分环境部署,比如/dev /test/ /prod /beta /release 一
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
将配置信息以REST接口的形式暴露
SpringCloud config分布式配置中心与github整合
由于Spring Cloud Config默认使用Git来存储配置文件(也有其他方式,比如支持SVN和本地文件),但是最推荐的还是Git,而且使用的是http / https 访问的形式;
2.Config:服务端连接远程仓库
1.新建一个服务springcloud-config-server-3344
![](https://img-blog.csdnimg.cn/img_convert/5c8521a07c9671c4830a5f9389b967e0.png)
2.导入依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.wll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-server-3344</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- actuator 完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
</project>
3.配置gitee远程仓库
![](https://img-blog.csdnimg.cn/img_convert/f0d6a6da305b1446aa4fbd0c318955c8.png)
远程仓库的application.yml文件内容:
spring:
profiles:
active: dev
---
spring:
profiles: dev
application:
name: springcloud-config-dev
---
spring:
profiles: test
application:
name: springcloud-config-test
4.配置application.yml文件,连接远程仓库
server:
port: 3344
spring:
application:
name: springcloud-config-server
#连接远程仓库
cloud:
config:
server:
git:
uri: https://gitee.com/wan-lianglin/springcloud-test.git #gitee远程仓库的https地址
# 通过config-server可以连接到git,访问其中的资源以及配置~
5.启动类
package com.wll.spingcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class Config_Server_3344 {
public static void main(String[] args) {
SpringApplication.run(Config_Server_3344.class,args);
}
}
6.启动该服务,访问localhost:3344/application-test.yml:
![](https://img-blog.csdnimg.cn/img_convert/f71d5c799289b1f17025791835908085.png)
访问localhost:3344/application-dev.yml
![](https://img-blog.csdnimg.cn/img_convert/04f89a0db43448b11f5c94e36413a834.png)
可以看到成功访问远程仓库。
3.Config:客户端连接远程仓库
1.在本地仓库新建config-client.yml文件,并push到远程仓库
spring:
profiles:
active: dev
---
server:
port: 8201
#spring配置
spring:
profiles: dev
application:
name: springcloud-provider-dept
#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配置
spring:
profiles: test
application:
name: springcloud-provider-dept
#Eureka配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
2.新建服务springcloud-config-client-3355
![](https://img-blog.csdnimg.cn/img_convert/bb80abce208b93d5802a37853cfcebea.png)
3.导入依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.wll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-client-3355</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- actuator 完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
</project>
4.yml配置文件(bootstrap.yml和application.yml)
bootstrap.yml:
# 系统级别的配置
spring:
cloud:
config:
name: config-client #对应远程仓库的yml文件名
profile: dev
label: master #远程仓库的分支
uri: http://localhost:3344 #config-server的启动端口
application.yml:
# 用户级别配置
spring:
application:
name: springcloud-config-client-3355
5.启动类
package com.wll.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClient_3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355.class,args);
}
}
6.编写一个controller层用于测试
package com.wll.springcloud;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig(){
return "applicationName: "+applicationName+
"eurekaServer: "+eurekaServer+
"port: "+port;
}
}
使用客户端微服务(springcloud-config-client-3355)连接服务端微服务(springcloud-config-server-3344)中连接好的远程仓库。在controller层获取到远程仓库中的yml值:
![](https://img-blog.csdnimg.cn/img_convert/1b0ccaed7e81069f338c3f021fe9760d.png)
可看到,通过8201端口/config成功获取到远程仓库的yml文件信息。
后面我们只需要改变bootstrap.yml中的profile: dev改为profile: test,就可以改变端口为8202了
4.实战测试
1.新建远程yml配置文件,并push到远程仓库
config-eureka.yml:
spring:
profiles:
active: dev
---
#端口号
server:
port: 7001
#spring
spring:
profiles: dev
application:
name: springcloud-config-eureka
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureka服务端的实例名称
client:
register-with-eureka: false #表示是否向eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url: # 监控页面
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
---
#端口号
server:
port: 7001
#spring
spring:
profiles: test
application:
name: springcloud-config-eureka-test
#Eureka配置
eureka:
instance:
hostname: eureka7001.com #Eureka服务端的实例名称
client:
register-with-eureka: false #表示是否向eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url: # 监控页面
defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
config-dept.yml:
spring:
profiles:
active: dev
---
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.wll.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
profiles: dev
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
username: root
password: root
#Eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#info配置
info:
app.name: wll-springcloud
company.name: wll.com
---
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.wll.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
profiles: test
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf-8
username: root
password: root
#Eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#info配置
info:
app.name: wll-springcloud
company.name: wll.com
config-client.yml:
spring:
profiles:
active: dev
---
server:
port: 8201
#spring配置
spring:
profiles: dev
application:
name: springcloud-provider-dept
#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配置
spring:
profiles: test
application:
name: springcloud-provider-dept
#Eureka配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
2.构建一个springcloud-config-eureka-7001注册模块
1.导入依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.wll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-eureka-7001</artifactId>
<dependencies>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
</project>
2.将springcloud-eureka-7001模块中的src.main.java包中的代码复制到springcloud-config-eureka-7001模块的src.main.java包中
![](https://img-blog.csdnimg.cn/img_convert/10f54bdd98d46cfab18d6c9acdcde2f7.png)
3.构建两个yml文件:application.yml和bootstrap.yml
bootstrap.yml:用于连接远程仓库(即http://localhost:3344端口下的master分支下的名为config-eureka.yml文件,使用文件中的dev模式)
spring:
cloud:
config:
name: config-eureka
label: master
profile: dev
uri: http://localhost:3344
application.yml:(给这个微服务配置个名字)
spring:
application:
name: springcloud-config-eureka-7001
3.运行springcloud-config-server-3344模块和springcloud-config-eureka-7001模块,再访问localhost:7001
![](https://img-blog.csdnimg.cn/img_convert/70cad5504b1677a6343639417a8ba892.png)
可以看到,即使我们本地没有配置端口7001,仍然访问成功。因为通过config访问了远程仓库的对应配置。
4.再配置一个springcloud-config-dept-8001生产者模块
![](https://img-blog.csdnimg.cn/img_convert/faec9a335b43136c27b5bf2595613b1a.png)
1.导入依赖(在原来的基础上增加一个config依赖)
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.wll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-config-dept-8001</artifactId>
<dependencies>
<!-- config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
<groupId>com.wll</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!-- actuator 完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
2.将springcloud-provider-dept-8001中的代码复制放入springcloud-config-dept-8001中,结构如下:
![](https://img-blog.csdnimg.cn/img_convert/8d114ca12f294d8b63fbf60503418cec.png)
3.配置文件application.yml和bootstrap.yml
application.yml(不再需要配置,用远程调用):
bootstrap.yml(与springcloud-config-eureka-7001模块的bootstrap.yml差不多,只需要改name,,,,,,从这可以发现,有了config后,我们的yml配置文件基本不需要改动,直接调用存储在远程的且配好的配置,方便开发):
spring:
cloud:
config:
name: config-dept
label: master
profile: dev
uri: http://localhost:3344
4.运行
![](https://img-blog.csdnimg.cn/img_convert/47dcc66a6209893fe1b257e131798ed5.png)
可以看到注册8001成功
![](https://img-blog.csdnimg.cn/img_convert/656bf7ec6e15bfcbd1b11598feea610e.png)
访问数据库db01成功。
所有springcloud入门相关(建议从上到下依次阅读):
(14条消息) Spring Cloud Eureka 入门_万1999的博客-CSDN博客
(6条消息) Spring Cloud Ribbon 入门_万1999的博客-CSDN博客
(14条消息) Spring Cloud Hystrix 入门_万1999的博客-CSDN博客