Spring Cloud Config---server端和client端开发详细步骤

1 统一配置中心整体架构

1:背景

已经写了product,order两个服务,两个服务实现了多模块化,并且能正常用Fegin通信,但是每个服务还是用的单独的配置文件

2:存在的问题

  • 不方便维护
    多人参与同一个服务开发时,A把配置改了并push后,B如果需要用原来的配置就不行了。
  • 配置内容安全与权限
    主要针对线上配置,比如数据库账号密码等,但目前,把配置直接放在product服务中,那么开发人员就都能看到,所以需要采取隔离!
  • 更新配置项目需重启
    很多时候需要动态调整配置,但是每次都要项目重启肯定不方便

3:统一配置中心架构

  针对上面存在的问题,新建一个微服务 config-server ,整体架构如下图:
在这里插入图片描述
解释

  • 箭头表示配置文件流动的方向
  • 先把之前服务的配置都放在远端git上,比如GitHub,开源中国等
  • config-server把配置文件pull下来放在本地git中,本地git和config-server
    是双向流动的,防止远端git访问不到等问题
  • product client 两个服务集成 config-client 组件就可以正常拉取配置文件了

2 开发统一配置中心的server端

1 :准备工作

  1. 通过 https://start.spring.io/新建一个maven项目config ,依赖记得选择 Eureka Discovery 和 Client Server

  2. 修改 pom.xml保证版本和其他服务的统一。编写全局配置文件application.yml以实现向注册中心的注册,服务名为configLiu,端口号9103
    在入口类ConfigApplication添加注解@EnableDiscoveryClient表明这是一个Eureka客户端应用,启动入口类测试。
    备注: 这步的目的是将config也作为一个微服务注册到注册中心了,也可以不用向注册中心注册,作为一个单独的服务就好,那这步就可以省略。

2:配置统一配置中心的全局配置文件

  1. GitHub新建仓库Spring-Cloud用于存放配置文件,然后在仓库的主分支里新建文件order.yml,将order服务的order.yml内容复制过来。(其他服务配置文件也是类似复制)

在这里插入图片描述
2. 配置config的 yml文件,添加git访问的内容以及克隆远程仓库.同时,在启动类添加@EnableConfigServer注解表示这是一个config服务端。如下

#服务名
spring:
application:
   name: configLiu
cloud:
   config:
     server:
       git:
         uri: https://github.com/lililuni/Spring-Cloud/
         username: lililuni
         password: 10221114520love
         basedir: H:\springCloud\liao\config\basedir
         #仓库相对路径
         searchPaths: config-repo

#向注册中心注册 (不用向注册中心注册的话,这里不写)
eureka:
client: 
  service-url:
   defaultZone: http://218.197.229.216:8761/eureka/

#服务端口号  
server:
port: 9103  

3:测试server端

启动入口类, 浏览器访问 http://localhost:9103/order-a.yml(分支默认为主分支master)就可以看到它的内容,a为仓库中yml文件中env环境。假设我仓库dev分支下的order.yml文件部分内容如下:

server:
 port: 9102  
env:
 list

访问路径应为http://localhost:9103/dev/order-list.yml
在这里插入图片描述
补充
  在我的远程仓库中,我把order.yml放在了master分支config-repo文件夹内,为了正确访问,需要修改在config中全局配置文件,增加一行表示仓库相对路径

spring.cloud.config.server.git.searchPaths=config-repo

3 开发统一配置中心的client端

以order服务为例,将order服务改成客户端,具体步骤如下:

将order服务原来的全局配置文件删除,新建一个bootstrap,yml,名称必须为这个

1. 配置中心server端 没向Eureka 注册中心注册

此时,server端作为一个单独的项目,并非微服务,bootstrap,yml按下面格式写

spring:
  cloud:
    config:
      #统一配置中心网址
      uri:  http://localhost:9103/
      #本服务名
      name: order
      #环境env配置
      profile: dev
      #分支
      label: master

客户端应用从配置管理中获取配置信息遵从下面的执行流程:

  1. 应用启动时,根据bootstrap.yml中配置的应用名{application}、
    环境名{profile}、分支名{label}, 向ConfigServer请求获取配置信息。
  2. Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查
    找配置信息。
  3. 通过git clone命令将找到的配置信息下载到ConfigServer的文件系统中。
  4. Config Server创建Spring的ApplicationContext 实例, 并从Git本地仓库中
    加载配置文件, 最后将这些配置内容读取出来返回给客户端应用。
  5. 客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,
    该配置内容的优先级高于客户端Jar包内部的配置内容, 所以在Jar包中重复的内
    容将不再被加载。

2. server端 向Eureka 注册中心注册了

bootstrap,yml按下面这样写(也可以按照第一种情况的写,但是这种情况下的话,建议用下面的写法):

spring:
  #服务名
  application:
    name: order     
  cloud:
    config:
      profile: dev #env 对应的环境变量
      discovery:
        enabled: true #开启通过服务来访问 config server的功能
        service-id: configLiu #config server 注册到注册中心的服务名

#端口号
server:
  port: 9102
  
#向注册中心注册 
eureka:
 client: 
   service-url:
    defaultZone: http://218.197.229.216:8761/eureka/

在完成了上面两步后,就完成了统一配置中心的客户端开发了,但此时,仍存在一些问题。

4 存在的问题

  1. 我们在order服务中新建一个类TestEnv,获取order服务中的环境配置
@RestController
@RequestMapping("/env")
public class TestEnv {

	@Value("${env}")
	private String envString;
	
	@GetMapping("/test")
	public String getEv() {
		return envString;
	}
}
  1. 启动config服务和order服务,浏览器访问 localhost:9102/env/test,可以看到ev的内容
  2. 修改远程仓库中的ev的值,(两个服务一直不关)再刷新网址时,会发现ev内容并没有发生改变,这就是说明config服务端尚不能动态刷新配置文件。

为了解决上面问题,Spring Cloud Bus 自动刷新配置就出现了,具体配置请见下节

源码:统一配置中心

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值