Fork me on GitHub

SpringCloud统一配置中心

1.config server

创建的过程和正常的springcloud工程是一样的,只是因为这里是config的应用,需要勾选cloud config —> config server的选项。同时config也是一个微服务,所以同样需要向Euerka server注册,所以同时需要勾选 cloud discovery —> eureka discovery。

在启动应用上添加注解,表示该应用既是config sever又是eureka client

1
2
@EnableDiscoveryClient
@EnableConfigServer

其实在创建应用的时候已经是勾选了config server,所以pom文件中已经是有config的依赖了。

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

然后启动会报错,因为config统一配置中心是需要不断的从仓库中拉取配置文件的信息的,这里其实到现在还没有配置仓库,所以在你的GitHub上配置一个存储库,然后在application中配置你的仓库信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/songwell1024/config-repo #仓库地址
username: xxxxxxx #你的GitHub的用户名
password: ******* #你的GitHub的密码

这时候启动,然后访问localhost:8080/order-a.yml就可以读取到配置文件的信息。(order)是你的配置文件名,其实说是项目名也可以。-a的后缀的命名方式:

其实应用启动之后有很多的命名,如:

1
2
/{name}-{profiles}.yml
/{label}/{name}-{profiles}.yml

name是你的配置文件的名字,Profiles是环境,label是你的仓库的分支,默认是master。

然后拉取下来的配置文件config其实生成了一个存储路径,但是这个路径是可以指定的,只需要加一个basedir的配置即可。

2.config client

既然配置文件已经放在存储库中了,那么其实微服务是不需要在配置这些信息了,直接从配置中心取就可以了。怎么做呢?

在你的微服务中引入依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>

不需要添加注解。

配置文件中添加如下配置:

1
2
3
4
5
6
7
8
9
spring:
application:
name: order
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: test

service-id是你的配置中心的名字,然后profile就是访问时候的后缀环境。最终访问的时候就是localhost:8080/order-test.

启动会报如下错误:

Cannot determine embedded database driver class for database type NONE.

其实就是找不到数据库。

因为你的配置是写在application.yml下的,当微服务启动的时候,你不知道他会不会先加载这里面的配置信息,如果还没有加载而去配置数据库的信息,导致了报错。

在springboot中有一个文件叫bootstrap.yml的配置文件,他是先加载先启动的,这样的话就可以先把配置信息启动了,然后就可以正常启动了。

然后上面的配置的eureka的地址是8761,然后当你该为8762 的时候,同时把config server和config client 还有你的配置的仓库中配置全部改为8762,然后再启动才可以,注意只要改配置的端口的话就要都改。

然后我的配置仓库中有一个order.yml 还有一个order-test的yml文件,上面的配置我们看到profile: test,也就是应该加载order-test.yml文件,但是其实启动的时候order也会加载,并且会把两个配置信息进行合并,这里会导致错误,一定要注意。这里默认的可能是order是微服务的名字,把这些一order有关的配置都会加载进来

spring cloud bus 实现配置自动刷新

我们每次修改配置之后不能总是重新启动然后实现更新吧,可不可以实现配置中心修改完配置之后通知到微服务(微服务之间的消息的传递最好是使用消息对队列的方式),然后微服务读取到这个更新呢?

系统的架构如下所示:

1

spring cloud bus会暴露出/bus-refresh的接口,config访问就可以读取到配置文件的更新。

config配置中心引入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

同时你的微服务也需要添加依赖,因为都需要使用。

然后在你的config server的yml文件中配置如下:也就是要把这个接口暴露出来,然后访问才不会报错。”*”就是把所有的接口都暴露出来。

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: "*"

然后在你的读取配置的地方还需要添加注解:@RefreshScope

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/test")
@RefreshScope
public class EnvController {

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

@GetMapping("/print")
public String print() {
return test;
}
}

集成WebHooks实现配置自动刷新:GitHub配置仓库添加WebHooks,spring cloud config提供了一个叫monitor的路由来访问/bus-refresh。所以你的URL后面是monitor,然后前面是将本机地址随机映射成为的外网地址。

2

本文标题:SpringCloud统一配置中心

文章作者:WilsonSong

发布时间:2019年01月18日 - 21:01

最后更新:2019年03月09日 - 21:03

原始链接:https://songwell1024.github.io/2019/01/18/SpringCloudConfig/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------