• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 第一次見凌晨四點的帝都:spring cloud zuul動態路由設置

    前情提要:在追一個講spring cloud的課,講到zuul動態路由的時候,老師只是大概說了說思路,沒有具體講細節,于是我自己搞了一下,實現一個非常簡陋的zuul動態路由。大概從凌晨十二點多搞到凌晨三點多的樣子,簡要記錄一下。

    zuul是干嘛用的:個人理解就是個類似攔截器+過濾器的作用,設置一個路由表,對不同的請求,將其轉發到不同的微服務進行處理。
    什么是動態路由:個人理解就是不用重啟了,改完路由配置直接生效。

    項目結構:
    在這里插入圖片描述

    pom文件結構如下:

    <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.wmx</groupId>
        <artifactId>api-gateway</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>api-gateway</name>
        <description>Demo project for Spring Boot</description>
    
        <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.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.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- config依賴,動態路由用 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-client</artifactId>
            </dependency>
            <!-- bus自動刷新配置 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bus-amqp</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>
    
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    

    zuul的配置文件是放在我的github上了,由統一配置中心進行加載,github部分配置如下:
    在這里插入圖片描述
    統一配置中心這邊就不說了
    我這個zuul配置文件,自己定義了一個路由規則,/myProduct/**匹配的所有請求都會被轉發到product這個微服務上。ignored-patterns的配置表示排除某些接口,這些被排除的接口不能被外部請求所訪問到,會報404。

    如何配置zuul動態路由,首先獲取配置文件被修改之后新的屬性:

    @SpringBootApplication
    @EnableZuulProxy
    public class ApiGatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ApiGatewayApplication.class, args);
        }
    
        //動態路由配置,即自動刷新zuul配置
        @ConfigurationProperties("zuul")
        @RefreshScope
        public ZuulProperties zuulProperties(){
            return new ZuulProperties();
        }
    
    }
    

    zuul已經封裝好了一個對象ZuulProperties,這樣每次spring bus配置自動刷新之后,就會把新的配置屬性存入這個對象中。

    然后將ZuulProperties對象里的屬性值讀出來,進行路由表的配置:

    public class ZuulRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {
    
        public ZuulRouteLocator(String servletPath, ZuulProperties properties) {
            super(servletPath, properties);
        }
    
        //刷新路由
        @Override
        public void refresh() {
            doRefresh();
        }
    }
    

    這里需要注意一點,我寫的是最最簡單的動態路由配置,直接調用父類默認的方法就行了。像我參考的那篇博客,他的路由規則是存在數據庫里的,這時候就需要自己重新覆蓋一個locateRoutes()方法,把路由規則從數據庫讀出來,配到一個map對象中,有需要的可以參考那一篇。

    接下來將ZuulRouteLocator配置成bean,供最后一步用:

    @Configuration
    public class CustomZuulConfig {
    
        @Autowired
        ZuulProperties zuulProperties;
    
        @Bean
        public ZuulRouteLocator routeLocator() {
            ZuulRouteLocator routeLocator = new ZuulRouteLocator(null, this.zuulProperties);
            return routeLocator;
        }
    
    }
    

    最后配置路由刷新監聽事件,這樣就可以把新的路由規則配置生效了:

    @Service
    public class RefreshRouteService {
    
        @Autowired
        ApplicationEventPublisher publisher;
    
        @Autowired
        RouteLocator routeLocator;
    
        public void refreshRoute() {
            RoutesRefreshedEvent routesRefreshedEvent = new RoutesRefreshedEvent(routeLocator);
            publisher.publishEvent(routesRefreshedEvent);
        }
    
    }
    

    啟動eureka,config,zuul和微服務進行測試。
    一開始的配置文件中,/**/product/listForOrder的請求都會被攔住,返回404。
    修改配置文件,把攔截請求換成另一個,然后用postman發一個/actuator/bus-refresh的POST請求(webhook自動刷新在我這里有問題,還需要再查),注意請求頭里要加Content-Type:application/json這個屬性,配置文件自動更新之后,zuul的項目就會監聽到事件從而自動刷新路由表,新的路由規則就生效了。
    具體圖我就不截了。。。

    參考博客:https://blog.csdn.net/u013815546/article/details/68944039
    感謝大佬

    版權聲明:本文為qq_34785454原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_34785454/article/details/87477233

    智能推薦

    Spring Cloud Zuul路由的使用

    一、前言 Zuul的功能: Zuul 注冊于 Eureka并集成了 Ribbon所以自然也是可以從注冊中心獲取到服務列表進行客戶端負載。 功能豐富的路由功能,解放運維。 具有過濾器,所以鑒權、驗簽都可以集成。 在項目中使用到Zuul這塊主要是用在了結合 Eureka實現負載均衡反向代理。這里記錄一下Zuul的路由的使用。 通過服務發現自動映射路由 Eureka配合Zuul使用的優美之處在于,不僅可...

    Spring Cloud 之 路由網關 Zuul組件

    Netflix又一開源Spring Cloud組件,路由網關Zuul。 微服務架構下服務眾多,Zuul能將所有服務的API接口統一聚合,向外暴露,用戶看起來就像在訪問一個服務一樣。隱藏了內部服務跳轉的過程。還可以和Ribbon組合實現智能路由轉發和負載均衡的功能。Zuul還可以用來做身份認證,權限過濾等等。實現流量監控,日志記錄等等功能。 Zuul通過自己的ZuulServlet(類似于Sprin...

    spring cloud進階五 [路由網關 (zuul)]

    在微服務架構中,需要幾個基礎的服務治理組件,包括服務注冊與發現、服務消費、負載均衡、斷路器、智能路由、配置管理等,由這幾個基礎組件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 在Spring Cloud微服務系統中,一種常見的負載均衡方式是,客戶端的請求首先經過負載均衡(zuul、Ngnix),再到達服務網關(zuul集群),然后再到具體的服務,服務統一注冊到高可用的服務...

    Spring Cloud配置zuul路由網關

    1、pom.xml 2、application.yml 3、啟動類 關鍵點: 根據path中的路徑匹配,然后通過服務名調用相應的服務,...

    spring cloud之zuul路由網關(六)

    轉自:http://blog.csdn.net/forezp/article/details/69939114 在微服務架構中,需要幾個基礎的服務治理組件,包括服務注冊與發現、服務消費、負載均衡、斷路器、智能路由、配置管理等,由這幾個基礎組件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 注意:A服務和B服務是可以相互調用的,作圖的時候忘記了。并且配置服務也是注冊到服務注冊...

    猜你喜歡

    spring cloud之Zuul路由網關

    目錄 Zuul概述:是什么 路由基本配置 路由訪問映射規則 Zuul概述:是什么 Zuul包含了對請求的路由和過濾兩個最主要的功能: 其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎. Zuul和Eureka進行整合,將Zuul自身注冊為Eureka服務治理下的應用,同時從Eureka中...

    spring cloud整合swagger,通過zuul路由

    spring cloud整合swagger,通過zuul路由 pom引入swagger jar包 將swagger配置類放到配置中心 配置application.yml文件 訪問路徑 localhost+端口+模塊名+swagger-ui.html swagger會自動根據springmvc的注解生成對應api 如: 注: 使用@RequestParam注解才能獲取到參數 幾個常用的swagger...

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    精品国产乱码久久久久久蜜桃不卡