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

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

目录
相关文章
|
9天前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
52 2
|
29天前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
67 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
29天前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
78 0
|
29天前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
104 0
|
29天前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th=&quot;http://www.thymeleaf.org&quot;`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
40 0
|
2月前
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
558 1
|
29天前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
7月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
8月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
227 1
|
4月前
|
SpringCloudAlibaba 负载均衡 Dubbo
【SpringCloud Alibaba系列】Dubbo高级特性篇
本章我们介绍Dubbo的常用高级特性,包括序列化、地址缓存、超时与重试机制、多版本、负载均衡。集群容错、服务降级等。
【SpringCloud Alibaba系列】Dubbo高级特性篇
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等