最近公司想让我看看微服务
正好我也想看看新东西,天天解决业务问题。。。太没有激情了。。。而且我们大多应用都还是 springmvc
,springboot
的应用都很少,只有几个,唉,我也是深陷业务问题中
Spring Cloud
也算是一个全家桶吧,里面东西也多,不过从感觉 开箱即用 的原则来看,用起来也比较顺手,demo
也都很好搭建,
从开始的网关 + 服务的着手,网关我采用的 Zuul
,服务治理采用的eureka
,后面想用spring cloud config
作为配置中心,但是还要自己搭一个 server
很是麻烦。。。我也懒。。。无意听同事说,其实全家桶里服务治理可以用 spring cloud consul
,而consul
就自带一个配置功能,于是我去了解了 spring cloud consul config
spring cloud consul config
本身依赖 spring cloud consul
的agent server
,所以只要 agent server
启动了,其实就相当于有了一个 server
来做配置,我满心欢喜的把服务治理 eureka
改为 spring cloud consul
,嗖嗖两下,spring cloud consul
也配置好了
命令行里执行了,启动测试模式的agent server
consul agent -dev
打开localhost:8500
, 很明显有了一个类似配置中心的菜单
点开进去啥也没有。。。只有右边一个创建按钮
也没灰心,我先是去官网介绍看了看 官网链接描述
我承认我英语是差了。。。看了半天,我真是没看明白怎么使用。。。当时我有点懵逼,说好的很好操作的呢
没办法,我只有去百度了哈,看了很多文章,基本所有文章说的 都是差不太多,但是这个差不太多又都没有说清楚到底怎么玩 。。。
好吧,这个时候我有点承认我自己理解能力有点问题了,心想既然大家都没有说清楚,估计应该就是很容易理解,所以大家心照不宣,我又反复读了哈官方的描述,并且找了 springcloud.cc
里的中文说明文档,还是没看太懂。。。
当时我真的觉得有点懵了。。。心想今天算了还是不想这个,明天再想,于是我去把 demo
的网关换成了spring cloud gateway
,这个基本没有半个小时就搞定了,还是比较简单的
第二天也就是今天,我再次来看了哈文档,百度的几篇文章除了说明了一点,要加一个配置文件 bootstrap.yml
,这里面要去指定一些spring cloud consul config
的一些配置,并且意思感觉是 application.yml
里的配置都可以不用写了,完全维护在 spring cloud consul config
里,但是 spring cloud consul config
到底在哪,我还是无法把需要配置的属性,application.yml
和 consul agent
里刚一片空白的配置页面,这三者联系起来
终于无意中,我发现有一篇文章的一句话让我警醒了。。。他不是像其他文章说一些貌似大家都懂的话,而是非常郑重了说了一句
感觉这难道也是一个理解能力和我差不多,但是比我强的人么。。。他这么一句让我明白,确实官网说的也不太明白,最后那句体会一下,我再去反复看了文章,和自己试验。。。
终于懂了。。。
懂了之后再回过头来看,spring cloud consul config
还是真的真的非常简单的。。。其实就是想要用 spring cloud consul config
,你要和它的一些 约定 或者说它的 规范 匹配起就完事了,剩下就跟普通的配置文件一样了,接下来我用我自己的理解来说明哈 spring cloud consul config
怎么使用,当然前提你对于服务治理 consul
有点点了解哈
spring cloud consul config
其实就是一个服务的配置中心,配置统一管理的地方,你哪个服务需要这个配置中心,你就在那个服务里加上依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
之后在该服务的 resources 目录下新增一个 bootstrap.yml
文件,里面加上这些就够了
spring:
cloud:
consul:
config:
format: yaml
default-context: gateway
format
默认是 key_value
的形式,但是我现在很喜欢用 yaml
形式的配置文件,default-context
根据你的应用取吧,类似与 spring.application.name
属性一样,区分服务的
完事之后,在 consul agent
刚那个页面里创建一个目录,对,是目录,目录名一定要像这样config/gateway/data
也就是 config
和data
目录都是默认值,你没有配置的时候,就不用管,但是你必须这么写,中间那个 gateway
就是刚那个 default-context
,这样 consul agent
页面和 bootstrap.xml
就映射起来了,接下来你就可以在下面的 value
里像 yaml
文件一下写配置了
当然你想改目录的两个默认值,你就可以这么修改了,对应 prefix
和data-key
,把默认值写出来就一眼清楚了
spring:
cloud:
consul:
config:
format: yaml
default-context: gateway
prefix: config
data-key: data
所以还是简单的,当然还有个问题,要是多个环境的不同配置怎么来的,嘿嘿,这是个关键问题,因为这个处理,让我实在没有想到,一般我们不用配置中心的时候,在工程里配置,可以按照 application-test.yml
和application-prod.yml
来区分环境,这个 spring cloud consul config
也是可以的,不过不是创建 config/gateway/data/test
,亦或是config/gateway/data/prod
这种。。。天真
特么竟然是 config/gateway,test/data
和config/gateway,data/data
,没错,你没有看错,服务名和环境中间用逗号分开。。。
而且这个中间分隔符逗号还是支持可配。。。默认是逗号。。。你还可以用属性 profile-separator
进行修改
spring:
cloud:
consul:
config:
format: yaml
default-context: gateway
prefix: config
data-key: data
profile-separator: ','
可能我是一个比较传统的程序猿。。。这种逗号分开的目录命名方式对我来说还是有点冲击的。。。再回过头看官方的文档,也算是有点明白了。。。真的还是我的理解能力太差
总得来说也是怪自己太着急了。。。之前几个开箱即用的把自己搞的浮躁了点。。其实仔细看文档还是能看明白的。。。
最后你可以像平常写配置文件一下,这么根据环境来配置了