Spring boot 2.0 消息總線(Spring Cloud Bus) 高可用分布式配置中心 實例

版本

  • spring-boot 2.0.6.RELEASE
  • spring-cloud Finchley.SR2

目錄結構

image.png

eurka-server 服務注冊中心

pom.xml


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.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.SR2</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-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>

application.yml

server:
  port: 18080

spring:
  application:
    name: eurka-server

eureka:
  instance:
    hostname: localhost   # 主機地址
  client:
    register-with-eureka: false  # 注冊中心告訴自己不能向自己注冊自己警绩,默認為true
    fetch-registry: false  # 獲取注冊信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enable-self-preservation: false     # 關閉自我保護
    eviction-interval-timer-in-ms: 60000  # 清理時間間隔  服務器清理服務列表的定時器 單位 毫秒

注冊中心 啟動類 EurekaServerApplication

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

@EnableEurekaServer   //表示是一個 eureka 服務
@SpringBootApplication
public class EurekaServerApplication {

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

在自己的git上上傳一個配置文件(在統(tǒng)一配置中心config-server 配置git倉庫地址時需要使用這個作為遠程配置文件倉庫)

image.png

config-server 統(tǒng)一配置中心

pom.xml

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.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.SR2</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-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <!--配置中心監(jiān)控-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</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>

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

application.yml

server:
  port: 18082
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          search-paths: /**    #遠程倉庫的目錄跟匆,本例子配置文件在根目錄中
          uri: https://github.com/wangqiang/MySpringCloudConfig.git   # 配置自己的git倉庫地址
          #username: ''   # 訪問git倉庫的用戶名   如果Git倉庫為公開倉庫,可以不填寫用戶名和密碼,如果是私有倉庫需要填寫贡避,
          #password: ''   # 訪問git倉庫的用戶密碼
          default-label: master  # 配置倉庫的分支

    #消息總線配置
    bus:
      enabled: true
      trace:
        enabled: true
      refresh:
        enabled: true  #開啟總線消息更新功能

  # rabbitmq 配置
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: rabbit
    password: 123456
    virtual-host: /


eureka:
  client:
    service-url:
      defaultZone: http://localhost:18080/eureka/  #注冊中心地址
    registry-fetch-interval-seconds: 20      # 多久拉取服務注冊信息 表示從“發(fā)現(xiàn)”服務器獲取注冊表信息的頻率(以秒為單位)赡译。
  instance:
    # 60s未收到心跳湃密,剔除instance 要比心跳時間大 服務器端等待的時間蒋失,因為它收到了最后的心跳,然后才可以從它的視圖中刪除這個實例夫嗓,并且不允許流量進入這個實例迟螺。將這個值設置得太長可能意味著,即使實例不存在舍咖,流量也可以被路由到實例矩父。將這個值設置得太小可能意味著,由于臨時網(wǎng)絡故障排霉,該實例可能會被排除在流量之外浙垫。這個值的設置至少要高于leaseRenewalIntervalInSeconds中指定的值。默認90s
    lease-expiration-duration-in-seconds: 60
    # 心跳時間 即每15秒發(fā)送一次心跳  表明客戶端需要將心跳發(fā)送到服務器端郑诺,以表明它還活著夹姥。如果心跳停止的時間超過了服務器設置的等待時間,那么服務器端將會從它的服務列表中刪除該實例辙诞,從而將流量排除在該實例之外辙售。默認30s
    lease-renewal-interval-in-seconds: 15
    prefer-ip-address: true
    ip-address: 127.0.0.1
    hostname: localhost
    instance-id: ${spring.cloud.client.ip-address}:${server.port}   #eureka client向eureka server注冊使用真實ip設置 默認為本機機器名



# 屏蔽安全驗證
management:
  endpoints:
    web:
      exposure:
        include: '*'  # 可以選擇【"health","mappings","bus-refresh"】三種選項暴露那些端點

統(tǒng)一配置中心 啟動類 ConfigServerApplication

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;

@EnableConfigServer  //標記為 Config Server
@EnableEurekaClient  //標記為eureka client
@SpringBootApplication
public class ConfigServerApplication {

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

auth-server 業(yè)務的微服務

image.png

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.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.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <!-- 排除默認日志插件 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</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-web</artifactId>
            <exclusions>
                <!-- 排除默認日志插件 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
        </dependency>

        <!-- druid 連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
        <!-- 使用log4j2 日志 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <!-- Log4j2 異步支持 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>
        <!-- sql 日志待參數(shù)輸出 -->
        <dependency>
            <groupId>com.googlecode.log4jdbc</groupId>
            <artifactId>log4jdbc</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <!-- 排除默認日志插件 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </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>
                <dependencies>
                    <!-- spring熱部署 -->
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.8.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

bootstrap.yml

配置中心的客戶端要使用bootstrap.yml
bootstrap.yml優(yōu)先于 application.yml 加載 即 bootstrap.yml加載完后才加載 application.yml

server:
  tomcat:
    uri-encoding: UTF-8
  port: 18088

spring:
  application:
    name: auth-server  # 對應配置中心配置文件中的{application}部分 名稱需要與子服務名稱以及讀取的配置文件庫中文件名稱一致   
  cloud:
    config:
      discovery:
        enabled: true  # 配置中心的servieId,即服務名
        service-id: config-server  # 配置中心的服務名
      label: master    # 指明遠程倉庫的分支
      profile: dev     # 對應配置中心配置文件中的{profile}部分 本例子中讀取的配置文件為 auth-server-dev.yml dev開發(fā)環(huán)境配置文件  test測試環(huán)境   pro正式環(huán)境
      name: auth-server  # 對應配置中心配置文件中的{application}部分  多個用,隔開
      fail-fast: true
    #消息總線配置
    bus:
      enabled: true
      trace:
        enabled: true
      refresh:
        enabled: true  #開啟總線消息更新功能


eureka:
  client:
    service-url:
      defaultZone: http://localhost:18080/eureka/  #注冊中心地址
    registry-fetch-interval-seconds: 20      # 多久拉取服務注冊信息 表示從“發(fā)現(xiàn)”服務器獲取注冊表信息的頻率(以秒為單位)飞涂。
  instance:
    # 60s未收到心跳旦部,剔除instance 要比心跳時間大 服務器端等待的時間祈搜,因為它收到了最后的心跳,然后才可以從它的視圖中刪除這個實例士八,并且不允許流量進入這個實例容燕。將這個值設置得太長可能意味著,即使實例不存在婚度,流量也可以被路由到實例蘸秘。將這個值設置得太小可能意味著,由于臨時網(wǎng)絡故障蝗茁,該實例可能會被排除在流量之外醋虏。這個值的設置至少要高于leaseRenewalIntervalInSeconds中指定的值。默認90s
    lease-expiration-duration-in-seconds: 60
    # 心跳時間 即每15秒發(fā)送一次心跳  表明客戶端需要將心跳發(fā)送到服務器端哮翘,以表明它還活著颈嚼。如果心跳停止的時間超過了服務器設置的等待時間,那么服務器端將會從它的服務列表中刪除該實例饭寺,從而將流量排除在該實例之外阻课。默認30s
    lease-renewal-interval-in-seconds: 15
    prefer-ip-address: true
    ip-address: 127.0.0.1
    hostname: localhost
    instance-id: ${spring.cloud.client.ip-address}:${server.port}   #eureka client向eureka server注冊使用真實ip設置 默認為本機機器名

# 屏蔽安全驗證
management:
  endpoints:
    web:
      exposure:
        include: '*'  # 可以選擇【"health","mappings","bus-refresh"】三種選項暴露那些端點

業(yè)務微服務端 啟動類 AuthServerApplication

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

@EnableEurekaClient
@SpringBootApplication
public class AuthServerApplication {

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

業(yè)務微服務端 測試類

在需要更新的配置類上加@RefreshScope注解,@RefreshScope必須加艰匙,否則客戶端會收到服務端的更新消息柑肴,但是更新不了,因為不知道更新哪里的旬薯。

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

@RestController
@RefreshScope  // 需要更新的配置類上加@RefreshScope注解,@RefreshScope必須加适秩,否則客戶端會收到服務端的更新消息绊序,但是更新不了,因為不知道更新哪里的
public class Test {

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

    @GetMapping("test")
    public String test() {
        return name;
    }
}

依次啟動 eurka-server -> config-server -> auth-server

訪問遠程git上的配置文件 http://127.0.0.1:18082/auth-server/dev

18082: 是統(tǒng)一配置中心的端口
/auth-server/dev 對應遠程配置文件的auth-server-dev.yml
/{name}-{profiles}.yml
/{label}/{name}-{profiles}.yml
name : 文件名秽荞,一般以服務名來命名
profiles : 一般作為環(huán)境標識
lable : 分支(branch)骤公,指定訪問某分支下的配置文件

image.png
{
    "name": "auth-server",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": "69b2e80b7f8dbd6f84f24152a389bf091d5333dc",
    "state": null,
    "propertySources": [
        {
            "name": "https://github.com/wangqiang/MySpringCloudConfig.git/auth-server-dev.yml",
            "source": {
                "name": "之歌劉",
                "spring.rabbitmq.host": "127.0.0.1",
                "spring.rabbitmq.port": 5672,
                "spring.rabbitmq.username": "rabbit",
                "spring.rabbitmq.password": 123456,
                "spring.rabbitmq.virtual-host": "/"
            }
        }
    ]
}

業(yè)務微服務端 獲取遠程配置文件中的屬性值

業(yè)務微服端的測試接口:http://127.0.0.1:18088/test

image.png

遠程配置文件更新后,客戶端自動更新

修改配置文件并提交到git上

name: 啊哈哈哈哈
  1. 首先發(fā)布一個post請求 http://localhost:18088/actuator/bus-refresh 手動刷新配置
    或者請求 http://localhost::18082/actuator/refresh
    18088 是配置客戶端應用 config-client
    18082 是配置服務中心 config-server
    image.png

    image.png
image.png
  1. 再次訪問測試接口 http://127.0.0.1:18088/test
    image.png

我們發(fā)現(xiàn)再不重啟服務的情況下就能獲取到修改的屬性值

只要開啟 Spring Cloud Bus 后扬跋,不管是對 config-server 還是 config-client 執(zhí)行/actuator/bus-refresh都是可以更新配置的阶捆,
如果有多個客戶端,多個客戶端都會接收到刷新配置的消息钦听,并刷新配置洒试。

局部刷新配置(只刷新某些客戶端)

某些場景下(例如灰度發(fā)布),我們可能只想刷新部分微服務的配置朴上,此時可通過/actuator/bus-refresh/{destination}端點的 destination 參數(shù)來定位要刷新的應用程序垒棋。例如:/actuator/bus-refresh/customers:8000,這樣消息總線上的微服務實例就會根據(jù) destination 參數(shù)的值來判斷是否需要要刷新痪宰。其中叼架,customers:8000指的是各個微服務的 ApplicationContext ID畔裕。destination 參數(shù)也可以用來定位特定的微服務。例如:/actuator/bus-refresh/customers:**乖订,這樣就可以觸發(fā) customers 微服務所有實例的配置刷新扮饶。

集成WebHooks實現(xiàn)動態(tài)更新

遠程配置文件修改后,不需要手動調(diào)用http://localhost:18088/actuator/bus-refresh 即可刷新配置

  1. 在遠程配置文件的MySpringCloudConfig.git倉庫中添加密鑰


    image.png

    image.png
  2. 在遠程配置文件git倉庫中找到Webhooks


    image.png
  3. 點擊Add webhook乍构,添加一個webhook


    image.png
  • Payload URL: push 代碼后自動運行的腳本 http://localhost:18082/actuator/bus-refresh(配置能夠被git訪問到的請求地址甜无,根據(jù)git內(nèi)外網(wǎng)情況自行配置)

  • Content type :我們選擇application/json

  • Secret: 通訊密鑰 用來認證身份

選擇Just the push event.,因為我們只需要push的時候進行回調(diào)蜡吧,然后添加即可

每當我們更新遠程配置文件后毫蚓,push到git后,就會觸發(fā)Payload URL(配置的是訪問刷新配置的地址)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔善,一起剝皮案震驚了整個濱河市元潘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌君仆,老刑警劉巖翩概,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異返咱,居然都是意外死亡钥庇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門咖摹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來评姨,“玉大人,你說我怎么就攤上這事萤晴⊥戮洌” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵店读,是天一觀的道長嗦枢。 經(jīng)常有香客問我,道長屯断,這世上最難降的妖魔是什么文虏? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮殖演,結果婚禮上氧秘,老公的妹妹穿的比我還像新娘。我一直安慰自己趴久,他們只是感情好敏储,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朋鞍,像睡著了一般已添。 火紅的嫁衣襯著肌膚如雪妥箕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天更舞,我揣著相機與錄音畦幢,去河邊找鬼。 笑死缆蝉,一個胖子當著我的面吹牛宇葱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刊头,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼黍瞧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了原杂?” 一聲冷哼從身側響起印颤,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穿肄,沒想到半個月后年局,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡咸产,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年矢否,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脑溢。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡僵朗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屑彻,到底是詐尸還是另有隱情验庙,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布酱酬,位于F島的核電站,受9級特大地震影響云矫,放射性物質發(fā)生泄漏膳沽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一让禀、第九天 我趴在偏房一處隱蔽的房頂上張望挑社。 院中可真熱鬧,春花似錦巡揍、人聲如沸痛阻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱当。三九已至俏扩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弊添,已是汗流浹背录淡。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留油坝,地道東北人嫉戚。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像澈圈,于是被迫代替她去往敵國和親彬檀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理瞬女,服務發(fā)現(xiàn)窍帝,斷路器,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • (git上的源碼:https://gitee.com/rain7564/spring_microservices_...
    sprainkle閱讀 6,868評論 4 25
  • 前言 在微服務架構的系統(tǒng)中拆魏,我們通常會使用輕量級的消息代理來構建一個共用的消息主題讓系統(tǒng)中所有微服務實例都能連接上...
    二月_春風閱讀 10,517評論 0 14
  • 前言 在微服務架構的系統(tǒng)中盯桦,我們通常會使用輕量級的消息代理來構建一個共用的消息主題讓系統(tǒng)中所有微服務實例都連接上來...
    Chandler_玨瑜閱讀 6,583評論 2 39
  • 這一周卖子,反復聽秋葉老師的定位課略号,努力給自己找新的職場定位。目前的線下定位做正面管教雙語早教中心洋闽。把正面管教作為切口...
    陪一顆心長大的故事閱讀 421評論 1 3