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包
  • 恢复本地配置文件

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

目录
相关文章
|
17天前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
33 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
20天前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
13天前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
24 0
|
16天前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
53 0
|
19天前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
20天前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
20天前
|
SQL Java 数据库连接
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
|
20天前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
12月前
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
10月前
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
111 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)