SpringCloud04 服务配置中心、消息总线、远程配置动态刷新

1 环境说明

  JDK:1.8

  MAVENT:3.5

  SpringBoot:2.0.5.RELEASE

  SpringCloud:Finchley.SR1

2 创建服务注册中心(Eureka服务端)

  说明:本博文仅仅以一个单例的注册中心为例,高可用的服务注册中心请参见

  2.1 引入依赖

    利用IDEA创建服务注册中心项目时只需要引入 spring-cloud-starter-netflix-eureka-server 一个依赖就可以啦

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.example</groupId>
    <artifactId>eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml

  2.2 配置文件

    配置服务注册中心端口以及服务服务注册中心的应用名

    技巧01:单例模式下的服务注册中心需要关闭向其他服务注册中心注册本服务信息功能和从其他服务注册中心拉取注册服务信息功能

server:
  port: 8761

spring:
  application:
    name: eureka

eureka:
  client:
    fetch-registry: false # 关闭从其他服务注册中心拉取服务信息
    register-with-eureka: false # 不向其他服务注册中心注册本服务的信息

application.yml

  2.3 引入服务注册中心配置

    需要在启动类上利用@EnableEurekaServer将SpringBoot为我们提供的Eureka的相关配置引入到系统应用中,否则Eureka服务注册中心不会生效

    技巧01:@EnableEurekaServer的作用就是将某个配置了Eureka相关配置的类引入到应用容器中

  2.4 启动服务注册中心

    通过IP和端口访问的效果如果所示

3 创建Eureka客户端

  3.1 引入依赖

    利用IDEA创建SpringBoot项目时引入 spring-boot-starter-web、spring-cloud-starter-netflix-eureka-client即可,我这里同时引入了devtools、lombok只是为了开发方便而已

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.example</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml

  3.2 配置文件

    需要配置应用名和应用端口、配置注册中心连接信息

  3.4 启动Eureka客户端

    在启动类上利用@EnableEurekaClient将Eureka客户端的相关配置引入到应用容器中

  3.5 启动Eureka客户端

    Eureka客户端启动成功后就可以在Eureka服务端的控制页面看到注册成功的服务信息,例如

4 创建ConfigServer

  技巧01:ConfigServer也是一个Eureka客户端,同样需要向Eureka服务端进行注册;只不过这个服务专门负责管理一些配置文件

  4.1 引入依赖

    利用IDEA创建SpringBoot项目时引入 spring-cloud-starter-netflix-eureka-client 、spring-cloud-config-server 依赖

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.example</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml

  4.2 配置文件

    需要配置应用端口、应用名、服务注册中心、远程代码仓库

  4.3 引入默认配置

    利用@EnableEurekaClient将Eureka客户端的默认配置引入到应用容器中,利用@EnableConfigServer将配置中心的的默认配置引入到应用容器中

  4.4 启动配置中心应用

    技巧01:启动成功后可以在Eureka的控制面板中查看到相关的服务注册信息,例如

  4.5 查看远程仓库中的配置信息

    技巧01:配置服务中心启动时会暴露一些URL,可以利用这些URL访问远程仓库中的配置文件信息,例如

    4.5.1 访问规则说明

      /{name}-{profiles}  -> /配置文件-环境

      /{label}/{name}-{profiles} -> /git分支/配置文件-环境

      技巧01:以上两种格式都同时支持 yml、json、properties三种数据格式

    4.5.2 git仓库配置文件命名

    4.5.3 通过配置中心访问指定的配置文件信息

      技巧01:访问任何一个consumer-xxx.yml 的配置文件时都会和 consumer.yml 进行整合;可以将consumer.yml作为共有配置的存放文件

      技巧02:使用 /{name}-{profiles}  访问时默认访问master分支,可以在配置中心的配置文件中指定使用哪一个分支

  4.6 配置本地仓库路径和远程仓库分支

    技巧01:配置中心服务从远程仓库获取到配置文件后会存放到本地的一个默认目录,可以在配置中心服务的配置文件中配置这个本地仓库地址

    技巧02:配置中心配置远程仓库地址信息时可以指定使用远程仓库的哪一个分支;如果配置了分支后再使用  /{name}-{profiles}  这种格式获取配置文件信息时就会返回配置分支中的配置文件信息;当然亦可以使用 /label/ /{name}-{profiles}  这种格式访问指定分支的配置文件信息

