SpringCloud极简入门-配置中心Spring Cloud Config

简介: 在分布式系统中,由于服务数量很多,为了方便服务配置文件统一管理我们需要用到置中心组件。在Spring Cloud中,分布式配置中心组件spring cloud config 它可以帮我们集中管理配置文件,修改配置无需重启服务 等,它支持配置文件放在配置服务的本地,也支持放在远程如Git仓库中集中管理。在spring cloud config 分为了服务端 config server和客户端config client 两个角色。

十二.配置中心Spring Cloud Config

1.理解配置中心

1.1.什么是配置中心

在分布式系统中,由于服务数量很多,为了方便服务配置文件统一管理我们需要用到置中心组件。在Spring Cloud中,分布式配置中心组件spring cloud config 它可以帮我们集中管理配置文件,修改配置无需重启服务 等,它支持配置文件放在配置服务的本地,也支持放在远程如Git仓库中集中管理。在spring cloud config 分为了服务端 config server和客户端config client 两个角色。

1.2.配置中心工作流程

使用spring cloud config管理配置文件,我们需要把微服务的配置文件上传到Git仓库 , 然后搭建独立的ConfigServer服务,ConfigServer除了要从Git仓库拉取配置之外,还要注册到EurekaServer中,我们把ConfigServer本身也当做是一个微服务(当然ConfigServer可以脱离注册中心使用,但是如果客户端使用服务发现的方式指向配置中心就需要注册到注册中心了),至于ConfigClient这需要集成到具体的微服务中,如支付服务,订单服务等。其工作流程是,微服务通过ConfigClient向配置中心ConfigServer发起请求获取配置文件,配置中心从GIT仓库获取配置,然后再一路返回给微服务。

需要注意是,EurekaServer的配置不能交给ConfigServer管理,因为必须要先启动EurekaServer才能启动ConfigServer,试问EurekaServer都没配置怎么启动?

1.3.解决方案

根据上图我们知道,如果要实现配置文件统一管理,我们需要创建自己的远程仓库(当然也可以本地,或者其他仓库),我这里选择“码云”,然后将配置文件上传上去 ,然后我们需要搭建自己的配置中心服务ConfigServer,配置上码云的仓库地址和相关账号,最后我们需要去修改我们的微服务如:zuul网关,支付服务等集成ConfigClient 。

2.Git仓库管理配置

2.1.使用码云创建远程仓库

我们用码云作为git仓库 ,创建码云仓库

我这里以zuul网关服务做演示 。 创建zuul配置 在仓库中创建文件 ,我们先将zuul的配置文件复制到码云上 , 并负责好仓库地址以备用。

注意复制好仓库地址,在克隆中取拷贝 , 待会搭建配置中心的时候会用到

3.搭建配置中心

3.1.搭建项目

搭建工程 springcloud-config-server-1070 ,作为配置中心服务端,搭建好项目结构如下

springcloud-parent
pom.xml
  springcloud-config-server-1070  //配置中心服务
  springcloud-eureka-server-1010
  springcloud-order-server-1030
  springcloud-pay-server-1040
  springcloud-user-common
  springcloud-user-server-1020
  springcloud-zuul-server-1060  //网关服务
  springcloud-hystrix-turbine-1050 //聚合监控服务

3.2.导入依赖

这里导入了Eureka Client基础依赖 ,和config server服务端依赖已经web依赖

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

3.3.开启配置中心

在主配置类通过打@EnableConfigServer标签开启配置中心

packagecn.itsource.springboot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.config.server.EnableConfigServer;
importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;
/*** 配置中心的启动类* @EnableConfigServer:开启配置中心*/@SpringBootApplication@EnableEurekaClient@EnableConfigServerpublicclassConfigServerApplication1070{
publicstaticvoidmain( String[] args )
    {
SpringApplication.run(ConfigServerApplication1070.class);
    }
}

3.4.配置文件

ConfigServer的配置文件做两个事情,1.注册到EurekaServer,2.配置码云地址

eureka:  client:    serviceUrl:      defaultZone: http://peer1:1010/eureka/,http://peer2:1011/eureka/,http://peer3:1012/eureka/ #注册中心地址  instance:    prefer-ip-address: true #使用ip地址注册    instance-id: config-server:1070  #指定服务的idserver:  port: 1070spring:  application:    name: config-server
  cloud:    config:      server:        git:#配置远程仓库地址,去仓库中复制          uri: https://gitee.com/little_wolf/springcloud-config-1010.git 
          username: 1462163787@qq.com #仓库是私有的需要账号          password: 你的密码
#search-paths: 路径 #如果配置文件不再仓库的根目录,需要配置查找路径

方式二:在本地管理配置文件

通常情况下,我们会通过 srping.cloud.config.server.git.uri配置远程的Git仓库地址,(如上配置),配置中心服务从git仓库中拉取配置文件,而其它微服务再从配置中心服务获取配置 ,但有的时候因为网络故障等原因我们没办法连接到git仓库,那整个微服务的配置文件都可能会拉取失败,针对于这种情况我们可以把配置文件统一管理在本地磁盘中,如下配置:

