乐趣区

spring-cloud-consul-config小demo遇到的问题

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

正好我也想看看新东西,天天解决业务问题。。。太没有激情了。。。而且我们大多应用都还是 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, 很明显有了一个类似配置中心的菜单

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

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

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

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

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

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

当然你想改目录的两个默认值,你就可以这么修改了,对应 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: ','

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

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

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

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

退出移动版