5 配置中心客户端

  技巧01:需要从配置中心服务获取配置信息的服务都可叫作配置中心客户端

  5.1 引入依赖

    修改第三节的Eureka客户端,只需要再引入  spring-cloud-config-client 即可

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

  5.2 修改配置

    将原有的配置全部剪切到远程仓库中对应的consumer.yml配置文件中,并将这个cnsumer.yml多复制几份并制定环境

  5.3 配置启动配置文件

    场景:config是服务配置中心、consumer是一个需要从config服务中获取配置信息的服务、eureka是服务注册中心

    技巧01:config和consumer都必须在eureka中心注册,consumer是通过eureka从config中获取服务的;所以不能直接将配置中心的连接信息配置到application.yml中,而是需要新建一个启动配置文件bootsttap.yml,需要将应用名、配置中心信息、注册中心信息中心配置到bootstrap.yml中

    技巧02:在bootstrap.yml中配置的应用名必须和远程仓库中的配置文件保持一致,因为需要通过应用名到配置中心去获取该应用的配置信息

  5.4 启动consumer服务

    技巧01:启动consumer服务时控制台会打印出配置中心的信息,例如

  5.4 使用远程git中的配置文件  

    技巧01:和使用在 application.yml 中配置的信息一样,例如

  5.5 高可用配置中心搭建

    将配置中心打包后分别部署就可以啦,版案例利用IDEA通过不同端口启动实现

    启动了两个配置中心后,多次重启consumer服务时就会从不同的配置中心获取数据,例如

6 整合消息中线

  说明:虽然consumer可以通过配置中心获取到远程仓库中的配置信息,但是我们修改远程仓库中的配置文件时并不能生效;想用时远程仓库的配置生效我们必须一起重启config服务和consumer服务;如果不想通过从前来实现的话就需要使用消息总线来实现。

  6.1 集成消息总线

    6.1.1 安装RabbitMQ

      参考博文

      rabbitMQ控制台

    6.1.2 添加依赖

      分别在consumer和config服务中添加依赖

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

    6.1.3 添加RabbitMQ配置

      技巧01:consumer服务可以配置到远程服务的consumer.yml文件中

      技巧02:config服务必须在application.yml中进行配置

    6.1.4 配置config服务

      开启config服务的所有映射端口,想要让修改远程仓库中的仓库生效,在修改后必须向config服务发送一个post请求,请求路径为: /actuator/bus-refresh

    6.1.5 添加@RefreshScope

      在用到了远程配置的类级别添加@RefreshScope注解,否则修改远程仓库后及时向config的 /actuator/bus-refresh 发送了post请求也不会进行更新

    6.1.6 启动config和consumer服务

      启动服务后会自动在RabbitMQ中创建每个服务各自的queue,和一个springcloudbus对应exchange

    6.1.7 修改刷新

      》修改远程仓库的配置信息,修改后通过config可以获取到最新的配置,但是其他服务不会拿到配置;这时ocnfig服务必须触发一个事件将配置更新放到总线队列中去

      》想config服务的 /actuator/bus-refresh 发送一个post请求就可以让consumer服务也获取到最新的配置信息

    6.1.8 利用远程仓库向config服务的 /actuator/bus-refresh 发送POST请求

      》利用natapp在远程仓库配置webhooks

      》在config服务中引入依赖(如果不引入这个依赖就不会自动刷新,必须手动向config服务发送post请求才能实现动态刷新)