spring:  application:    name: config-server
  cloud:    config:      server:        git:          native:            search-locations: classpath:config,file:D:/config   
#从d:/config 和 classpath:config加载#配置远程仓库地址#uri: https://gitee.com/little_wolf/springcloud-config-1010.git #username: 1462163787@qq.com  #仓库是私有的需要账号#password: 你的密码#search-paths: 路径 #如果配置文件不再仓库的根目录,需要配置查找路径      profiles:    active: native  #基于本地的配置

3.5.测试配置中心

浏览器访问:http://localhost:1070/application-zuul-dev.yml 你可以看到ConfigServer从Git仓库获取到的zuul的配置文件内容如下:

4.Zuul集成ConfigClient

上一步骤我们已经可以通过ConfigServer从码云上获取到配置文件,我们的最终目的是能够让我们的微服务,zuul-server,order-server等都可以从ConfigServer拉取到配置文件,这里功能我们需要给微服务集成ConfigClient来实现。修改“springcloud-zuul-server-1060” zuul工程如下:

4.1.导入依赖

config client基础依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-client</artifactId></dependency>

4.2.创建bootstrap.yml配置文件

需要特别说明一下,虽然我们把zuul的配置文件搬到了码云上面,但是zuul本地依然需要一些基础的配置 ,在ConfigClient需要使用bootstrap.yml来作为基础配置文件,这是因为bootstrap.yml的优先级高于application.yml或者其他配置来源,我们得让微服务优先从码云上拉取配置文件后才能做其他的事情。

创建配置文件 resources/bootstrap.yml,添加如下内容

#配置中心的地址spring:  cloud:    config:      uri: http://localhost:1070 #zuul要从配置中心拉取文件#你要拉取具体的哪个配置文件      name: application-zuul  #配置文件名字   dev是环境      profile: dev #环境  组成完整的文件名:application-zuul-dev.yml      label: master #主分支

提示:我们的Zuul需要从ConfigServer拉取配置文件,所以这里通过…config.uri指向配置中心地址,name属性值得是配置文件的名字 ,profile是环境名字 , name的值和profile的值合在一起组成完整的配置文件名,好处是可以修改profile的值来切换配置环境,label是git的分支,默认是master。

方式二:使用服务名方式发现配置中心

上面的配置文件中通过uri指向配置中心地址获取配置文件,我们也可以通过服务发现的方式指向配置中心,该方式需要屏蔽掉 uri ,使用 discovery.service-id 来指定配置中心的服务名 ,使用discovery.enabled=true来开启服务发现。

需要注意的是:如果使用服务发现的方式来指向配置中心,那么EurekaServer的注册地址需要在本地配置文件中指定。具体配置如下:

spring:  cloud:    config:#uri: http://localhost:1030      name: application-zuul
      profile: dev
      label: master
      discovery:        service-id: config-server #配置中心服务名        enabled: true #使用服务名访问配置中心eureka:  client:    serviceUrl:      defaultZone: http://peer1:1010/eureka/,http://peer2:1011/eureka/,http://peer3:1012/eureka/ 
#注册中心地址,需要从注册中心使用服务名发现配置中心

提示:如果ConfigServer配置中心做了集群,那么建议配置中心客户端使用服务名的方式发现配置中心

4.3.测试zuul

启动zuul,观察启动的端口如果是1060说明已经从Git仓库拉取到了配置文件了,如果启动的端口是8080,说明配置文件拉取失败,这个时候需要检查你的集成步骤。

5.配置中心集群

5.1.为什么要做集群

Spring Cloud Config配置中心组件帮我们实现了配置文件的统一管理 ,但是在单节点的配置中心情况下暴露的问题也比较明显,即当配置中心服务宕机,那么整个微服务都没有办法再获取到配置文件,为了解决单节点问题,我们需要对配置中心做集群实现高可用。

5.2.集群方案

方式一:客户端指向多个服务端地址

启动多个配置中心服务,他们可以各自独立,在配置中心客户端通过spring.cloud.config.uri指向多个配置中心服务的地址,使用逗号分隔。

如启动了两个配置中心:localhost:1070 , localhost:1070,那么zuul(config client)需要修改配置文件:

#配置中心的地址spring:  cloud:    config:      uri: http://localhost:1070,http://localhost:1071 #zuul要从配置中心拉取文件#你要拉取具体的哪个配置文件      name: application-zuul  #配置文件名字   dev是环境      profile: dev #环境  组成完整的文件名:application-zuul-dev.yml      label: master #主分支

这种方式比较简单,我们着重演示一下第二种方式

方案二:服务发现方式:把配置中心作为普通微服务实现集群,即多个配置中心的spring.application.name应用名相同,并注册到注册中心。

配置中心客户端(Config Client)使用 spring.cloud.config.discovery.enable=true 开启配置中心服务发现功能,

使用spring.cloud.config.discovery.service-id指定配置中心服务名,客户端会从EurekaServer根据配置的服务名去发现配置中心。

配置中心客户端微服务会从多个配置中心服务选择一个拉取配置文件,如果优先被选中的配置中心服务挂了,会尝试从下一个配置中心服务拉取配置。

