高级框架第十三天Config:分布式配置中心

第一部分

Bus:消息总线

主要内容

1.消息总线简介

2.基于消息总线实现全局热刷新

一.消息总线简介

1.什么是Spring Cloud Bus

Soring Cloud Bus继承了市面上常见的RabbitMQ和Kafka等消息代理.其会连接微服务系统值所有拥有Bus总线机制的节点,当有数据变更的时候,会通过消息中间件使用消息广播的方式通知所有的微服务节点同步更新数据.(如:微服务配置更新等)

二.基于消息总线实现热刷新

基于Bus消息总线热刷新功能,需要在所有的Eureka Client端应用中增加spring-cloud-starter-bus-amqp依赖,这个依赖是消息总线集成的RabbitMQ消息同步组件.此启动器包括actuator启动器(spring-boot-starter-actuator,基于消息总线的热刷新同样是通过actuator实现的)

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-bus-amqp</artifactId>

</dependency>

1.设计方案

1.1Client端热刷新实现-结构图

1.2Server端热刷新实现-结构图

2.配置文件

在所有的Eureka Client工程配置文件中增加下述配置:

spring:

    rabbitmq:

        host:192.168.232.132

        username: bjsxt

        password: bjsxt

management:

    endpoints:

        enabled-by-default: true

        web:

            exposure:

                include: '*'

3.测试热刷新

消息总线Bus基于Actuator对外提供了热刷新服务,服务地址是:http://ip:port/actuator/bus-refresh.此服务只能使用POST方式请求,可以使用Postman测试

第二部分

Config:分布式配置中心

主要内容

1.分布式配置中心简介

2.在Gitee中创建配置文件

3.新建Config Server

4.搭建Config Client

5.热刷新

一.分布式配置中心简介

1.为什么使用Spring Cloud Config

在常规的开发中,每个微服务都包含代码和配置.器配置包含服务配置,各类开关和业务配置.如果系统结构中的微服务节点较少,Nemo常规的代码+配置的开发方式足以解决问题.当系统逐步迭代,器微服务会越来越复杂,慢慢演化成网状依赖结构,这个时候常规的代码+配置的开发方式就并不合适了,因为还要考虑整体系统的扩展性,伸缩性和耦合性等.这些问题中,配置的管理也是非常麻烦的.

如果还是以常规开发形式管理配置,则要承担反复修改编译代码,重启系统,重新打包等风险.所以,一个可以集中管理,带有版本控制的配置中心应运而生

Spring Cloud Config就是一个分布式配置中心解决方案.其采用集中式管理每个微服务的配置信息,并使用GIT等版本仓库统一存储配置内容,实现版本化管理控制

2.优点(能做什么)

提供服务端和客户端支持(spring cloud config server和spring cloud config client)

集中式管理分布环境中的配置信息(所有配置文件统一放在了gitee中)

基于spring环境提供配置管理,与spring系列框架无缝结合

可用于任何语言开发环境,基于http协议

默认基于GIT仓库实现版本控制

3.总体架构

本课程中以gitee作为远程仓库.也可以使用其他git支持的远程仓库

角色说明,在Spring Cloud Config中包含两个角色:

    Spring Cloud Config Server:负责接收Config Client请求,根据请求从Gitee中获取到配置文件

    Spring Cloud Config Client:之前所写的包含配置文件的项目都是Config Client

流程如下:

    需要把项目的配置文件上传到Gitee中.(此次直接在gitee进行在线编写配置文件,省去使用git上传配置文件到gitee的过程)

Config Client通过Rest访问Config Server,Config Server在去访问Gitee

二.在Gitee中创建配置文件

配置文件可以在本地创建后使用git上传.在学习过程中更加简单的方式是直接在gitee中创建文件,编辑内容

1.新建仓库

仓库名称自己起.实例中仓库名字为config

是否生成readme文件对于Spring Cloud Config没有影响

仓库是public还是private也没有影响.示例中使用public演示

点击创建按钮即可创建一个仓库

2.新建配置文件

