SpringCloud系列之分布式配置中心极速入门与实践

[toc]

1、分布式配置中心简介

在实际的项目开发中,配置文件是使用比较多的,很多项目有测试环境(TEST)、开发环境(DEV)、规范的项目还有集成环境(UAT)、生产环境(PROD),每个环境就一个配置文件。

CSDN链接:SpringCloud系列之分布式配置中心极速入门与实践

在这里插入图片描述

这个在单体应用的项目里是没什么问题,如果是分布式微服务项目,就会有很多的模块,比如微服务A、微服务B等等,每个工程都有一套配置文件,随着业务增长,肯定会有很多配置,分散管理,不能实现统一的管理,所以就有了微服务的配置文件统一管理组件,比如spring cloud官方的spring cloud config、携程的 Apollo,还有最近比较火的阿里 nacos,每款产品各有自己的特点,不过本博客只介绍spring cloud config

作为一款分布式的配置中心,其基本的功能应该有统一的配置文件管理,至于怎么存储可以自行设计,客户端可以从配置中心下拉配置数据,还有一个重要功能就是推送,有了推送功能,才能做到将数据统一发给客户端及时更新,总不能让客户端自己pull,如果在客户端很多的情况,这种肯定是不合理的,简单画图表示:


在这里插入图片描述

2、什么是SpringCloud Config?

ok,前面简单介绍了分布式配置中心的基本概念,现在看看spring cloud提供的这块分布式配置中心spring cloud config是怎么设计?简单归纳其特点:

  • 文件存储:默认Git仓库(github、gitlab等等)
  • 版本关联:默认Git
  • 权限控制:需要Git支持
  • 多环境(profile):配置文件指定
  • 动态更新:需要基于Springcloud config bus
  • 定时更新:需要自行拓展
  • 管理后台:默认不带

所以有一个明显的特点,springcloud config默认就是基于git仓库来实现配置文件统一管理的,所以很明显其有如下角色:

  • 配置仓库:git仓库
  • 配置服务端:config server,负责从git仓库下拉配置文件到本地,然后可以统一推送给客户端
  • 配置客户端:各微服务业务客户端,可以从配置服务端pull配置数据

ok,简单画图表示其架构,如图所示:


在这里插入图片描述

3、例子实验环境准备

环境准备:

  • JDK 1.8
  • SpringBoot2.2.3
  • SpringCloud(Hoxton.SR7)
  • Maven 3.2+
  • 开发工具
    • IntelliJ IDEA
    • smartGit

github远程仓库创建,可以在github上创建一个springCloudExamples项目,然后新建一个文件夹,命名为config-repository

4、Config Server代码实现

创建一个SpringBoot Initialize项目,详情可以参考我之前博客:SpringBoot系列之快速创建项目教程

如图:选择config Server


在这里插入图片描述

也可以自行在maven引入如下配置:

<dependency>
  <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

使用注解@EnableConfigServer表示这个config服务端工程

package com.example.springcloud.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class SpringcloudConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConfigServerApplication.class, args);
    }

}

新建bootstrap.yml配置文件,指定github仓库的地址:

server:
  port: 8761
spring:
  application:
    name: springcloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your_github_account/springCloudExamples
          username: your_github_account
          password: your_github_password
          search-paths: config-repository

5、Config Client代码实现

同样新建SpringBoot Initialize项目,快速创建


在这里插入图片描述

pom配置文件:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

yaml配置,uri指定为config server的地址,profile是环境变量,可以指定为dev(开发环境),label表示分支,master是指github的主干分支

server:
  port: 8082
spring:
  application:
    name: springcloud-config-client
  cloud:
    config:
      uri: http://127.0.0.1:8761/
      profile: dev
      label: master

然后,我们要在github仓库新建配置文件:命名规范必须是客户端的spring. application.name加上profile
[图片上传失败...(image-a8b325-1599646205615)]
在配置文件,随便写点:

config.client.profile=springcloud-config-client-dev

