SpringCloud Bus消息總線

在微服務架構中,一般會使用輕量級的消息代理來構建一個共用的消息主題來鏈接各個微服務實例,它廣播的消息會被全部在註冊中心的微服務實例監聽和消費,也稱消息總線。 html

SpringCloud中也有對應的解決方案,SpringCloud Bus 將分佈式的節點用輕量的消息代理鏈接起來,能夠很容易搭建消息總線,配合SpringCloud config 實現微服務應用配置信息的動態更新。git

 

消息總線其實經過消息中間主題模式他使用廣播消息的機制被全部在註冊中心微服務實例進行監聽和消費。以廣播形式將消息推送給全部註冊中心服務列表web


消息代理屬於中間件。設計代理的目的就是爲了可以從應用程序中傳入消息,並執行一些特別的操做。開源產品不少如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支持RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。spring

 

圖示:apache

  

 

 經過客戶端去通知每一個服務 更新配置文件緩存

  

升級  經過消息總線的方式:服務器

 

 

 

 消息總線框架底層是MQ實現的,引入相應的jar包,底層框架實現好了,每一個服務裏面引入了相應的jar包後,自動建立隊列 綁定交換機等等架構

 配置文件的應用場景就很符合。app

 

 環境搭建:框架

       

 每一個服務對於分佈式配置中心來講是 client端

 配置文件環境 dev test  pre prd

 配置文件命名規範  client服務名稱(註冊中心名稱)-版本.yml 

 

建立好這個文件

 

 

互聯網項目場景中的配置文件 不是存放在本底的  是存放在遠程服務器

寫在本地 須要重啓服務器  !!

下面開始搭建分佈式配置中心 SpringCloude  組件  Config

   

一、配置文件存放在git 或者 svn

二、搭建分佈式配置中心服務

三、客戶端讀取分佈式配置中心服務

 

 configServer端:

配置文件:

  pom:

 <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.toov5</groupId>
  <artifactId>SpringCloud-eureka-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <!-- 管理依賴 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--SpringCloud eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
            <!-- hystrix斷路器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        
    </dependencies> 
    <!-- 注意: 這裏必需要添加, 否者各類依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  
</project>

yml:

###服務註冊到eureka地址
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka
spring:
  application:
    ####註冊中心應用名稱
    name: config-server
  cloud:
    config:
      server:
        git:
          ###git環境地址
          uri: https://gitee.com/toov5/distributed_configuration_file.git
          ####搜索目錄
          search-paths:
            - Test  
      ####讀取分支      
      label: master
####端口號      
server:
  port: 8888

啓動:

package com.toov5.app;

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

@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class AppServerConfig {
   
    public static void main(String[] args) {
        SpringApplication.run(AppServerConfig.class, args);
    }
}

啓動Eureka後啓動 configServer

 

 訪問地址: http://127.0.0.1:8888//appConfig-dev.yml

 

Client端:

pom:

 

<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.toov5</groupId>
  <artifactId>SpringCloud_config_client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <dependencies>
        <!-- SpringBoot整合Web組件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
        <!-- SpringBoot整合eureka客戶端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

    </dependencies>
    <!-- 注意: 這裏必需要添加, 否者各類依賴有問題 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  
</project>

Controller:

package com.toov5.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {
     @Value("${userAge}")  //配置中心的 咱們這個字段在本地沒有配置
     private String userAge;
     
     @RequestMapping("/getUserAge")
     public String getUerAge() {
          return userAge;
     }
}

啓動類:

package com.toov5.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class AppClientConfig {
  public static void main(String[] args) {
    SpringApplication.run(AppClientConfig.class, args);
}
}

yml:

對應命名規範去配置!

spring:
  application: 
    ####註冊中心應用名稱    對應命名規範去配置 appConfig-dev.yml
    name:  appConfig
  cloud:
    config:
    ####讀取後綴
      profile: dev   #對應命名規範去配置
      ####讀取config-server註冊地址
      discovery:
        service-id: config-server   ##服務的名字
        enabled: true
#####    eureka服務註冊地址    
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka    
server:
  port: 8882  

訪問結果:

