Spring Cloud配置中心之Consul

Consul不仅可以作为Spring Cloud中服务的注册中心,也可以作为其配置中心,这样一个系统就可以实现服务发现和统一配置,减少系统维护的麻烦,其中在使用Consul作为配置中心使用的过程中可以说是血泪史,参考其他博客大部分含糊其辞,Spring Cloud中文网站,方便大家参考。

Consul配置中心

引入pom依赖

<!--web-->
<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>
<!-- consul discovery-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- consul config-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<!-- lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.0</version>
	<scope>provided</scope>
</dependency>
<!--configuration-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

依赖说明,创建的maven聚合项目,父pom中引入的Spring Cloud版本为Hoxton.SR3,Spring Boot版本为2.2.5.RELEASE

  • actuator:Consul健康检查模块,可视化界面需要引入的模块
  • discovery:Consul服务发现模块
  • config:Consul作为配置中心需要的模块
  • configuration:非必须引入,在使用@ConfigurationProperties注解时,IDEA会提示错误Spring Boot Configuration Annotation Processor not Configured,引入当前依赖就好。

创建主启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigurationProperties(ConfigBean.class)
public class ConsulApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConsulApplication.class,args);
	}

}
  • @EnableDiscoveryClient:作为Spring Cloud服务发现客户端时使用此注解
  • @EnableConfigurationProperties(ConfigBean.class):扫描配置类,要指定需要扫描的类否则无法注入,使用@Component注解可以不指定配置类

创建配置类

@Data
@ConfigurationProperties(prefix = "db-config")
@Component
@RefreshScope
public class ConfigBean {
	private String driverClassName;
	private String url;
	private String userName;
	private String password;
}
  • @ConfigurationProperties(prefix = "db-config"):prefix与Consul服务端k/v存储的yml前缀保持一致
  • @Component:此处使用后,主启动的@EnableConfigurationProperties(ConfigBean.class)可不指定.class,目的是为了交给Spring管理,可以注入

创建application.yml

application.yml是项目启动的配置文件,这里只配置Consul作为服务发现的配置信息,服务发现具体可以参考spring cloud consul

spring:
  application:
	name: consul-client
  profiles:
	active: dev
  cloud:
	consul:
	  discovery:
		hostname: localhost
		port: 8500
		health-check-path: /actuator
		health-check-interval: 10s
		health-check-timeout: 30s
		enabled: true

server:
  port: 8080  

创建bootstrap.yml

注意名称一定是bootstrap.yml,和application.yml同样在resources目录下

这也是博主踩坑的地方,网上很多资料将Consul的spring cloud consul config配置放在服务发现spring cloud consul discovery的配置一块,项目启动请求远程配置信息不会报错,但是注入为null,最终找了很久才找到原因。

spring:
  cloud:
	consul:
	  config:
		enabled: true
		prefix: config
		default-context: consul-client
		profile-separator: ','
		data-key: data
		format: yaml
	  host: localhost
	  port: 8500
  • enabled:是否启用consul config的配置项
  • prefix:配置文件的存储的根路径,默认为config
  • default-context:存储服务时使用的文件目录名称,默认为application,一般设置为与spring.application.name相同
  • profile-separator:比较难理解的一点,consul创建key值与环境的分隔符默认,
  • data-key:配置文件存储key的值,或者理解为文件的名称,默认为data
  • format:配置文件的文件格式,这里选择yaml

创建key/value

启动consul服务端后,访问http://localhost:8500,在这里创建键值对

key:

config/consul-client,dev/data

value:

desc: Consul Confisuration Test
dbconfig:
 driverClassName: oracle.jdbc.driver.OracleDriver
 url: jdbc:oracle:thin:@localhost:1521:orcl
 userName: system
 password: orcl

注意:

  • 1:与bootstrap.yml中prefix保持一致
  • 2:与bootstrap.yml中default-context保持一致
  • 3:与bootstrap.yml中profile-separator保持一致
  • 4:与application.yml中spring.profiles.active保持一致
  • 5:与bootstrap.yml中data-key保持一致

创建测试类

@RestController
public class TestController {
	@Resource
	private ConfigBean configBean;

	@Value("${desc}")
	private String desc;

	@RequestMapping("/desc")
	public String desc(){
		return desc;
	}

	@RequestMapping("/config")
	public ConfigBean getUserInfo(){
		return configBean;
	}

}

访问http://localhost:8080/desc,查看属性desc的注入情况

Consul Configuration Test

访问http://localhost:8080/desc,查看ConfigBean的注入情况

{"driverClassName":"oracle.jdbc.driver.OracleDriver","url":"jdbc:oracle:thin:@localhost:1521:orcl","userName":"system","password":"orcl"}

总结

  • Consul既可以作为注册中心,还可以作为配置中心;
  • 通过@Value注入的属性,修改Consul的配置后,属性不能立即生效,需要服务重启;
  • 通过@ConfigurationProperties注入的属性,修改consul的配置后,属性会立即生效;

最后,Consul的官方文档都有详细的解释,查阅资料时一定要选择合适的资料,建议首先考虑官网

猜你喜欢

转载自www.cnblogs.com/conly/p/12561666.html
今日推荐