Spring Cloud Config---server端和client端开发详细步骤
文章目录1统一配置中心整体架构1:背景2:存在的问题3:统一配置中心架构2 开发统一配置中心的server端1 :准备工作2:配置统一配置中心的全局配置文件3:测试server端3 开发统一配置中心的client端1. 配置中心server端 没向Eureka 注册中心注册2. server端 向Eureka 注册中心注册了4 存在的问题1统一配置中心整体架构1:背景已经写了prod...
文章目录
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 :准备工作
-
通过 https://start.spring.io/新建一个maven项目config ,依赖记得选择 Eureka Discovery 和 Client Server
-
修改
pom.xml
保证版本和其他服务的统一。编写全局配置文件application.yml
以实现向注册中心的注册,服务名为configLiu
,端口号9103
。
在入口类ConfigApplication添加注解@EnableDiscoveryClient
表明这是一个Eureka客户端应用,启动入口类测试。
备注: 这步的目的是将config
也作为一个微服务注册到注册中心了,也可以不用向注册中心注册,作为一个单独的服务就好,那这步就可以省略。
2:配置统一配置中心的全局配置文件
- 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
客户端应用从配置管理中获取配置信息遵从下面的执行流程:
- 应用启动时,根据bootstrap.yml中配置的应用名{application}、
环境名{profile}、分支名{label}, 向ConfigServer请求获取配置信息。- Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查
找配置信息。- 通过git clone命令将找到的配置信息下载到ConfigServer的文件系统中。
- Config Server创建Spring的ApplicationContext 实例, 并从Git本地仓库中
加载配置文件, 最后将这些配置内容读取出来返回给客户端应用。- 客户端应用在获得外部配置文件后加载到客户端的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 存在的问题
- 我们在order服务中新建一个类
TestEnv
,获取order服务中的环境配置
@RestController
@RequestMapping("/env")
public class TestEnv {
@Value("${env}")
private String envString;
@GetMapping("/test")
public String getEv() {
return envString;
}
}
- 启动config服务和order服务,浏览器访问 localhost:9102/env/test,可以看到ev的内容
- 修改远程仓库中的ev的值,(两个服务一直不关)再刷新网址时,会发现ev内容并没有发生改变,这就是说明config服务端尚不能动态刷新配置文件。
为了解决上面问题,Spring Cloud Bus 自动刷新配置就出现了,具体配置请见下节
源码:统一配置中心
更多推荐
所有评论(0)