1. 程式人生 > >SpringCloud(十四)springCloud bus 訊息匯流排重新整理配置

SpringCloud(十四)springCloud bus 訊息匯流排重新整理配置

前言:

     在微服務中,我們將使用輕量級訊息代理,通過一個共用的訊息主題,讓系統中所有微服務都連上來,主題中的訊息會被所有監聽者消費,所以稱為訊息匯流排。spring cloud bus將分散式節點用輕量級訊息連線起來,他可以用於服務間通訊,例如:配置檔案的更改。可以用kafka、rabbitmq等

 程式碼:

      基於springboot2.0

首先基於上一篇的程式碼(搭建eureka、config、一個測試功能的微服務)

eureka和配置中心config不用做任何更改

修改測試微服務的pom.xml,加入下面這兩個依賴

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

第一個包,需要rabbitmq,所以需要搭建rabbitmq伺服器,第二個是程式監控的包,用於暴露bus-refresh埠,用作重新整理配置

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

    <artifactId>eureka-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-service</name>

    <parent>
        <groupId>com.xhx.springcloud</groupId>
        <artifactId>springcloud15-bus</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</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-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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


</project>

修改bootstrap.yml,其中spring.cloud.config.name 可寫多個引數,根據名字在配置中心拉取配置檔案,我把rabbitmq的配置也放在了git上

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-service
      label: master
      profile: prd
      name: eureka-service,rabbit-mq
    bus:
      refresh:
        enabled: true
  application:
    name: eureka-service
management:
  endpoints:
    web:
      exposure:
        #暴露bus-refresh節點,通過此節點重新整理配置
        include: '*'


rabbitmq的dev和prd環境配置如下(自己做測試,所以寫的一樣的配置)

spring:
  rabbitmq:
    host: 192.168.94.151
    port: 5672
    username: admin
    password: admin
    virtual-host: /

在eureka-sevice配置檔案中加入user.name,一會測試時修改他的value

server:
  port: 8082
eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka
  instance:
    #租期到期時間
    lease-expiration-duration-in-seconds: 60
    #租期更新時間間隔,即每15秒傳送一次心跳
    lease-renewal-interval-in-seconds: 15
user:
  name: xuhaixing02

在讀取配置的那個類上加入@RefreshScope,必須加,否則重新整理不生效

package com.xhx.springcloud.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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * xuhaixing
 * 2018/6/3 16:18
 */
@RestController
@RequestMapping(value = "hello")
@RefreshScope
public class HelloController {

    @Value("${user.name}")
    private String name;

    @RequestMapping(value = "getName")
    public String getName(){
        return name;
    }
}

然後啟動就可以了:

第一次訪問:


把上面的值修改成xuhaixing01,直接再請求值未生效。需要先請求127.0.0.1:8082/actuator/bus-refresh

看程式的控制檯日誌,在請求配置中心下載配置


仔細觀察全部打印出來的日誌,還發現了,在重新整理user.name注入的值


再次請求,結果已經變成了xuhaixing01


這樣必須手動重新整理,還是不好,如果有外網可以訪問的固定ip,可以配置git的webhooks,設定去請求這個方法,來達到重新整理配置的目的

127.0.0.1:8082/actuator/httptrace 可以看到呼叫