在微服务中,服务的配置文件可以从
- 本地获取
- 远程git获取
- 数据库获取。
本文主要讲解从数据库端获取配置信息。
Config服务端:
配置中心的config文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
配置文件如下:
server:
port: 18080
spring:
application:
name: config-server
datasource: #数据库数据
url: jdbc:mysql://localhost:30176/config_service?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: test
password: test
driver-class-name: com.mysql.jdbc.Driver
profiles:
active: jdbc #配置文件读取类型:从数据库读
cloud:
config:
server:
jdbc: #查询SQL中的配置数据
sql: select distinct cm.cnf_key,cm.cnf_value from applications app,configuration_mapping cm,environments env where 1=1 and cm.application_id = app.id and cm.env_id = env.id and env.enabled ='Y' and app.enabled ='Y' and cm.enabled ='Y' and ( app.application_code = ? or app.application_code = 'common' ) and env.environment_code = ? and cm.label_name = ?
prefix: config-api
eureka: #注册中心信息
instance:
preferIpAddress: true
leaseRenewalIntervalInSeconds: 10
leaseExpirationDurationInSeconds: 30
metadata-map:
VERSION: v1
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
registryFetchIntervalSeconds: 10
security:
basic:
enabled: false
mybatis:
mapperLocations: classpath*:/mapper/*.xml
configuration: # 数据库下划线转驼峰配置
mapUnderscoreToCamelCase: true
config配置文件也可以从git中获取,对应的配置文件如下,但是
cloud:
config:
server:
git:
uri: https://github.com/tanchuntcc/config-repo.git
username: tanchuntcc
password: tanchun2016.
bus:
enabled: true
trace:
enabled: true
SpringBoot启动类注解:
@EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
public class ControlServerApplication {
public static void main(String[] args) {
SpringApplication.run(ControlServerApplication.class, args);
}
}
查询配置文件的接口如下:
@GetMapping("/{applicationId}/{envId}")
public ResponseEntity<Configurations> selectByConditon(@PathVariable("applicationId") Long applicationId,
@PathVariable("envId") Long envId) {
ConfigurationMapping configurationMapping = new ConfigurationMapping();
configurationMapping.setApplicationId(applicationId);
configurationMapping.setEnvId(envId);
configurationMapping.setEnabled("Y");
List<ConfigurationMapping> configurationMappings = mapper.select(configurationMapping);
Configurations configurations = new Configurations();
if (!configurationMappings.isEmpty()){
BeanUtils.copyProperties(configurationMappings.get(0), configurations);
LinkedHashMap<String, String> configs = new LinkedHashMap<>();
for (ConfigurationMapping c : configurationMappings
) {
configs.put(c.getCnfKey(), c.getCnfValue());
}
configurations.setConfigurations(configs);
}
LinkedHashMap<String, String> configurationsMap = configurations.getConfigurations();
if (configurationsMap != null) {
configurations.setText(convert2Yml(configurationsMap));
}
return Optional.ofNullable(configurations)
.map(result -> new ResponseEntity<>(result, HttpStatus.OK))
.orElseThrow(() -> new ConfigException("error.find.config"));
application_id表示应用的id,env_id表示环境的id,cnf_num表示不同的服务编码,cnf_key和cnf_value表示配置文件的每一行数据的key和value。数据库的数据如下:
调用接口获取到数据后,获取的数据如下:
获取到数据后,前端写一个简单的页面,就可以在界面上手动修改配置文件了。
当然还可以设置集中不同的环境,如dev,prod环境等。
Config客户端:
config的客户端就是各个服务,在没有配置SpringCloudConfig时,客户端会默认从classpath。当配置了config时,客户端会从Config服务端获取配置信息,因为SoringBoot配置文件的优先级bootstrap.yml大于其他配置文件。配置文件如下:
spring:
application:
name: yqcloud-itsm-service
profiles:
active: itsm
cloud:
config:
failFast: true
retry:
maxAttempts: 6
multiplier: 1.5
maxInterval: 2000
uri: http://localhost:8081 #config服务端地址
label: default
enabled: true
profile: dev
客户端相关的maven包依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>