编写内容如下:文件名为bjsxt.yml

3.新建带有profile的配置文件

配置中心支持Spring Boot文件格式:文件名-profile.yml.其中profile代表环境,支持完全自定义.常用的有dev,test等

三.搭建Config Server

Config Server主要的任务是从Git(远程或本地仓库)获取到配置文件,Config Client通过REST获取到配置文件的内容

可以使用刚刚搭建好的Gitee上的仓库进行使用

1.添加依赖

如果只是访问远程git仓库,对外暴露url的功能,只需要天啊及spring-cloud-config-server依赖(包含了spring-boot-starter-web)

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.2.5.RELEASE</version>

</parent>

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-dependencies</artifactId>

            <version>Hoxton.SR3</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

<dependencies>

    <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-config-server</artifactid>

    </dependency>

</dependencies>

2.编写配置文件

此处要注意,先进bootstrap.yml配置文件,该配置文件是Spring Cloud提供的一个专门加载外部资源的配置文件.该配置文件应该在classpath中(resource).加载顺序高于application.yml配置文件.但是application.yml配置文件中内容会覆盖bootstrap.yml中内容

使用SpringCloudConfig配置中心时,需要在bootstrap配置文件中添加链接到配置中心的配置属性来加载外部配置中心的配置信息

spring:

    application:

        name: config-server-demo

    cloud:

        config:

            server:

                git:

                    uri: https://gitee.com/kelvin_bjsxt/config.git

                    # username:公开仓库不需要配置

                    # password:公开仓库不需要配置

server:

    port: 9001

3.新建启动类

先进启动类com.bjsxt.ConfigServerApplication

@SpringBootApplication

@EnableConfigServer

public class ConfigServerApplication{

    public static void main(String[] args){

        SpringApplication.run(ConfigServerApplication.class,args);

    }

}

4.访问测试

说明:配置文件结构name-profile.yml.例如:application-redis.yml.其中application是bane,redis是profile

在浏览器地址栏输入http://config-server的ip:config-server端口/name/profile/label进行访问

其中master为默认分支,如果没有新建分支,master为默认分支名(主分支).但是如果访问的是不带proflie的配置文件,master就不能省略.如果访问的是带有profile的配置文件master可以省略.省略后返回json字符串中label属性为null,正常应该为master.

localhost:9001/bjsxt/master 出现下面结果

localhost:9001/bjsxt/test/master

四.搭建Config Client

Config Client对应Spring Cloud Config是客户端,对于Eureka来说可以是Application Server也可以是Application Client,实例中没有想Eureka注册,但要知道在现有代码基础上添加Eureka配置即可

实例代码加载gitee中的bjsxt-test.yml文件进行举例.如果加载到里面my.content表示加载成功

新建项目ConfigClientDemo

1.编写pom.xml

<parent>

    <groupId>org/springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.2.5.RELEASE</version>

</parent>

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-dependencies</artifactId>

            <version>Hoxton.SR3</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

<dependencies>

    <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-starter-config</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

</dependencies>

2.新建配置文件

新建bootstrap.yml

spring.cloud.config中

    uri:Config Server访问url.默认值http://localhost:8888

    name:gitee中配置文件名称.name-profile.yml中name

    profile:配置文件的profile.name-profile.yml中profile,默认值default.如果服务端有一个name-default.yml文件会加载此文件,不在加载name.yml.可以通过配置profile:""形式让其加载name.yml

    label:分支,默认master

spring:

    cloud:

        name: bjsxt

        uri: http://localhost:9001/

        # local:master

        profile: test

3.新建启动类

新建com.bjsxt.ConfigClientApplication

@SpringBootApplication

public class ConfigApplication{

    public static void main(String[] args){

        SpringApplication.run(ConfigClientApplication.class,args);

    }

}

4.新建service及实现类

新建com.bjsxt.service.DemoService

public interface DemoService{

    String demo();

}

@Service

public class DemoServiceImpl implements DemoService{

    @Value("${my.controller}")

    private String content;

    @Override

    public String demo(){

        return content;

    }

}