若是此時 修改了配置文件,刷新出來的仍是不變的!緩存到當前的jvm中了  重啓client端就OK了   能夠作定時刷新

 

升級: 不重啓服務器自動刷新

 1.手動通知刷新單個jvm值

 2. 消息總線通知整個微服務刷新

 

1. 經過監控中心

   手動actuator端點刷新數據

   引入mavn 到client   

<!-- actuator監控中心 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

 

 yml

   開啓監控服務

  

management:
  endpoints:
    web:
      exposure:
        include: "*"

 此時的yml:

spring:
  application: 
    ####註冊中心應用名稱    對應命名規範去配置 appConfig-dev.yml
    name:  appConfig
  cloud:
    config:
    ####讀取後綴
      profile: dev   #對應命名規範去配置
      ####讀取config-server註冊地址
      discovery:
        service-id: config-server   ##服務的名字
        enabled: true
#####    eureka服務註冊地址    
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka    
server:
  port: 8882
  
  
#開啓全部服務端點權限  
management:
  endpoints:
    web:
      exposure:
        include: "*"
  

 

而後Controller 加上 刷新的註解   @RefreshScope

package com.toov5.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class IndexController {
     @Value("${userAge}")  //配置中心的 咱們這個字段在本地沒有配置
     private String userAge;
     
     @RequestMapping("/getUserAge")
     public String getUerAge() {
          return userAge;
     }
}

對應的值 不用重啓就能夠刷新了

 啓動後:修改git的文件值

發送post請求:

http://127.0.0.1:8882/actuator/refresh

 

有個缺點,若是configClient作個集羣

如要去刷新每一個 服務的值!  postman 搞一遍

 

升級:這樣就須要消息總線了!

 

   

 SpringCloud整合rabbitmq 和 kafka

 本文采用的是rabbitmq去做爲案例講解:

  rabbitmq 的加交換機有四種: fanout  direct  topic  head

 

  在這個體系中  微服務有多少個 就會在MQ中建立多少個隊列,當手動刷新一個服務時候,會經過rabbitmq 去把消息同時發給交換機,而後經過交換機發送給其餘的微服務 。

 

 

 環境的搭建:

   引入maven: bus的核心jar包

   client和servler端都須要引入   

    <!--核心jar包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <!-- actuator監控中心 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

若是報錯添加:

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-bus-parent</artifactId>
                <version>2.0.0.RC2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

客戶端須要yml開啓bus刷新:client端

###開啓bus刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh  

 同時須要配置mq的鏈接信息:

此時的client端yml:

spring:
  rabbitmq:
  ####鏈接地址
    host: 192.168.91.6
   ####端口號  
    port: 5672
   ####帳號
    username: admin
   ####密碼 
    password: admin
   ### 地址  主機獨立的virtualhost
    virtual-host: /admin_toov5
  application: 
    ####註冊中心應用名稱    對應命名規範去配置 appConfig-dev.yml
    name:  appConfig
  cloud:
    config:
    ####讀取後綴
      profile: dev   #對應命名規範去配置
      ####讀取config-server註冊地址
      discovery:
        service-id: config-server   ##服務的名字
        enabled: true
#####    eureka服務註冊地址    
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka    
server:
  port: 8882
  
###開啓bus刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

server:

###服務註冊到eureka地址
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka
spring:
  rabbitmq:
  ####鏈接地址
    host: 192.168.91.6
   ####端口號  
    port: 5672
   ####帳號
    username: admin
   ####密碼 
    password: admin
   ### 地址  主機獨立的virtualhost
    virtual-host: /admin_toov5
  application:
    ####註冊中心應用名稱
    name: config-server
  cloud:
    config:
      server:
        git:
          ###git環境地址
          uri: https://gitee.com/toov5/distributed_configuration_file.git
          ####搜索目錄
          search-paths:
            - Test  
      ####讀取分支      
      label: master
####端口號      
server:
  port: 8888

###開啓bus刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh

 

底層會幫助建立 mq隊列 主題  兩個client  一個 server

 

 

 

 

 訪問一個接口  8882 的,其餘的服務8883也會跟着改了!

http://127.0.0.1:8882/actuator/bus-refresh

 

就是玩了個  yml+jar包 而已

相關文章
相關標籤/搜索