测试:要先启动config server,然后再启动config client,写个例子测试,要加上@RefreshScope实现刷新功能

@RestController
@RefreshScope
public class ConnfigClientController {

    @Value("${config.client.profile}")
    private String profile;

    @GetMapping(value = "/test")
    public String test() {
        return this.profile;
    }

}

启动SpringBoot项目,测试:
[图片上传失败...(image-b7640c-1599646205615)]
在config server启动过程,可以看到config server从github下拉配置文件到本地缓存,具体是C盘AppData目录


在这里插入图片描述

6、客户端pull刷新实现

客户端要实现下拉配置数据,怎么实现?可以集成spring-boot-starter-actuator来实现:

pom配置:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

spring-boot-starter-actuator配置:include加上rehresh配置

management:
  endpoints:
    web:
    # 前缀名,默认也是actuator
      base-path: /actuator
      # 默认只开放info,health的方式访问,加上refresh
      exposure:
        include: info,health,refresh
  endpoint:
    health:
      show-details: always
    refresh:
      enabled: true

访问客户端的链接,注意要用post方式,http://localhost:8082/actuator/refresh

github配置文件没更新的情况:


在这里插入图片描述

修改配置文件,commit和push到github


在这里插入图片描述

调用接口时候,可以看到config client从config server获取数据:
在这里插入图片描述

7、消息总线Spring Cloud Bus

  • 什么是总线?
    在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都链接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。
  • 什么是Spring Cloud Bus?

Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能

Spring Cloud Bus能管理和传播分布式消息间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道

看了理论,貌似不理解?所以还是从前面学习说起,前面介绍说明作为一个分布式的配置中心,至少应该有推送消息的功能,所以这个配置中心的角色可以由config server充当,实现的效果是config server(配置中心)一刷新数据,客户端都能同步更新,画图进行说明:


在这里插入图片描述
  • 1、配置中心(config server)执行bus-refresh,spring cloud bus提供的刷新接口,配置中心就从git仓库下拉数据到本地git仓库
  • 2、执行bus-refresh之后,将消息发给spring cloud bus(消息总线),消息总线将消息写到消息队列(rabbitMQ)的topic中
  • 3、只要订阅这个消息队列topic的都能监听到spring cloud bus的消息(基于rabbitmq)
  • 4、监听到之后,config client从config server pull更新配置数据

其实简而言之,Config Client实例都监听RabbitMQ中同一个topic,当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置,当然这个刷新操作不一定要放在config server,也可以放在某个客户端触发,只要将消息发送给消息总线就可以

8、Docker安装部署RabbitMQ

主要介绍一下Docker版本,常用的docker镜像操作:


在这里插入图片描述

查询rabbitMQ镜像:

management版本,不指定默认为最新版本latest

 docker search rabbitmq:management
在这里插入图片描述

拉取镜像:

docker pull rabbitmq:management

查看docker镜像列表:

docker images

Docker容器操作:
ok,上面命令执行后,镜像就已经拉取到本地仓库了,然后可以进行容器操作,启动rabbitMQ

简单版

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
  • -d 后台运行
  • -p 隐射端口
  • --name 指定rabbitMQ名称

复杂版(设置账户密码,hostname)

docker run -d -p 15672:15672  -p  5672:5672  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone  rabbitmq:management
  • -d 后台运行
  • -p 隐射端口
  • --name 指定rabbitMQ名称
  • RABBITMQ_DEFAULT_USER 指定用户账号
  • RABBITMQ_DEFAULT_PASS 指定账号密码

执行如上命令后访问:http://ip:15672/

默认账号密码:guest/guest


在这里插入图片描述

在这里插入图片描述

其它常用容器命令:

查看运行中的容器

# 查看所有的容器用命令docker ps -a
docker ps

启动容器

# eg: docker start 9781cb2e64bd
docker start CONTAINERID[容器ID]

stop容器

docker stop CONTAINERID[容器ID]

删除一个容器

 docker rm CONTAINERID[容器ID]

