1.config server
创建的过程和正常的springcloud工程是一样的,只是因为这里是config的应用,需要勾选cloud config —> config server的选项。同时config也是一个微服务,所以同样需要向Euerka server注册,所以同时需要勾选 cloud discovery —> eureka discovery。
在启动应用上添加注解,表示该应用既是config sever又是eureka client
1 |
其实在创建应用的时候已经是勾选了config server,所以pom文件中已经是有config的依赖了。
1 | <dependency> |
然后启动会报错,因为config统一配置中心是需要不断的从仓库中拉取配置文件的信息的,这里其实到现在还没有配置仓库,所以在你的GitHub上配置一个存储库,然后在application中配置你的仓库信息如下:
1 | eureka: |
这时候启动,然后访问localhost:8080/order-a.yml就可以读取到配置文件的信息。(order)是你的配置文件名,其实说是项目名也可以。-a的后缀的命名方式:
其实应用启动之后有很多的命名,如:
1 | /{name}-{profiles}.yml |
name是你的配置文件的名字,Profiles是环境,label是你的仓库的分支,默认是master。
然后拉取下来的配置文件config其实生成了一个存储路径,但是这个路径是可以指定的,只需要加一个basedir的配置即可。
2.config client
既然配置文件已经放在存储库中了,那么其实微服务是不需要在配置这些信息了,直接从配置中心取就可以了。怎么做呢?
在你的微服务中引入依赖:
1 | <dependency> |
不需要添加注解。
配置文件中添加如下配置:
1 | spring: |
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 实现配置自动刷新
我们每次修改配置之后不能总是重新启动然后实现更新吧,可不可以实现配置中心修改完配置之后通知到微服务(微服务之间的消息的传递最好是使用消息对队列的方式),然后微服务读取到这个更新呢?
系统的架构如下所示:
spring cloud bus会暴露出/bus-refresh的接口,config访问就可以读取到配置文件的更新。
config配置中心引入依赖
1 | <dependency> |
同时你的微服务也需要添加依赖,因为都需要使用。
然后在你的config server的yml文件中配置如下:也就是要把这个接口暴露出来,然后访问才不会报错。”*”就是把所有的接口都暴露出来。
1 | management: |
然后在你的读取配置的地方还需要添加注解:@RefreshScope
1 |
|
集成WebHooks实现配置自动刷新:GitHub配置仓库添加WebHooks,spring cloud config提供了一个叫monitor的路由来访问/bus-refresh。所以你的URL后面是monitor,然后前面是将本机地址随机映射成为的外网地址。