最近公司想让我看看微服务
正好我也想看看新东西,天天解决业务问题。。。太没有激情了。。。而且我们大多应用都还是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: ','
可能我是一个比较传统的程序猿。。。这种逗号分开的目录命名方式对我来说还是有点冲击的。。。再回过头看官方的文档,也算是有点明白了。。。真的还是我的理解能力太差
总得来说也是怪自己太着急了。。。之前几个开箱即用的把自己搞的浮躁了点。。其实仔细看文档还是能看明白的。。。
最后你可以像平常写配置文件一下,这么根据环境来配置了
总结哈:戒骄戒躁吧。。。
----------------------------------------------------------------------华丽的分割线------------------------------------
这里简单说哈@FengSufeier 的疑问,从你提到
所以估计你可能是自学还没有走入正式的工作场景中吧,我可以给你举个例子,在我们日常开发过程中,比如你现在有一个系统,有一个项目工程代码,里面有数据库配置,你正式上线的环境肯定有一个数据库的地址,你测试环境也会有一个数据库的地址,两个肯定不一样,不然现网数据和测试数据混在一起,或者有关联的话,测试环境数据库被测挂了,那现网数据库也就遭殃了,所以一般是分开的,这也就分了两个环境,但是代码是一份,数据库配置是分两份的,如何控制?
这个时候,我们一般就是把之前的一个配置文件application.yml
分为application-test.yml
和application-prod.yml
两份,而这application-test.yml
和application-prod.yml
这两个文件去配置不同环境的数据库,当然这里叫test
和prod
,你也可以叫其他名字,只是一个叫法,然后在启动的时候,添加虚拟机的启动参数(VM options
):-Dspring.profiles.active=test
,也就是告诉SpringBoot
你需要执行哪个配置环境的配置文件
这一点在boot
的说明文档里有提到,同时指定环境的配置文件执行时会把application.yml
中的配置覆盖掉
这样也很好,比如你有3个配置文件application.yml
,application-test.yml
,application-prod.yml
,你可以把不同环境的配置放入后两个文件,但是一些公共的业务属性配置,不区分环境的配置就可以放到application.yml
中
以上回答了你的dev
,test
的用途,用法是什么,总结一下
-
dev
,test
就是不同环境的名字,怎么取看你 - 为什么要这么做,就是实际开发中有一些配置必须要分两份,或更多份以示区分,同一个项目要在不同配置下运行
- 怎么用,其实就是根据你的要求按照
application-{profile}.yml
的方式区分配置,然后启动的时候添加-Dspring.profiles.active=test
来指定你要运行的环境
但是说了这么多,并没有说到任何Consul Config
,对,因为本质就是两个问题,Spring Cloud Consul Config
本身是为了解决多系统,多应用的配置管理问题,它是统一管理配置的地方,并且可以做到动态刷新
结合之前说到的多环境需要配置不同的配置文件,那既然现在要把所有配置都放到Consul Config
上做统一管理,那其实Consul Config
也要支持多环境了,所以才有config/gateway,dev/data
这样的写法,只是Consul Config
的一个规定,以便支持多环境而已
至于你提到了修改成了config/gateway,dev/data
之后的配置不起作用了,按照刚才说的,现在配置已经在Consul Config
上了,你的config/gateway,dev/data
里的配置就相当于以前application-dev.yml
里的配置,按照boot
对于多环境的支持要起作用,第一你要有多环境的配置文件,你有了config/gateway,dev/data
,第二你启动的时候加了-Dspring.profiles.active=dev
参数么?因为你还要指定此时的运行环境,如果你不指定,那只有config/gateway/data
里的配置会生效嘛
希望这样的解释对你有帮助哈~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。