前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud学习笔记(7):使用Spring Cloud Config配置中心

SpringCloud学习笔记(7):使用Spring Cloud Config配置中心

作者头像
布禾
修改2020-11-19 10:09:50
5730
修改2020-11-19 10:09:50
举报
文章被收录于专栏:好好学习,天天向上

简介

Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持,服务器端统一管理所有配置文件,客户端在启动时从服务端获取配置信息。服务器端有多种配置方式,如将配置文件存储在本地或者存储在远程Git仓库等等,并且在配置文件被更改时,可以通过多种途径如actuator的/refresh端点或者Spring Cloud Bus来动态刷新客户端的配置,而无需重新启动客户端。

项目介绍

  1. sc-parent,父模块(请参照SpringCloud学习笔记(1):Eureka注册中心)
  2. sc-eureka,注册中心(请参照SpringCloud学习笔记(1):Eureka注册中心)
  3. sc-config-client,访问配置中心的客户端
  4. sc-config-server,本地配置中心
  5. sc-config-server-git,远程配置中心

创建访问配置中心的客户端

1.在父模块下创建子模块项目sc-config-client,pom.xml:
代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.cf</groupId>
    <artifactId>sc-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>sc-config-client</artifactId>
  
  <dependencies>
  	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
  </dependencies>
</project>
2.创建启动类configclient.ConfigClientApplication:
代码语言:javascript
复制
package configclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConfigClientApplication.class, args);
	}
}
3.创建configclient.controller.ConfigClientController:
代码语言:javascript
复制
package configclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/client")
public class ConfigClientController {
	@Value("${nickName}")
	private String nickName;
	
	@GetMapping("/hello")
	public String hello(){
		return "hello," + nickName;
	}
}
4.创建bootstrap.yml:
代码语言:javascript
复制
spring:
  application:
    name: sc-config-client
  profiles:
    active: dev
  cloud:
    config:
      uri:  http://localhost:9003
      fail-fast: true

server:
  port: 9002

spring.cloud.config.uri:指定配置中心地址

spring.cloud.config.fail-fase:当连接不上配置中心服务器时,是否使当前客户端异常停止,而不是以默认配置启动。

使用本地配置中心

1.在父模块下创建子模块项目sc-config-server,pom.xml:
代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.cf</groupId>
    <artifactId>sc-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>sc-config-server</artifactId>
  
  <dependencies>
  	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
  </dependencies>
</project>
2.创建启动类configserver.ConfigServerApplication:
代码语言:javascript
复制
package configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ConfigServerApplication.class, args);
	}
}
3.创建application.yml:
代码语言:javascript
复制
server:
  port: 9003
      
spring:
  application:
    name: sc-config-server
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          searchLocations: classpath:/conf    

spring.profiles.active:配置文件的获取方式

spring.cloud.config.server.native.search-locations:本地配置文件的存放路径

4.创建/src/main/resources/conf/sc-config-client-dev.yml文件:
代码语言:javascript
复制
nickName: Luke 

该文件内容为客户端需要从服务端获取的配置信息,文件名称和客户端配置是相对应的,如sc-config-client-dev.yml=【spring.application.name】-【 spring.profiles.active】.yml

5.测试

启动本地配置中心sc-config-server成功后再启动客户端sc-config-client,访问http://localhost:9002/client/hello,客户端成功从配置中心获取nickName的配置:

使用远程配置中心

1.在父模块下创建子模块项目sc-config-server-git,pom.xml:
代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.cf</groupId>
    <artifactId>sc-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>sc-config-server-git</artifactId>
  
  <dependencies>
  	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-config-server</artifactId>
	</dependency>
	<dependency>
	    <groupId>org.springframework.cloud</groupId>
	    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>
  </dependencies>
</project>
2.创建启动类configserver.GitConfigServerApplication:
代码语言:javascript
复制
package configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class GitConfigServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(GitConfigServerApplication.class, args);
	}
}
3.创建application.yml:
代码语言:javascript
复制
server:
  port: 9005

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/ 

spring:
  application:
    name: sc-config-server-git
  cloud:
    config:
      server:
        git:
          uri: https://github.com/yinchao3577/test777.git
          username: xxxxx
          password: xxxxx
      label: master    
      fail-fast: true       