5.3.配置中心集群实战

修改配置中心服务

修改springcloud-config-server-1070 配置文件,这里做了两个配置中心配置

eureka:  client:    serviceUrl:      defaultZone: http://peer1:1010/eureka/,http://peer2:1011/eureka/,http://peer3:1012/eureka/ #注册中心地址spring:  application:    name: config-server
  cloud:    config:      server:        git:          uri: https://gitee.com/little_wolf/springcloud-config-1010.git  #配置远程仓库地址,去仓库中复制          username: 1462163787@qq.com #仓库是私有的需要账号          password: 你的密码
spring:  profiles:    active: config1  #指定配置文件---spring:  profiles: config1
eureka:  instance:    prefer-ip-address: true #使用ip地址注册    instance-id: config-server:1070  #指定服务的idserver:  port: 1070---spring:  profiles: config2
eureka:  instance:    prefer-ip-address: true #使用ip地址注册    instance-id: config-server:1071  #指定服务的idserver:  port: 1071

启动两个配置中心,观察Eureak监控面板应该在 config-server服务下挂了两个节点

修改配置中心客户端zuul

修改springcloud-zuul-server-1060 配置文件,使用服务发现方式拉取配置

spring:  cloud:    config:      name: application-zuul #要拉取的配置      profile: dev
      label: master
      discovery:        enabled: true   #开启服务发现        service-id: config-server    #配置中心服务名eureka:  client:    serviceUrl:      defaultZone: http://peer1:1010/eureka/,http://peer2:1011/eureka/,http://peer3:1012/eureka/ #注册中心地址

这样一来,即使其中一个配置中心挂了也有另外一个配置中心做支撑。

测试配置中心集群

启动两个配置中心,启动zuul , 观察端口是否正常获取到 ,如果关闭其中一个配置中心,zuul重启也应该能正常启动和使用。


6.配置中心出错的问题解决

如果发现你的客户端微服务启动不成功,有哪些问题造成:

1.配置文件拉取不到

2.配置文件拉取到了,但是配置内容有错

3.项目其他地方错误 - 不是配置文件的问题

如何判断是配置拉取不到?

观察启动的端口是不是以8080启动的,如果是,一定是配置文件拉取不到(除非你真的就配置的是8080)排查方式:

检查配置中心服务端是否有问题

  • 检查ConfigServer启动没有,端口,地址对不对
  • 打开浏览器访问一下配置文件看能不能拉取到配置文件,如下:
http://localhost:1070/application-zuul-dev.yml
  • 如果配置中心能获取到配置文件,那么错误一定在ConfigClient ,或者是内容有问题
  • 如果配置中心拉取不到配置,有两种情况,1是git地址配置错误,2.内容编码错误,格式错误导致拉取不到
  • 检查配置中心的git地址,用户名,密码是否有问题
  • 打开码云确认一下内容是否有问题,格式,编码

如果服务端没问题检查客户端

  • 对比你的 spring.cloud.config.name 和 profile是否和码云上的配置文件一样,以及 label分支是否一致
  • 检查你的 spring.cloud.config.uri 写对了没有,是不是你的配置中心服务的地址
  • 检查你的依赖:spring-cloud-config-client导入没有,导入成功么有,按ctrl去点击一下你的依赖(或者删除本地厂库中的依赖重新下载)

配置文件拉取到也报错

如果配置文件拉取到了,服务启动的端口应该就是你配置文件的端口,但是如果启动日志还是有异常,那应该不是配置文件拉取不到的问题了 ,可以把配文件配置成本地方式来排除错误:

  • 注释掉 spring-cloud-config-client包
  • 恢复本地配置文件

如果配置文件改成本地配置还是启动不能,那就是其他问题,可能是配置文件内容的问题,也可能是代码问题,根据错误日志排查

目录
相关文章
|
23天前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
4天前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
23天前
|
监控 NoSQL Java
Spring Boot Actuator 使用和常用配置
Spring Boot Actuator 使用和常用配置
38 5
|
9天前
|
Java Spring
Spring Boot Admin 授权配置
Spring Boot Admin 授权配置
17 0
|
9天前
|
监控 Java Spring
Spring Boot Admin 配置应用
Spring Boot Admin 配置应用
18 0
|
2天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
30天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14243 19
|
2月前
|
人工智能 Java Spring
使用 Spring Cloud Alibaba AI 构建 RAG 应用
本文介绍了RAG(Retrieval Augmented Generation)技术,它结合了检索和生成模型以提供更准确的AI响应。示例中,数据集(包含啤酒信息)被加载到Redis矢量数据库,Spring Cloud Alibaba AI Starter用于构建一个Spring项目,演示如何在接收到用户查询时检索相关文档并生成回答。代码示例展示了数据加载到Redis以及RAG应用的工作流程,用户可以通过Web API接口进行交互。
52443 66
|
1天前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
14 0
|
2月前
|
消息中间件 Java 持续交付
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项
421 0
Spring Cloud Alibaba 项目搭建步骤和注意事项