1

最近公司想让我看看微服务

正好我也想看看新东西,天天解决业务问题。。。太没有激情了。。。而且我们大多应用都还是springmvcspringboot的应用都很少,只有几个,唉,我也是深陷业务问题中

Spring Cloud也算是一个全家桶吧,里面东西也多,不过从感觉开箱即用的原则来看,用起来也比较顺手,demo也都很好搭建,
从开始的网关+服务的着手,网关我采用的Zuul,服务治理采用的eureka,后面想用spring cloud config作为配置中心,但是还要自己搭一个server很是麻烦。。。我也懒。。。无意听同事说,其实全家桶里服务治理可以用spring cloud consul,而consul就自带一个配置功能,于是我去了解了spring cloud consul config
spring cloud consul config本身依赖spring cloud consulagent server,所以只要agent server启动了,其实就相当于有了一个server来做配置,我满心欢喜的把服务治理eureka改为spring cloud consul,嗖嗖两下,spring cloud consul也配置好了
命令行里执行了,启动测试模式的agent server

consul agent -dev

打开localhost:8500, 很明显有了一个类似配置中心的菜单

clipboard.png

点开进去啥也没有。。。只有右边一个创建按钮

clipboard.png

也没灰心,我先是去官网介绍看了看 官网链接描述

clipboard.png

我承认我英语是差了。。。看了半天,我真是没看明白怎么使用。。。当时我有点懵逼,说好的很好操作的呢
没办法,我只有去百度了哈,看了很多文章,基本所有文章说的都是差不太多,但是这个差不太多又都没有说清楚到底怎么玩。。。
好吧,这个时候我有点承认我自己理解能力有点问题了,心想既然大家都没有说清楚,估计应该就是很容易理解,所以大家心照不宣,我又反复读了哈官方的描述,并且找了springcloud.cc里的中文说明文档,还是没看太懂。。。

clipboard.png

当时我真的觉得有点懵了。。。心想今天算了还是不想这个,明天再想,于是我去把demo的网关换成了spring cloud gateway,这个基本没有半个小时就搞定了,还是比较简单的

第二天也就是今天,我再次来看了哈文档,百度的几篇文章除了说明了一点,要加一个配置文件bootstrap.yml,这里面要去指定一些spring cloud consul config的一些配置,并且意思感觉是application.yml里的配置都可以不用写了,完全维护在spring cloud consul config里,但是spring cloud consul config到底在哪,我还是无法把需要配置的属性,application.ymlconsul agent里刚一片空白的配置页面,这三者联系起来

终于无意中,我发现有一篇文章的一句话让我警醒了。。。他不是像其他文章说一些貌似大家都懂的话,而是非常郑重了说了一句

clipboard.png

感觉这难道也是一个理解能力和我差不多,但是比我强的人么。。。他这么一句让我明白,确实官网说的也不太明白,最后那句体会一下,我再去反复看了文章,和自己试验。。。

终于懂了。。。

懂了之后再回过头来看,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

clipboard.png

也就是configdata目录都是默认值,你没有配置的时候,就不用管,但是你必须这么写,中间那个gateway就是刚那个 default-context,这样consul agent页面和bootstrap.xml就映射起来了,接下来你就可以在下面的value里像yaml文件一下写配置了

clipboard.png

当然你想改目录的两个默认值,你就可以这么修改了,对应prefixdata-key,把默认值写出来就一眼清楚了

spring:
  cloud:
    consul:
      config:
        format: yaml
        default-context: gateway
        prefix: config
        data-key: data

所以还是简单的,当然还有个问题,要是多个环境的不同配置怎么来的,嘿嘿,这是个关键问题,因为这个处理,让我实在没有想到,一般我们不用配置中心的时候,在工程里配置,可以按照application-test.ymlapplication-prod.yml来区分环境,这个spring cloud consul config也是可以的,不过不是创建config/gateway/data/test,亦或是config/gateway/data/prod这种。。。天真

特么竟然是config/gateway,test/dataconfig/gateway,data/data,没错,你没有看错,服务名和环境中间用逗号分开。。。

而且这个中间分隔符逗号还是支持可配。。。默认是逗号。。。你还可以用属性profile-separator进行修改

spring:
  cloud:
    consul:
      config:
        format: yaml
        default-context: gateway
        prefix: config
        data-key: data
        profile-separator: ','

可能我是一个比较传统的程序猿。。。这种逗号分开的目录命名方式对我来说还是有点冲击的。。。再回过头看官方的文档,也算是有点明白了。。。真的还是我的理解能力太差

clipboard.png

总得来说也是怪自己太着急了。。。之前几个开箱即用的把自己搞的浮躁了点。。其实仔细看文档还是能看明白的。。。

最后你可以像平常写配置文件一下,这么根据环境来配置了

clipboard.png

总结哈:戒骄戒躁吧。。。

----------------------------------------------------------------------华丽的分割线------------------------------------

这里简单说哈@FengSufeier 的疑问,从你提到

clipboard.png

所以估计你可能是自学还没有走入正式的工作场景中吧,我可以给你举个例子,在我们日常开发过程中,比如你现在有一个系统,有一个项目工程代码,里面有数据库配置,你正式上线的环境肯定有一个数据库的地址,你测试环境也会有一个数据库的地址,两个肯定不一样,不然现网数据和测试数据混在一起,或者有关联的话,测试环境数据库被测挂了,那现网数据库也就遭殃了,所以一般是分开的,这也就分了两个环境,但是代码是一份,数据库配置是分两份的,如何控制?

这个时候,我们一般就是把之前的一个配置文件application.yml分为application-test.ymlapplication-prod.yml两份,而这application-test.ymlapplication-prod.yml这两个文件去配置不同环境的数据库,当然这里叫testprod,你也可以叫其他名字,只是一个叫法,然后在启动的时候,添加虚拟机的启动参数(VM options):-Dspring.profiles.active=test,也就是告诉SpringBoot你需要执行哪个配置环境的配置文件

clipboard.png

这一点在boot说明文档里有提到,同时指定环境的配置文件执行时会把application.yml中的配置覆盖掉
clipboard.png

这样也很好,比如你有3个配置文件application.ymlapplication-test.yml,application-prod.yml,你可以把不同环境的配置放入后两个文件,但是一些公共的业务属性配置,不区分环境的配置就可以放到application.yml

以上回答了你的devtest的用途,用法是什么,总结一下

  1. devtest就是不同环境的名字,怎么取看你
  2. 为什么要这么做,就是实际开发中有一些配置必须要分两份,或更多份以示区分,同一个项目要在不同配置下运行
  3. 怎么用,其实就是根据你的要求按照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里的配置会生效嘛

希望这样的解释对你有帮助哈~


imango
3k 声望113 粉丝