查看Docker容器日志

# eg:docker logs 9781cb2e64bd
docker logs container‐name[容器名]/container‐id[容器ID]

9、Spring Cloud Bus动态刷新

有了前面的学习,接着进行代码例子实践,config server pom配置:

<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

yaml配置:开放bus-refresh

management:
  endpoints:
    web:
      base-path: /actuator
      exposure:
        include: info,health,refresh,bus-refresh
  endpoint:
    health:
      show-details: always
    refresh:
      enabled: true

加上rabbitmq配置

  # RabbitMQ配置
  rabbitmq:
    host: 192.168.6.155
    port: 5672
    username: guest
    password: guest
    virtual-host: /

Config Client代码例子改造,pom配置:

<dependency>
   <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  </dependency>

也要加上rabbitMQ配置,这样才能订阅更新:

 # RabbitMQ配置
  rabbitmq:
    host: 192.168.6.155
    port: 5672
    username: guest
    password: guest
    virtual-host: /

客户端必须修改,refresh、enabled都要改为true,trace是进行跟踪的,可以根据需要开启

spring:
  cloud:
    bus:
      enabled: true
      refresh:
        enabled: true
      trace:
        enabled: true

注意点:为了实时更新,必须加上@RefreshScope

配置中心进行bus refresh


在这里插入图片描述

订阅的客户端都进行实时更新:
[图片上传失败...(image-f6fa9d-1599646205615)]

代码例子下载:github代码例子下载

10、官方参考手册和其它资料

  • SpringCloud 2.0系列的官方参考手册:
    https://docs.spring.io/spring-cloud-config/docs/2.2.x/reference/html/

  • SpringCloud Config的官方参考手册:
    https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#discovery-first-bootstrap

  • 方志鹏大佬系列Spring Cloud博客:https://www.fangzhipeng.com/spring-cloud.html

  • 使用Spring Cloud与Docker实战微服务:https://eacdy.gitbooks.io/spring-cloud-book/content/

  • 程序员DD大佬系列Spring Cloud博客:http://blog.didispace.com/spring-cloud-learning/

最后编辑于:2024-12-10 21:07:24


喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…

解决 Git Permission denied 问题

前言 push项目时出现gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.出现这个问题表示你在尝试将本地代码推送到GitHub时&#xff0c;没有提供…

React的状态管理库-Redux

核心思想&#xff1a;单一数据源、状态是只读的、以及使用纯函数更新状态。 组成部分 Store&#xff08;存储&#xff09; 应用的唯一状态容器&#xff0c;存储整个应用的状态树,使用 createStore() 创建。 getState()&#xff1a;获取当前状态。dispatch(action)&#xff…

蓝卓总裁谭彰:AI+工业互联网推动制造业数字化转型

近日&#xff0c;新一代工业操作系统supOS6.0在2024中国5G工业互联网大会上重磅发布。 大会期间&#xff0c;工信部新闻宣传中心《人民邮电报》对蓝卓总裁谭彰就“工业互联网人工智能技术融合的思考”“supOS6.0的探索与实践”“未来工业互联网平台的发展方向”展开专题访谈&am…

RabbitMQ消息队列的笔记

Rabbit与Java相结合 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在配置文件中编写关于rabbitmq的配置 rabbitmq:host: 192.168.190.132 /…

数据结构:贪吃蛇详解

目录 一.地图的设计 1.字符与坐标&#xff1a; 2.本地化&#xff08;头文件&#xff09;: 3.类项&#xff1a; 4.setlocale函数&#xff1a; &#xff08;1&#xff09;函数原型&#xff1a; &#xff08;2&#xff09;使用&#xff1a; 5.宽字符的打印&#xff1a; &a…

医学AI前沿进展:图像分割以及细胞分割领域的最新研究|文献速递·24-12-17

