Spring Cloud快速入门(7),基于jdbc实现Config配置中心

配置中心介绍

每个Spring Boot都有个application.yml配置文件,里面有很多项配置,一旦系统发展到过大时,会大大增加维护成本,所以spring cloud 提供了集中化的配置中心为每个微服务服务。

创建工程

创建sales-config-server,继承sales-parent。

此配置中心将配置都存储于mysql数据库,所以在mysql服务器上创建一个数据库config,创建表properties

<code>CREATE TABLE `properties` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key` varchar(50) DEFAULT NULL,
`value` varchar(500) DEFAULT NULL,
`application` varchar(50) DEFAULT NULL,
`profile` varchar(50) DEFAULT NULL,
`label` varchar(50) DEFAULT NULL,
`remark` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;/<code>maven依赖

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client/<artifactid>
/<dependency>

<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-config-server/<artifactid>
/<dependency>

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-jdbc/<artifactid>
/<dependency>
<dependency>
<groupid>mysql/<groupid>
<artifactid>mysql-connector-java/<artifactid>
/<dependency>/<code>配置application.yml

<code>server:
port: ${PORT:8099}
spring:
application:
name: sales-config-server
cloud:


config:
server:
default-label: dev
jdbc:
sql: select `key`,`value` from properties where `application`=? and `profile`=? and `label`=?
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.113:3306/config?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
profiles:
active: jdbc

eureka:
client:
registerWithEureka: true #服务注册开关
fetchRegistry: true #服务发现开关
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
defaultZone: http://localhost:8090/eureka/
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定实例id
/<code>创建启动类

<code>@SpringBootApplication
@EnableConfigServer // 开启注册中心服务
@EnableDiscoveryClient
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class,args);
}
}/<code>config库初始化数据

使用配置中心

这次我们使用产品服务做测试,注入docker_address配置项,然后再读出来。

添加maven依赖

<code><dependency>


\t\t<groupid>org.springframework.cloud/<groupid>
\t\t\t<artifactid>spring-cloud-config-client/<artifactid>
/<dependency>
<dependency>
\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-actuator/<artifactid>
/<dependency>/<code>增加bootstrap.yml

<code>spring:
cloud:
config:
profile: dev
label: dev
name: sales-product-service
uri: http://localhost:8099 #注册中心服务地址/<code>修改ProductController

<code>// 注入配置项
// config server动配置
@Value("${docker_address}")
private String docker_address;


@GetMapping("/get/{id}")
public CommonResult getById(@PathVariable("id") Long id) {
// 打印配置内容
System.out.println("docker_address:" + docker_address);
System.out.println("/product/get/" + id + ", port:" + port);
List<product> products = productList.stream()
.filter(product -> product.getId().equals(id))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(products)) {
return CommonResult.success(products.get(0));
}
return CommonResult.failed("未找到指定产品");
}/<product>/<code>启动测试

先启动注册中心服务,再启动产品服务,访问订单接口获取订单信息,即可调用产品服务。

配置变更

通过服务获取其他方式修改properties表的配置后,如果不重启服务,配置不会生效,手工刷新的方法如下:

修改bootstrap.yml

<code>spring:
cloud:
config:
profile: dev
label: dev
name: sales-product-service
uri: http://localhost:8099

#
management:
endpoints:
web:
exposure:
include: ["refresh"]
/<code>

启动类上增加注解@RefreshScope

然后通过post http://localhost:8092/actuator/refresh来实现配置更新。