跟我學SpringCloud | 第十七篇:服務網關Zuul基於Apollo動態路由

SpringCloud系列教程 | 第十七篇:服務網關Zuul基於Apollo動態路由

Springboot: 2.1.7.RELEASEhtml

SpringCloud: Greenwich.SR2java

[TOC]git

上一篇文章咱們介紹了Gateway基於Nacos動態網關路由的解決方案《Spring Cloud Alibaba | Gateway基於Nacos動態網關路由》,同爲Spring Cloud服務網關組件的Spring Cloud Zuul在生產環境中使用更爲普遍,那麼它有沒有方便的動態路由解決方案呢?答案固然是確定的,Zuul做爲一個老牌的開源服務網關組件,動態路由對它來說是一個十分必要的功能,畢竟咱們不能隨便重啓服務網關,服務網關是一個微服務系統的大門,今天咱們介紹的Zuul動態路由的解決方案來自於攜程開源的配置中心Apollo。github

Apollo概述

Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。web

Apollo支持4個維度管理Key-Value格式的配置:spring

  1. application (應用)
  2. environment (環境)
  3. cluster (集羣)
  4. namespace (命名空間)

Apollo相比於Spring Cloud Config優點

前面的文章咱們也介紹了Spring Cloud Config《跟我學SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh》,可是它和咱們今天要使用的相比,又有什麼劣勢呢?數據庫

Spring Cloud Config的精妙之處在於它的配置存儲於Git,這就自然的把配置的修改、權限、版本等問題隔離在外。經過這個設計使得Spring Cloud Config總體很簡單,不過也帶來了一些不便之處。bootstrap

功能點 Apollo Spring Cloud Config 備註
配置界面 一個界面管理不一樣環境、不一樣集羣配置 無,須要經過git操做
配置生效時間 實時 重啓生效,或手動refresh生效 Spring Cloud Config須要經過Git webhook,加上額外的消息隊列才能支持實時生效
版本管理 界面上直接提供發佈歷史和回滾按鈕 無,須要經過git操做
灰度發佈 支持 不支持
受權、審覈、審計 界面上直接支持,並且支持修改、發佈權限分離 須要經過git倉庫設置,且不支持修改、發佈權限分離
實例配置監控 能夠方便的看到當前哪些客戶端在使用哪些配置 不支持
配置獲取性能 快,經過數據庫訪問,還有緩存支持 較慢,須要從git clone repository,而後從文件系統讀取
客戶端支持 原生支持全部Java和.Net應用,提供API支持其它語言應用,同時也支持Spring annotation獲取配置 支持Spring應用,提供annotation獲取配置 Apollo的適用範圍更廣一些

工程實戰

這裏須要準備一個Apollo配置中心,具體如何構建Apollo配置中心我這裏很少作介紹,你們能夠參考Apollo的官方文檔:https://github.com/ctripcorp/apollo/wiki瀏覽器

  1. 工程依賴pom.xml以下:

代碼清單:chapter16/pom.xml緩存


<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>${apollo-client.version}</version>
</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-netflix-zuul</artifactId>
</dependency>
  1. 配置文件

app.properties以下:

代碼清單:chapter16/src/main/resources/META-INF/app.properties


app.id=123456789

這裏配置的app.id是在Apollo中建立項目時配置的。

application.yml以下:

代碼清單:chapter16/src/main/resources/application.yml


apollo:
  bootstrap:
    enabled: true
    namespaces: zuul-config-apollo
  Meta: http://localhost:8080

在Apollo上新建一個命名空間zuul-config-apollo

其他的配置都配置在Apollo中,具體如圖:

  1. 啓動主類Chapter16Application.java以下:

代碼清單:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java


@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
@EnableApolloConfig
public class Chapter16Application {

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

}

其中@EnableZuulProxy表示開啓Zuul網關代理,@EnableApolloConfig表示開啓Apollo配置。

  1. 路由刷新

代碼路徑:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java


@Component
public class ZuulProxyRefresher implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Autowired
    private RouteLocator routeLocator;

    @ApolloConfigChangeListener(value = "zuul-config-apollo")
    public void onChange(ConfigChangeEvent changeEvent) {
        boolean zuulProxyChanged = false;
        for (String changedKey : changeEvent.changedKeys()) {
            if (changedKey.startsWith("zuul.")) {
                zuulProxyChanged = true;
                break;
            }
        }
        if (zuulProxyChanged) {
            refreshZuulProxy(changeEvent);
        }
    }

    private void refreshZuulProxy(ConfigChangeEvent changeEvent) {
        this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
        this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator));
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

@ApolloConfigChangeListener(value = "zuul-config-apollo")中value的默認參數是application,由於這裏咱們自定義了namespace,因此須要指定,咱們使用@ApolloConfigChangeListener監聽Apollo的配置下發,有配置更新時會調用refreshZuulProxy()刷新路由信息。

  1. 測試

咱們啓動Client-Apollo工程和Zuul-Apollo工程,打開瀏覽器訪問:http://localhost:9091/client/hello ,頁面能夠正常顯示,咱們在Apollo中修改路由信息,具體如圖:

修改完後點擊發布,待發布成功後,咱們刷新瀏覽器,以前的路由訪問已經報錯404,咱們使用修改事後的路由http://localhost:9091/client_new/hello ,頁面能夠正常顯示Hello, i am dev from apollo update.,測試成功,咱們經過Apollo實現了Zuul的路由信息動態刷新。

示例代碼

Github-示例代碼

Gitee-示例代碼

原文出處:https://www.cnblogs.com/babycomeon/p/11489632.html

相關文章
相關標籤/搜索