<!--自己添加的依赖:解决了利用github+rabbitmq实现配置动态刷新的功能-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>

      》修改仓库配置信息并提交后config控制台会输出日志信息,同时rabbitMQ中也会出现消息的推送和订阅

7 本博文源代码

  点击获取

  

 

原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9645990.html

时间: 2024-10-12 14:40:40

SpringCloud04 服务配置中心、消息总线、远程配置动态刷新的相关文章

kubernetes实战-配置中心(三)配置服务使用apollo配置中心

使用配置中心,需要开发对代码进行调整,将一些配置,通过变量的形式配置到apollo中,服务通过配置中心来获取具体的配置 在配置中心修改新增如下配置: 项目信息: 配置: 重新打包镜像,使用apollo版本的代码: 修改dp.yaml,将镜像使用我们刚刚打包的这个: 应用资源配置清单: # kubectl apply -f http://k8s-yaml.od.com/dubbo-server/dp.yaml 创建dubbo服务消费者: apollo中新建一个项目:dubbo-demo-web,新

springcloud(九):配置中心和消息总线(配置中心终结版)

Spring Cloud BusSpring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通过分布式的启动器对spring boot应用进行扩展,也可以用来建立一个多个应用之间的通信频道.目前唯一实现的方式是用AMQP消息代理作为通道,同样特性的设置(有些取决于通道的设置)在更多通道的文档中. Spring cloud bus被国内很多都翻译为消息总线,也挺形象的.大家可以将它理解为管理和传播

SpringCloud的分布式配置及消息总线

1.在搭建分布式配置时,我们大概看下分布式配置的流程 如图所示: 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置.目前目前springCloud仅支持RabbitMQ和Kafka ,我采用的市RabbitMQ搭建 2.搭建git地址 在流程中 首先我们应该在git或者码云上创建一个文件夹来专门获取配置 如

Apollo配置中心-多组共享配置(关于Namespaces)

官方的解释:什么是"application"的Namespace? Apollo在创建项目的时候,都会默认创建一个"application"的Namespace.顾名思义,"application"是给应用自身使用的,熟悉Spring Boot的同学都知道,Spring Boot项目都有一个默认配置文件application.yml.在这里application.yml就等同于"application"的Namespace.对

微服务架构:动态配置中心搭建

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息处理方式是将配置信息写入xml..properties等配置文件中,和应用一起打包,每次修改配置信息,都需要重新进行打包,效率极低,动态配置中心就是为了解决这一问题.动态配置中心也是一个微服务,我们把微服务中需要动态配置的配置文件存放在远程git私有仓库上,微服务会去服务器读取配置信息,当我们在本地

Spring Cloud(九):配置中心(消息总线)【Finchley 版】

Spring Cloud(九):配置中心(消息总线)[Finchley 版] 发表于 2018-04-19 |  更新于 2018-05-07 | 我们在 Spring Cloud(七):配置中心(Git.Refresh) 中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用 Webhook 的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用 Spring Cloud Bus 可以完美解决这一问题. Sp

SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版

前言 在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心(SpringCloud Config)的配置刷新和消息总线(RabbitMQ和Kafka)使用教程. SpringCloud Config Refresh 在上一篇中我们介绍了springcloud配置中心的本地使用和Git使用的用法,但是当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,需

基于docker部署的微服务架构(四): 配置中心

原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理和维护.在 spring cloud 中使用 config-server 集中管理配置文件,可以使用 git.svn.本地资源目录 来管理配置文件,在集成了 spring cloud bus 之后还可以通过一条 post 请求,让所有连接到消息总线的服务,重新从config-server 拉取配置文

微服务架构中主流的配置中心对比分析?

为什么需要配置中心 配置实时生效: 传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化.轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中.配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置. 配置管理流程: 配置的权限管控.灰度发布.版本管理.格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分. 开源配置中心基本介