• 跑偏聊聊??springcloud config配置中心步骤以及踩的坑


    一、心路历程

    终于告一段落了,从开始搭建配置中心到现在,经历了心理和现实的一系列过程。

    入职这家公司后,有个公司架构师给了一个基础的框架,说是用springcloud,里面切切实实是一个架子,springcloud的多个组件都没有引入(在这里提一下,这个架构是我们投资人的其他公司的技术,不属于我们公司,只是顺便带一下我们)。

    看我之前的文章大家知道,业务开发中基本的springcloud zuul和feign组件是我一步一步搭建起来的。虽说对于大部分人来说很简单,但对于我来说,由于之前公司使用的是springboot,所以从接触springcloud至今还没到一年的时间。搭建起来既属于了解也属于摸索的过程。

    大家知道springcloud是个全家桶模式,里面是由多个组件构成的。zuul和feign是开发业务必须的,所以早早的搭建了。其他的还在逐步完善中。因为最近在联调接口,有点时间,想起来config还没搭建,就起了念头。

    前段时间搜过很多关于config的文章,都没看下去,后来就上手根据网上的步骤一步一步操作,但是有的步骤操作着操作着就断了,接下来的步骤也不一样,慢慢的搭建配置中心的事情搁置了。

    最近领导让我们小组长出一份近月的工作安排,我觉得是时候将配置中心实实在在的安排进去了。接下来我耐心开始搜集相关资料,没想到当天的配置中心就进行了大概40%的样子(原谅我需要一些时间进行摸索,哈哈哈)。

    到今天,大概步骤是走完了,雏形出现了。不由得感慨一下子。

    有的事情需要坚持、需要耐心。记得几年前?我忘记了,当时和我老公去海南玩,每个女生都想要美美哒,但当时画眼线是我化妆道路上的一道坎,平时上班懒,加上每次画眼线就开始流眼泪,导致我一直没有学会。那次出门旅游,我又带了眼线笔,以为眼线笔又是陪伴我旅游的伙伴。记得第二天早晨出门之前,我开始洗漱化妆,试着拿出眼线笔,还是流泪,还是不行,但是我心里有个信念,我一定要学会,忍住眼泪,按照网上的步骤,眼线慢慢成形了。虽然我现在上班也不画眼线,但是我会,这很重要,至少哪天心血来潮,我可以美美的出gai。后来戴美瞳也是相同经历。其实这就是不放弃和相信的力量。我身上有太多相信的力量,以后有机会可以慢慢讲给你们。有点跑偏了。。。。。

    二、懒惰的可怕

    继续聊偏。。。从某个时刻起,我对生活变得太过知足。举栗子,假如是经历了一些常人没经历的事情。其实我觉得这种经历挺害人的,害我从对生活的积极追求,变成对生活的消磨。不是不再热爱生活,只是没有冲劲。其实我和我老公对比就能看的出来,因为我俩都是做技术的,而我现在还是个搬运工,他已经称为工程师了,呜呜。。。。好了,话不多说了,开始我们的配置中心步骤及我踩过的坑,有兴趣的可以关注我,等以后有机会继续聊。

    三、进入正题——开始配置中心config(遇到的坑在步骤中列出,如果你在配置中有问题,参照我的步骤看能不能出坑)

    来一波官方介绍:配置管理。springcloud提供服务端和客户端。服务端存储后端的默认实现使用git(github或者码云)。

    白话:为了在不同的环境、不同的分支(lable没配置,我们项目不需要区分分支配置)获取不同的配置信息。

    步骤开始:

    1.springcloud config服务端:

    新建一个service-config服务,

    三个文件:启动类的文件configApplication/依赖型文件pom.xml/配置类文件application.yml

    1.configApplication.java:加注解@EnableConfigServer

    @EnableConfigServer
    @EnableDiscoveryClient
    @SpringBootApplication
    public class ConfigApplication{
    
    	public static void main(String[] args) {
    		SpringApplication.run(ConfigApplication.class, args);
    	}
    
    }

    2.pom.xml中引入spring-cloud-config-server

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    3.application.yml

    spring:
      application:
        name: config-service
      cloud:
        config:
          server:
            git:
              uri: git@gitee.com:********.git(放配置文件的码云地址,ssh类型的)
              searchPaths: tms-config/{application}(tms-config是文件夹,application是每个服务的名字,自动获取,你也可以写死例如bi-service,代表这个服务的所有配置,我这边是通过{application}来获取客户端名称匹配文件夹.下边有截图呼应)
              strict-host-key-checking: false
              ignore-local-ssh-settings: true
              private-key: |
                            -----BEGIN RSA PRIVATE KEY-----
                            MIIJKwIBAAKCAgEA5/4250BoXVUpkLhcePM333ZRxm565XvhnspHOi/PrwjQp0H8
                            .........
                            -----END RSA PRIVATE KEY-----
             #username:
             #password:
    
    server:
      port: 8888
    
    
    # 配置服务注册中心
    eureka:
      client:
        serviceUrl:
          defaultZone: http://eureka-server:8761/eureka/
    

    坑一:

    用户名密码方式和公私钥方式都可以。

    如果uri是https形式,那么使用用户名和密码方式即可

    如果uri是ssh形式,则使用公私钥形式。

    重点说下公私钥形式的坑:

    首先要加上这两行:

    strict-host-key-checking: false
    ignore-local-ssh-settings: true

    其次:生成公私钥,私钥放到项目里,公钥放到码云的对应项目的公钥配置里(配置中心文件结构,等下有图)

    此时:服务端ok了,如果启动完注册中心和配置中心,出现以下问题:

    .git.privateKey' is not a valid private key

    可能的原因一:码云不接受以-----BEGIN OPENSSH PRIVATE KEY开头的私钥形式,你需要生成以

    ----BEGIN RSA PRIVATE KEY开头的形式。如上图。生成命令

    ssh-keygen -m PEM -t rsa -b 4096 -C "****"

    可能原因二:这是我搜索出来的,private-key空格后加一个真实的 | 才行

    接下来上图码云上的配置文件的结构:4个图,提示的是每次点进去的内容。注意config上的配置文件是以应用名-dev/-test/-prod.properties结尾的,就是不同环境拉不同配置

    好,此时,服务端已经ok了。你可要通过请求试一下

    2.客户端(业务端模块)处理:

    修改三个文件,依赖型文件pom.xml、配置型文件application.yml、业务使用controller

    pom.xml引入spring-cloud-starter-config

    <!--Spring Cloud Config 客户端依赖-->
    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <!--Spring Boot Actuator,感应服务端变化(实现热更新配置使用)-->
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    application.yml

    management:
      endpoints:
        web:
          exposure:
            include: refresh,health,info
    spring:
      application:
        name: bi-service
      cloud:
        config:
          discovery:
            enabled: true
            service-id: config-server(可用下边的uri代替)
          profile: dev //环境配置
    #      uri: http://localhost:8888(可用service-id: config-server代替)
    
    server:
      port: 8084

     controller:

    
    @RefreshScope
    @RequestMapping("/api/bi/biDictionary")
    @RestController
    public class BiDictionaryController {
    
        @Value("${common_service_config}")
        private String configInfo;
    
    
        @GetMapping("/baseData")
        public String getaaa(){
            System.out.print(configInfo);
    }
    
    
    }

    坑二:

    启动完注册中心、配置中心、在启动客户端时,如报错:

    Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'common_service_config' in value "${common_service_config}"

    原因是:客户端的应用名和配置文件的应用名没有一致

     本客户端的应用名为:bi-service。在配置文件里应该叫bi-service-dev.properties。如果前面不一致的话,是找不到配置文件的

    坑三:刷新生效的四步

    栗子:如果你修改了bi-service-dev.properties里的common_service_config=devdev,把devdev改成devdev111。如果你启动客户端bi-service服务,是可以读取到新的devdev111.但是启动客户端成本较大,我们需要实现热更新。

    解决方法:(上面贴的代码里已包含)

    1.客户端pom.xml中引入了spring-boot-starter-actuator。2.在controller的类上加了注解@RefreshScope。加这个的目的是为了在修改配置后不启动客户端。但此时,修改后,客户端并没有拉取到新的值。3.需要在客户端applicaiton.yml加上

    management:
      endpoints:
        web:
          exposure:
            include: refresh,health,info

    此时,在所有服务运行过程中,如果你修改了bi-service-dev.properties,改成devdev111。

    4.你需要在postman或者黑屏里执行

    curl -X POST http://localhost:8084/actuator/refresh。注意域名和ip是客户端的。执行后,你在客户端controller下次获取到的值就变成devdev111.

    完美。此时我最近配置的config步骤和三个坑都说完了。

    以上是我总结的springcloud config,以后新增组件和其他内容,还会跟大家分享,大家有什么疑问和我不对的地方,欢迎咨询和指正

  • 相关阅读:
    m-n的随机整数 包括m n
    获取url参数 hash类型
    js 数组转带空格字符串
    产生n-m的随机数组
    js 判断android、IOS
    判断是否微信浏览器
    文本左右对齐方式css
    H5微信支付流程
    H5微信授权登录流程
    H5页面 input禁止弹出键盘
  • 原文地址:https://www.cnblogs.com/sunnyguo/p/12894088.html
Copyright © 2020-2023  润新知