跑偏聊聊??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,以后新增组件和其他内容,还会跟大家分享,大家有什么疑问和我不对的地方,欢迎咨询和指正

原文地址:https://www.cnblogs.com/sunnyguo/p/12894088.html