目录
2.2 创建启动类 添加注解@EnableConfigServer
2.3 配置 config Server 管理的远端仓储信息
通过上图可知,每个微服务都有一个配置文件,目前只是11个微服务,就需要11个配置文件,若有上百个微服务呢?常规配置管理解决方案缺如下:
使用Spring Cloud Config集中式的配置管理中心,用来实现微服务系统中服务配置的统一管理。
组件:统一配置中心服务端集中管理配置文件、统一配置中心客户端就是各微服务。
Spring Cloud Config 在微服务分布式系统中,采用「Server 服务端」和 「Client 客户端」的组件方式来提供可扩展的配置服务。
工作流程:微服务即config client 到 config Server 获取配置文件,config Server 到远端仓库获取配置。
详细说明:统一配置中心服务端 config Server 也是一个微服务,这个微服务将来可能是个小集群,如果把所有配置都放到 config Server,一旦有版本改动,则整个小集群都需要改。因此,可以将所有微服务的配置统一放到 git 远程仓储上进行版本管理。config Server 只需要配置 git 远程仓储地址,在 config Server 启动时候,config Server 会到 git 远程仓储上进行拉取配置到本地仓储,启动后如果远程仓储的配置有改动,则 config Server 会自动检测到远程仓储的配置改动,进行自动拉取最新配置。其他微服务即config client 可以通过 config Server 获取所需配置信息。
因此需要搭建 git 远程仓储环境。
注意: 统一配置中心服务端 config Server 读取远程仓储的配置的时候是有一定的规则,因此在远程仓储中的配置文件命名也要有一定的规则。
{application}-{profile}.yml/{application}-{profile}.properties
如:order-dev.yml、order-test.yml、order-prod.yml
其中 label 代表的是分支例如master分支,profile代表的是环境。
如:http://localhost:7001/master/order-dev.yml
如:http://localhost:7001/master/order-test.yml
如:http://localhost:7001/order/dev/master
如:http://localhost:7001/order/test/master
配置中心使用步骤
在远程仓储 master 分支上对订单服务的进行配置,环境分别是dev/test/prod。文件名分别为order-dev.yml、 order-test.yml、 order-prod.yml,订单服务的端口号分别为:9000、9100、9200,配置分别如下:
server:
port: 9000
spring:
application:
name: order-service
# 配置eureka客户端信息
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
instance:
prefer-ip-address: true
# instance-id: order-service
instance-id: ${spring.cloud.client.ip-address}:${server.port}
搭建统一配置服务中心服务端 config server,创建项目,引入 统一服务配置中心 config 依赖。
- "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>springcloudbaseartifactId>
- <groupId>com.hwadee.springcloud2022groupId>
- <version>0.0.1-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>configServer7009artifactId>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-config-serverartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
- dependency>
- dependencies>
-
- project>
创建启动类,添加 注解@EnableConfigServer 启动 config 的 服务端 应用。
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.config.server.EnableConfigServer;
- import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-
- @SpringBootApplication
- @EnableEurekaClient// 启动 eureka 客户端
- @EnableConfigServer// 启动 config 服务端
- public class ConfigServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigServerApplication.class, args);
- }
- }
配置config Server的 服务端 要管理的远程仓库地址。
- server:
- port: 7009
- spring:
- application:
- name: config-service # 为当前商品服务命名
- cloud:
- config:
- server:
- git:
- # username: xiashanzhu
- # password: aa@86886830622
- uri: https://gitee.com/xiashanzhu/config-repo #要读取的远程仓库的配置文件的地址。
- default-label: master # 指定分支,不指定则默认master
- eureka:
- client:
- service-url: # 配置服务注册地址,与 eureka-server 中暴露地址保持一致
- defaultZone: http://localhost:8000/eureka
- instance:
- prefer-ip-address: true # 是否使用 IP 地址注册,默认 false
- # instance-id: product-service # 实例 id,服务的唯一标识
- instance-id: ${spring.cloud.client.ip-address}:${server.port} # 如果想在控制页面看到服务地址与端口,可以将 instance-id 这样配置
- lease-renewal-interval-in-seconds: 5 # 发送心跳的间隔,单位秒,默认 30
- lease-expiration-duration-in-seconds: 10 # 续约到期时间,单位秒,默认90
分别启动 注册中心 和 统一配置中心服务端 config server,根据前面介绍的配置读取的规则分别进行测试。
测试:http://localhost:7001/master/order-dev.yml
测试:http://localhost:7001/master/order-test.yml
测试:http://localhost:7001/order/dev/master
测试:http://localhost:7001/order/test/master
注意:
/{application}-{profile}.yml默认访问的是master分支下的配置文件。例如访问
http://localhost:7009/order/dev 和 http://localhost:7009/order/dev/master 结果相同:
小结
在配置服务中心服务端访问远程仓储的配置文件例如http://localhost:7009/order/dev/master时, 配置服务中心服务端会自动的进行拉取远程仓储到本地,例如:C:/Users/HP/AppData/Local/Temp/config-repo-xxxx/ 目录中。
搭建统一配置服务中心客户端 config client,创建订单服务项目,引入 统一服务配置中心 spring-cloud-starter-config 依赖。就等于开启了 统一配置服务中心的客户端。
- "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>springcloudbaseartifactId>
- <groupId>com.hwadee.springcloud2022groupId>
- <version>0.0.1-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.hwadee.springcloudgroupId>
- <artifactId>orderServer9000artifactId>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-configartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
-
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>com.hwadee.springcloudgroupId>
- <artifactId>springcloud-apiartifactId>
- <version>0.0.1-SNAPSHOTversion>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- dependencies>
-
- project>
在远程仓储 master 分支上对订单服务的进行配置,环境分别是dev/test/prod。文件名分别为order-dev.yml、 order-test.yml、 order-prod.yml,订单服务的端口号分别为:9000、9100、9200,配置分别如下:。
订单服务客户端在启动的时候需要加载配置文件,但此时配置文件不在本地,而是在远程仓储上面,此时运行会报错。因此在运行的时候需要一个本地配置文件bootstrap.yml/properties,在bootstrap.yml/properties 中告知客户端配置文件需要从config Server 服务端上获取。使用配置文件bootstrap原因在于微服务启动时候 bootstrap 配置文件加载顺序优先级最高。
在 bootstrap.yml/properties 中获取 config Server 服务端上的配置文件的配置方式有两种方式,硬编码方式和服务名方式。
硬编码方式(不推荐):
硬编码方式,即将 config Server 服务端 的地址硬编码在bootstrap中。但是不推荐使用,因为 config Server 服务端 也是集群模式,如果其中硬编码的服务挂掉,则会导致其他服务失败。配置方式如下:
- spring:
- cloud:
- config:
- label: master # 指定分支
- name: order # 指定应用名称
- profile: dev # 指定激活环境
- uri: http://localhost:7009 #硬编码 指定访问 config server 远程仓储的地址的ip和端口
服务名方式:
使用 config Server 服务端 的服务名方式。因为 config Server 服务端 也是集群模式,使用服务名,订单服务 会先到注册中心找到 config Server 服务端 该服务名的地址,然后在这些地址中在选择一个地址,进行远端的配置文件信息获取。但注册中心的配置信息需要写在 bootstrap中,而不是配置在远程仓储中。
注册中心信息修改为:
bootstrap.yml配置信息修改为:
- spring:
- cloud:
- config:
- discovery:
- service-id: CONFIG-SERVICE #告诉当前客户端 统一配置中心的服务端服务id
- enabled: true #开启客户端,根据服务id到注册中心获取配置信息
- label: master # 指定分支
- name: order # 指定应用名称
- profile: dev # 指定激活环境
-
- # 配置eureka客户端信息
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:8000/eureka/
- import com.hwadee.springcloud.entity.Product;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/order")
- public class OrderController {
-
- @Value("${env}")
- private String env;
- @Value("${port}")
- private String port;
- @Value("${info}")
- private String info;
-
- @RequestMapping(value = "/getConfig")
- public Product getConfigInfo() {
- Product product = new Product();
- product.setName(env +"环境 端口:"+ port +" "+ info);
- return product;
- }
-
- }
创建启动类,在启动类中加入注解 @EnableEurekaClient 将来注入到服务中心。
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-
-
- @SpringBootApplication
- @EnableEurekaClient// 启动 eureka 客户端
- public class OrderServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(OrderServerApplication.class, args);
- }
- }
启动 注册中心 、 配置管理中心服务端、订单服务。分别对硬编码和服务名方式测试。
重新启动订单服务,输入地址 http://localhost:9000/order/getConfig 查看结果
重新启动订单服务,输入地址 http://localhost:9000/order/getConfig 查看结果
第十一章:GetAway服务网关详解
第十三章:Spring Cloud Config 统一配置中心详解-客户端动态刷新