spring.cloud.config.server.git.uri:git存储库地址

spring.cloud.config.server.git.username:用户名

spring.cloud.config.server.git.password:密码

spring.cloud.config.server.git.searchPaths:配置文件所在目录,若在根目录则无需配置

spring.cloud.config.label:Git Repository的分支,默认为master

4.更改客户端配置

pom.xml添加Eureka依赖:

代码语言:javascript
复制
	<dependency>
	    <groupId>org.springframework.cloud</groupId>
	    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>

bootstrap.yml改为:

代码语言:javascript
复制
spring:
  application:
    name: sc-config-client
  cloud:
    config:
      name: myconfig2
      label: master
      discovery:
        enabled: true
        service-id: sc-config-server-git #使用Eureka注册中心来发现Config配置中心服务

server:
  port: 9002
    
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/

spring.cloud.config.name:远程仓库中配置文件的名称

spring.cloud.config.discovery.enabled:是否开启配置中心服务发现

spring.cloud.config.discovery.service-id:配置中心服务名称

5.测试

远程仓库myconfig2.yml值为:

代码语言:javascript
复制
nickName: Grace

依次启动注册中心sc-eureka、远程配置中心sc-config-server-git,sc-config-server-git启动成功后再启动客户端sc-config-client,访问http://localhost:9002/client/hello,客户端成功从配置中心获取nickName的配置:

手动刷新配置

actuator中包含一个/refresh的端点,用于配置的刷新。对该端点的调用实质是对RefreshScope类的调用,RefreshScope是上下文中的一个bean,它包含一个公共refreshAll()方法和refresh(String)方法,分别用来刷新范围内的所有bean或者指定的单个bean。

1.更改客户端配置

pom.xml添加actuator依赖:

代码语言:javascript
复制
	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

bootstrap.yml添加开启refresh节点的配置:

代码语言:javascript
复制
management:
  endpoints:
    web:
      exposure:
        include: 'refresh'
2.在ConfigClientController类上添加@RefreshScope注解,表示该类可以在运行时刷新配置,当调用完/actuator/refresh端点后,在下一次访问该Controller时,该Controller会重新初始化以及注入到容器中,初始化时会重新加载配置,所以在访问时将会访问到最新配置的值。
3.按之前测试的步骤进行启动和访问,修改github中配置的值后,重新访问客户端后值并没有更改,通过Postman工具发送POST请求到http://localhost:9002/actuator/refresh后,再重新访问客户端,值已经被更新成最新配置的值。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 项目介绍
  • 创建访问配置中心的客户端
    • 1.在父模块下创建子模块项目sc-config-client,pom.xml:
      • 2.创建启动类configclient.ConfigClientApplication:
        • 3.创建configclient.controller.ConfigClientController:
          • 4.创建bootstrap.yml:
          • 使用本地配置中心
            • 1.在父模块下创建子模块项目sc-config-server,pom.xml:
              • 2.创建启动类configserver.ConfigServerApplication:
                • 3.创建application.yml:
                  • 4.创建/src/main/resources/conf/sc-config-client-dev.yml文件:
                    • 5.测试
                    • 使用远程配置中心
                      • 1.在父模块下创建子模块项目sc-config-server-git,pom.xml:
                        • 2.创建启动类configserver.GitConfigServerApplication:
                          • 3.创建application.yml:
                            • 4.更改客户端配置
                              • 5.测试
                              • 手动刷新配置
                                • 1.更改客户端配置
                                  • 2.在ConfigClientController类上添加@RefreshScope注解,表示该类可以在运行时刷新配置,当调用完/actuator/refresh端点后,在下一次访问该Controller时,该Controller会重新初始化以及注入到容器中,初始化时会重新加载配置,所以在访问时将会访问到最新配置的值。
                                    • 3.按之前测试的步骤进行启动和访问,修改github中配置的值后,重新访问客户端后值并没有更改,通过Postman工具发送POST请求到http://localhost:9002/actuator/refresh后,再重新访问客户端,值已经被更新成最新配置的值。
                                    相关产品与服务
                                    微服务引擎 TSE
                                    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档