小罗碎碎念 今天推文和大家分享医学AI领域中&#xff0c;图像分割以及细胞分割方面的三个工作。 首先看一下图像分割以及细胞分割方面&#xff0c;近五年的一个论文发表情况&#xff0c;我们可以看到&#xff0c;这个领域在前几年的热度基本持平&#xff0c;到了24年迎来了一个…

Endnote | 查看文献所在分组

软件版本&#xff1a;Endnote X8 第一种方式&#xff1a; 在文献上右键——记录摘要&#xff0c;即可在弹出页面上看到自定义和智能组的分组情况。 第二种方式&#xff1a; 在菜单栏点击文献——记录摘要&#xff0c;也可以查看分组情况。 注&#xff1a; 新版本的endnote软件…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

34. 在排序数组中查找元素的第一个和最后一个位置 二分法

34. 在排序数组中查找元素的第一个和最后一个位置 class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> res(2,-1);res[0]findleft(nums,target);if(res[0] -1) return res;res[1] findright(nums,target);…

回型矩阵:JAVA

解题思路&#xff1a; 通过定义四条边界&#xff1b;top,left,right,bottom,来循环&#xff0c;当top>bottom&&left>right的时候循环终止 循环结束的条件&#xff1a; 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述…

基于单片机的农田灌溉系统(论文+源码)

1.系统设计 本系统主要实现如下目标&#xff1a; 1&#xff0e;可以实时监测土壤湿度&#xff1b; 2&#xff0e;土壤湿度太低时&#xff0c;进行浇水操作&#xff1b; 3&#xff0e;可以按键设置湿度的触发阈值&#xff1b; 4. 可以实现远程操控 5&#xff0e;可以实现手…

QoS分类和标记

https://zhuanlan.zhihu.com/p/160937314 1111111 分类和标记是识别每个数据包优先级的过程。 这是QoS控制的第一步&#xff0c;应在源主机附近完成。 分组通常通过其分组报头来分类。下图指定的规则仔细检查了数据包头 &#xff1a; 下表列出了分类标准&#xff1a; 普通二…

Python脚本基于Tesseract-OCR实现图文识别

一、了解Tesseract-OCR 开源地址&#xff1a;https://github.com/tesseract-ocr/tesseract Tesseract-OCR 是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;能够识别图片中的文字并将其转化为可编辑的文本。它最初由惠普公司&#xff08;Hewlett-Packard…

软件集成测试内容和作用简析

在现代软件开发过程中&#xff0c;软件集成测试作为关键的一环&#xff0c;日益受到重视。特别是随着信息技术的快速发展&#xff0c;各类软件系统日益庞大复杂&#xff0c;如何确保系统不同模块的顺畅合作&#xff0c;成为了每个项目成功的重要基础。集成测试是指在软件开发过…

23. 合并 K 个升序链表(java)

题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff…

Vscode搭建C语言多文件开发环境

一、文章内容简介 本文介绍了 “Vscode搭建C语言多文件开发环境”需要用到的软件&#xff0c;以及vscode必备插件&#xff0c;最后多文件编译时tasks.json文件和launch.json文件的配置。即目录顺序。由于内容较多&#xff0c;建议大家在阅读时使用电脑阅读&#xff0c;按照目录…

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…

ARM Linux 虚拟环境搭建

一、目标 在没有arm硬件的情况下&#xff0c;使用QEMU模拟器&#xff0c;在PC上模拟一块ARM开发板&#xff0c;对ARM Linux进行学习。 二、搭建步骤 首先先有一个Linux 开发环境&#xff0c;我目前使用的是Ubuntu20. 首先安装qemu&#xff0c;qemu的官网&#xff1a;https:…

百度2020校招Web前端工程师笔试卷(第二批)

百度2020校招Web前端工程师笔试卷&#xff08;第二批&#xff09; 2024/12/17 1.FIFO为先进先出的顺序来完成页面的访问&#xff0c;而如果在采用先进先出页面淘汰算法的系统中&#xff0c;一进程在内存占3块&#xff08;开始为空&#xff09;&#xff0c;页面访问序列为1、2、…