文章目录
1. 概述
1.1. 分布式面临的配置文件的问题
微服务意味着将单体应用拆分成一个个自服务,这些服务都是要相应的配置信息才能运行,随着系统内微服务数量越来越多,配置信息也不断地增多,所以一套集中式的、动态的配置管理设施是必不可少的。
1.2. 什么是 SpringCloud Config分布式配置中心
服务 A、B 分别需要一些配置文件,就从Git 云端上去读取,然后再通过负载均衡策略进行分配。
SpringCloud Config是一个提供外部集中式配置管理的设施,配置服务器为各种不同的额微服务应用提供了一个中心化的外部配置
SpringCloud Config分为客户端和服务端两部分:
- 服务端:分布式配置中心,是一个独立的微服务,用来连接并为客户端提供配置信息,加密/解密信息等访问接口
- 客户端:通过指定的配置中心获取配置资源,cloud推荐用git来存储配置信息,就是一个个服务
1.3. SpringCloud Config作用
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,让服务中心统一为服务拉取配置文件
- 当配置发生变动时,服务不需要重启即可感知配置变化并应用
- 将配置信息以REST接口形式暴露
2. Git环境搭建
-
Git 下载
Git 镜像的下载地址 :https://npm.taobao.org/mirrors/git-for-windows/
可视化工具 tortoisegit 的下载地址 :https://tortoisegit.org/download/(这个可以不装)
-
Git 安装
下载完安装包后,在没有其他特殊需求的情况下,一直下一步即可
如有其他需求,则自行百度,这里就不多说了
安装完成后,在桌面右击鼠标就能看到 Git
-
注册/登录Git
使用 码云 或 Github 都可
这里使用的是 码云
-
新建仓库
-
把仓库克隆到本地
-
如果下载了可视化工具
在你需要存放该仓库的文件夹下,右击鼠标
最后得到的仓库
(有个绿色的勾)
-
编写配置文件
因为简单测试
新建一个 application.yml,并编写spring: profiles: active: dev --- spring: profiles: dev application: name: springcloud-config-dev --- spring: profiles: test application: name: springcloud-config-test
-
把刚刚修改的内容提交到本地仓库
右击 spring-cloud-config 文件夹
-
把本地仓库的内容提交到码云上
右击 spring-cloud-config 文件夹
去码云上查看
3. 服务端连接 Git 配置
-
新建一个模块作为服务端 :springcloud-config-server-3010
-
编写 POM 文件
<?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> <groupId>com.demo</groupId> <version>0.0.1-SNAPSHOT</version> <parent> <artifactId>Demo_SpringCloud</artifactId> <groupId>org.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>springcloud-config-3010</artifactId> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--web 服务--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--config-server--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.0.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
编写 application.yml
server: port: 3010 spring: application: name: springcloud-config-server # 连接远程仓库 cloud: config: server: git: # https 地址 uri: https://gitee.com/yuan934672344/spring-cloud-config.git
注意:
1、这里是 uri 不是 url。
2、这个地址是复制 HTTPS 的,不是 SSH 的
-
在主启动类上添加config-server的注解
@SpringBootApplication // 开启 config-server @EnableConfigServer public class SpringcloudConfig3010Application { public static void main(String[] args) { SpringApplication.run(SpringcloudConfig3010Application.class, args); } }
-
启动项目
访问 http://localhost:3010/application-dev.yml
(自己的端口号 + 文件名)
得到了文件中的信息在官网上看到,还可以以这些形式访问资源
4. 客户端连接服务端远程访问
-
在 spring-cloud-config 文件夹中添加一个 yml :config-client.yml
spring: profiles: active: dev --- spring: profiles: dev application: name: springcloud-config-client-dev server: port: 8201 # Eureka 配置 eureka: client: service-url: defaultZone : http://127.0.0.1:7001/eureka/ --- spring: profiles: test application: name: springcloud-config-client-test server: port: 8202 eureka: client: service-url: defaultZone : http://127.0.0.1:7001/eureka/
和之前一样的提交到码云仓库
-
新建一个模块 :springcloud-config-client
-
编写 POM 文件
<?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> <groupId>com.demo</groupId> <version>0.0.1-SNAPSHOT</version> <parent> <artifactId>Demo_SpringCloud</artifactId> <groupId>org.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>springcloud-config-client</artifactId> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.2.0.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
编写 application.yml
spring: application: name: springcloud-config-client
-
编写 bootstrap.yml
# application.yml 是用户级别的配置 # bootstrap.yml 是系统级别的配置 spring: cloud: config: # 而客户端连接服务端 uri: http://localhost:3010 # 需要从 Git 上获取的资源名,不需要后缀 name: config-client # 访问上述资源的哪个一个环境的内容 profile: dev # 从 Git 上哪一个分支去获取 label: master
-
编写控制器 :ConfigClientController
@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 getConfiguration(){ return "applicationName : "+ applicationName + "eurekaServer : "+ eurekaServer + "port : "+ port ; } }
-
启动 服务端 和 客户端 测试
因为在 客户端 的配置文件中,选择的是 dev 环境的配置信息,
又因为在 服务端 的配置文件中,配置了 dev 环境中的端口号是 8201
所以访问 :http://localhost:8201/config
5. 将 springcloud-config 与之前的项目整合
-
在 spring-cloud-config 文件中编写两个文件,并提交
config-eureka.yml
spring: profiles: active: dev --- server: port: 7001 spring: profiles: dev application: name: springcloud-config-eureke-7001 eureka: instance: hostname: localhost prefer-ip-address: true ip-address: 127.0.0.1 client: register-with-eureka: false fetch-registry: false service-url: defaultZone : http://127.0.0.2:7002/eureka/ --- server: port: 7002 spring: profiles: test application: name: springcloud-config-eureke-7002 eureka: instance: hostname: localhost prefer-ip-address: true ip-address: 127.0.0.2 client: register-with-eureka: false fetch-registry: false service-url: defaultZone : http://127.0.0.1:7001/eureka/
config-provider.yml
spring: profiles: active: dev --- server: port: 8081 mybatis: type-aliases-package: com.demo.pojo mapper-locations: classpath:mybatis/mapper/*.xml config-location: classpath:mybatis/mybatis-config.xml spring: profiles: dev application: #多个提供者的服务名必须一致 name: springcloud-config-provider datasource: username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/spring_cloud_01?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 type: com.alibaba.druid.pool.DruidDataSource logging: level: com.demo.mapper: DEBUG # Eureka,配置服务注册到哪里 eureka: client: service-url: # 配置监控页面的地址,这是在 Eureka Server 中配置的 defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.2:7002/eureka/ instance: # 修改 Eureka 监控页面上的默认描述信息 instance-id: springcloud-config-provider-8081 ribbon: eureka: enabled: true # 配置监控信息 info: app.name: hehe-SpringCloud company.name: www.XXXX.com --- server: port: 8083 mybatis: type-aliases-package: com.demo.pojo mapper-locations: classpath:mybatis/mapper/*.xml config-location: classpath:mybatis/mybatis-config.xml spring: profiles: test application: #多个提供者的服务名必须一致 name: springcloud-config-provider datasource: username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/spring_cloud_02?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 type: com.alibaba.druid.pool.DruidDataSource logging: level: com.demo.mapper: DEBUG # Eureka,配置服务注册到哪里 eureka: client: service-url: # 配置监控页面的地址,这是在 Eureka Server 中配置的 defaultZone: http://127.0.0.1:7001/eureka/,http://127.0.0.2:7002/eureka/ instance: # 修改 Eureka 监控页面上的默认描述信息 instance-id: springcloud-config-provider-8083 ribbon: eureka: enabled: true # 配置监控信息 info: app.name: hehe-SpringCloud company.name: www.XXXX.com
-
新建一个模块 :springcloud-config-eureka
-
POM 文件
<?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> <groupId>com.demo</groupId> <version>0.0.1-SNAPSHOT</version> <parent> <artifactId>Demo_SpringCloud</artifactId> <groupId>org.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>springcloud-config-eureka</artifactId> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--eureka-server--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--config 远程配置 --> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.2.0.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
编写 bootstrap.yml
#======= 远程配置 ================= spring: cloud: config: # 而客户端连接服务端 uri: http://localhost:3010 # 需要从 Git 上获取的资源名,不需要后缀 name: config-eureka # 访问上述资源的哪个一个环境的内容 profile: test # 从 Git 上哪一个分支去获取 label: master
-
编写 application.yml
spring: application: name: spring-cloud-config-eureka
-
启动项目,访问,测试
其他的服务都是一样的步骤