最近公司想让我看看微服务html
正好我也想看看新东西,每天解决业务问题。。。太没有激情了。。。并且咱们大多应用都仍是springmvc
,springboot
的应用都不多,只有几个,唉,我也是深陷业务问题中spring
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
, 很明显有了一个相似配置中心的菜单bootstrap
点开进去啥也没有。。。只有右边一个建立按钮springboot
也没灰心,我先是去官网介绍看了看 官网连接描述mvc
我认可我英语是差了。。。看了半天,我真是没看明白怎么使用。。。当时我有点懵逼,说好的很好操做的呢
没办法,我只有去百度了哈,看了不少文章,基本全部文章说的都是差不太多,可是这个差不太多又都没有说清楚到底怎么玩。。。
好吧,这个时候我有点认可我本身理解能力有点问题了,心想既然你们都没有说清楚,估计应该就是很容易理解,因此你们心领神会,我又反复读了哈官方的描述,而且找了springcloud.cc
里的中文说明文档,仍是没看太懂。。。app
当时我真的以为有点懵了。。。心想今天算了仍是不想这个,明天再想,因而我去把demo
的网关换成了spring cloud gateway
,这个基本没有半个小时就搞定了,仍是比较简单的spring-boot
次日也就是今天,我再次来看了哈文档,百度的几篇文章除了说明了一点,要加一个配置文件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
里的配置会生效嘛
但愿这样的解释对你有帮助哈~