5.新建控制器

新建com.bjsxt.controller.DemoController

@Controller

public class DemoController{

    @Autowired

    private DemoService demoService;

    @RequestMapping("/demo")

    @ResponseBody

    public String demo(){

        return demoService.demo();

    }

}

6.访问项目,观察结果

在浏览器地址访问:http://localhost:8080/demo

观察结果是否打印:bjsxt-test

五.热刷新

Config-client客户端服务应用,在启动的时候,会根据bootstrap配置内容远程访问config-server,获取当时的最新的配置内容.如果config-client运行过程中,GIT仓库中的配置内容发生变更,config-client不会自动的加载刷新配置内容.需要人为干预,重启服务,一定会刷新配置.但是重启服务代价太高.这时就可以使用热刷新

热刷新指的是服务不重启,不间断对外提供服务,而是重新加载配置内容,初始化应用环境

因为SpringBoot只有在启动时才加载一次配置问阿金,所以gitee上配置文件修改了,项目也不会实时跟随变化.既然是SpringBoot的问题,可以使用SpringBoot提供的Actuator来实现刷新项目功能

就需要一阿里spring-boot-starter-actuator启动器来实现

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

需要在bootstrap.yml配置文件中增加配置

management:

    endpoints:

        web:

            exposure:

                include: refresh

在使用远程配置内容的类上(案例中的Service,放在controller

上无效)增加新注解

@RefreshScope

修改gitee中bjsxt-test.yml中内容,把bjsxt-test修改为bjsxt-test1

Acturtor的refresh需要使用post进行访问,借助postman实现

再次访问:http://localhost:8080/demo后发现浏览器打印效果变成bjsxt-test1了

六.结合Git使用

同学们可能已经返发现,如果直接在Gitee中新建配置文件,提示编译等功能都没有,出现编写错误的可能性比较大.如果我们可以在一个项目中把配置文件编写完成后在提交到远程git仓库的话,大大减少出错的概率,同时提升了开发效率

前提:在本机中安装git

演示时提供了两种方式:

    1.使用终端git命令进行操作

    2.使用IDEA可视化功能实现

1.新建项目

随意新建一个项目,此项目应该包含分布式配置中心管理项目的全部依赖.只有这样才能保证在当前项目中编写配置文件时有对应提示

在项目的resource下新建文件夹,文件夹的名称要和Gitee中仓库名称对应.实例中叫做testconfig.在testconfig下新建bjsxt-abc.yml的配置文件

2.使用终端git命令进行操作

2.1必须保证IDEA中已经加载GIT

菜单File->Settings->Version Control->Git选择Git安装路径.安装好git后重启IDEA即可自动加载本机GIT

2.2打开终端面板

如果没有Terminal面板可以在菜单View->Tools Windows->Terminal找到

默认路径是项目的根路径,此面板和CMD等效.里面写的是Windows命令

通过cd命令进入到testconfig目录中

2.3依次输入下面命令

强调:

要求仓库是没有readme.md.如果有的还需要进行pull操作

建议:

在gitee上新建不包含readme的仓库.按照仓库主页面命令提示进行操作

1.步骤一

初始化配置,会把信息写入到C:\Users\bjsxt\.gitconfig.只需要写一次.如果之前已经配置过,就不需要配置了

注意改成自己账号的信息

git config --global username "bjsxt"

git config --global user.email "1510403600@qq.com"

2.步骤二

初始化testconfig文件夹,生成git相关信息

git init

把配置问阿金天啊及到本地仓库

git add bjsxt-abc.yml

3.步骤三

添加提交信息

git commit -m "自己写提交信息"

设置远程地址.注意要把红色部分换成自己的

git remote add origin https://gitee.com/kelvin_bjsxt/testconfig3.git

提交远程仓库

git push -u origin master

3.直接使用IDEA操作

3.1添加本地仓库

修改配置文件bjsxt-abc.yml后,右键文件->Git->add添加到本地仓库

3.2提交

选择提交

在弹出框中进行操作

点击push按钮

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342