1. 程式人生 > >Spring Cloud基礎教程(七):路由閘道器使用(Zuul)

Spring Cloud基礎教程(七):路由閘道器使用(Zuul)

一、概述

Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/client-a/轉發到到a服務,/client-b/轉發到到b服務。zuul預設和Ribbon結合實現了負載均衡的功能。

二、準備

服務註冊與發現這篇部落格中的Eureka-Client-A工程,複製一份,名字修改為Service-Zuul。

三、工程修改

Gradle依賴修改為

dependencies {
	compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
	compile('org.springframework.cloud:spring-cloud-starter-zuul:1.4.4.RELEASE')
	compile('org.springframework.boot:spring-boot-starter-web')
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

在啟動類上新增@EnableZuulProxy註解,開啟路由功能。

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

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class EurekaZuulApplication
{

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

修改application.properties配置檔案,將/client-a/開頭的請求路由到eureka-client-a伺服器

spring.application.name=service-zuul
server.port=10010
eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/

zuul.routes.api-a.path: /client-a/**
zuul.routes.api-a.serviceId: eureka-client-a

四、測試

啟動之前的Eureka-Server、Eureka-Client-A和當前的Service-Zuul工程,訪問

http://127.0.0.1:10001/



五、服務過濾

Zuul不僅有路由的功能,還有服務過濾的功能,做一些攔截驗證。

新建MyFilter類

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * Created by wzj on 2018/5/24.
 */
@Component
public class MyFilter extends ZuulFilter
{
    private static Logger log = LoggerFactory.getLogger(MyFilter.class);

    /**
     * to classify a filter by type. Standard types in Zuul are "pre" for pre-routing filtering,
     * "route" for routing to an origin, "post" for post-routing filters, "error" for error handling.
     * We also support a "static" type for static responses see  StaticResponseFilter.
     * Any filterType made be created or added and run by calling FilterProcessor.runFilters(type)
     *
     * @return A String representing that type
     */
    @Override
    public String filterType()
    {
        return "pre";
    }

    /**
     * filterOrder() must also be defined for a filter. Filters may have the same  filterOrder if precedence is not
     * important for a filter. filterOrders do not need to be sequential.
     *
     * @return the int order of a filter
     */
    @Override
    public int filterOrder()
    {
        return 0;
    }

    /**
     * a "true" return from this method means that the run() method should be invoked
     *
     * @return true if the run() method should be invoked. false will not invoke the run() method
     */
    @Override
    public boolean shouldFilter()
    {
        return true;
    }

    /**
     * if shouldFilter() is true, this method will be invoked. this method is the core method of a ZuulFilter
     *
     * @return Some arbitrary artifact may be returned. Current implementation ignores it.
     * @throws ZuulException if an error occurs during execution.
     */
    @Override
    public Object run() throws ZuulException
    {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if (accessToken == null)
        {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try
            {
                ctx.getResponse().getWriter().write("token is empty");
            }
            catch (Exception e)
            {
            }

            return null;
        }
        log.info("ok");
        return null;
    }
}

filterType:返回一個字串代表過濾器的型別,在zuul中定義了四種不同生命週期的過濾器型別,具體如下: 

  • pre:路由之前
  • routing:路由之時
  • post: 路由之後
  • error:傳送錯誤呼叫
  • filterOrder:過濾的順序
  • shouldFilter:這裡可以寫邏輯判斷,是否要過濾,本文true,永遠過濾。
  • run:過濾器的具體邏輯。可用很複雜,包括查sql,nosql去判斷該請求到底有沒有許可權訪問。



相關推薦

Spring Cloud基礎教程路由使用Zuul

一、概述Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/client-a/轉發到到a服務,/client-b/轉發到到b服務。zuul預設和Ribbon結合實現了負載均衡的功能。二、準備將服務註冊與發現這篇部落格中的Eureka-Client-A工程,複

Spring基礎快速入門spring cloud4APIZuul

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring基礎快速入門spring cloudAPIZuul

Spring Cloud是Spring總多的Project中的一個,它提供了一整套的工具幫助系統架構師們在進行分散式設計的時候可以拿來即用, 在建立和釋出微服務時極為便捷和有效。 本系列文章將會使用最簡單的例子和最為容易的方式來學習Spring Cloud。本文將會介紹如何引入Zuul在

Spring Boot + Spring Cloud 實現許可權管理系統 後端篇二十一服務Zuul

線上演示 使用者名稱:admin 密碼:admin 技術背景 前面我們通過Ribbon或Feign實現了微服務之間的呼叫和負載均衡,那我們的各種微服務又要如何提供給外部應用呼叫呢。 當然,因為是REST API介面,外部客戶端直接呼叫各個微服務是沒有問題的,但出於種種原因,這並不是一個好的選擇。 讓客戶端直

SpringCloud服務Zuul

一、服務閘道器 官方文件:  https://springcloud.cc/spring-cloud-dalston.html#_router_and_filter_zuul 路由在微服務體系結構的一個組成部分。例如,/可以對映到您的Web應用程式,/api/users對映

小白學SpringCloud(五)路由Zuul

在微服務的架構下,各個服務一般會有各自的網路地址,在這樣的情況下外部客戶端的呼叫可能會形成雜亂無章的局面。這時候我們就可以使用微服務閘道器Zuul這個元件,我們讓所有的客戶端請求全部請求Zuul,再由Zuul統一的去請求各個服務。 一、Zuul簡介 Zuu

Spring Cloud服務zuul過濾器

上文介紹了Zuul的基本使用與路由功能,本文接著介紹Zuul的核心概念 —— Zuul過濾器(filter)。 Zuul的功能基本通過Zuul過濾器來實現(類比於Struts的攔截器,只是Struts攔截器用到責任鏈模式,Zuul則是通過FilterProcessor來控制執行),在不同的階段,通過不同型別的

Spring Cloud系列教程 | 第使用Spring Cloud Zuul實現過濾器或攔截功能案例

推薦 Spring Cloud 視訊: 使用Spring Cloud Zuul實現過濾器或攔截器功能案例   Spring Cloud的API閘道器不但可以實現類似NGINX+Lua強大的路由分發,實現動靜頁面的分流,更重要可以實現對所有發往後端微服務請求的攔

spring cloud+.net core搭建微服務架構Api

前言 國慶假期,一直沒有時間更新。 根據群裡面的同學的提問,強烈推薦大家先熟悉下spring cloud。文章下面有純潔大神的spring cloud系列。 上一章最後說了,因為服務是不對外暴露的,所以在外網要訪問服務必須通過API閘道器來完成,而spring cloud 提供了現成的Api閘道器元件zuul

spring cloud+dotnet core搭建微服務架構Api

前言 國慶假期,一直沒有時間更新。 根據群裡面的同學的提問,強烈推薦大家先熟悉下spring cloud。文章下面有純潔大神的spring cloud系列。 上一章最後說了,因為服務是不對外暴露的,所以在外網要訪問服務必須通過API閘道器來完成,而spring cloud 提供了現成的Api閘道器元件z

Spring Cloud服務zuul

通過前面幾篇文章的介紹,Spring Cloud微服務架構可通過Eureka實現服務註冊與發現,通過Ribbon或Feign來實現服務間的負載均衡呼叫,通過Hystrix來為服務呼叫提供服務降級、熔斷機制避免雪崩效應,通過Spring Cloud Config實現服務配置的集中化管理。微服務架構內部管理的基本

springcloud(十五)Spring Cloud 終於按捺不住推出了自己的服務 Gateway

Spring 官方最終還是按捺不住推出了自己的閘道器元件:Spring Cloud Gateway ,相比之前我們使用的 Zuul(1.x) 它有哪些優勢呢?Zuul(1.x) 基於 Servlet,使用阻塞 API,它不支援任何長連線,如 WebSockets,Spring Cloud Gateway 使用

Spring Cloud(四)路由Zuul

   Zuul作為路由閘道器元件,在微服務架構當中有著非常重要的作用,主要體現在6個方面: Zuul,Ribbon以及Eureka相結合,可以實現智慧路由和負載均衡的功能,Zuul能夠將請求流量按某種策略分發到叢集狀態的多個伺服器例項。 閘道器將所有服務的API介面統一聚

史上最簡單的SpringCloud教程 | 第五篇 路由(zuul)

在微服務架構中,需要幾個基礎的服務治理元件,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等,由這幾個基礎元件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 注意:A服務和B服務是可以相互呼叫的,作圖的時候忘記了。並且配置服務也是註冊到服務註冊中

史上最簡單的SpringCloud教程 | 第五篇 路由(zuul)(Finchley版本)

在微服務架構中,需要幾個基礎的服務治理元件,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等,由這幾個基礎元件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 注意:A服務和B服務是可以相互呼叫的,作圖的時候忘記了。並且配置服務也是註冊到服務註冊中

微服務從零搭建——搭建api不帶驗證

環境準備 建立空的core2.1 api專案  演示使用名稱APIGateWay  過程參考上一篇 完成後在appsettings.json 新增節點 "Setting": { "Port": "5000" } 搭建過程 新增檔案configuration.json

Spring Cloud 終於按捺不住推出了自己的服務 Gateway

Spring 官方最終還是按捺不住推出了自己的閘道器元件:Spring Cloud Gateway ,相比之前我們使用的 Zuul(1.x) 它有哪些優勢呢?Zuul(1.x) 基於 Servlet,使用阻塞 API,它不支援任何長連線,如 WebSockets,Spring Cloud Ga

基於springboot+redis+bootstrap+mysql開發一套屬於自己的分散式springcloud雲許可權架構十六路由

      在前面十六章我們完成了註冊中心、鏈路中心、許可權架構生產者、許可權架構消費者的整合開發工作,本章將開始重點講解我們的路由閘道器的實現,由於我們的微服務內部是無許可權的,因此我們的微服務內部是不對外暴露埠的,所有的請求全部通過路由閘道器來進行請求的,因此在本章我們的

Spring Cloud構建企業級匯流排-第六部分服務

     前面的文章我們介紹了,Eureka用於服務的註冊於發現,Feign支援服務的呼叫以及均衡負載,Hystrix處理服務的熔斷防止故障擴散,Spring Cloud Config服務叢集配置中心,似乎一個微服務框架已經完成了。    我們還是少考慮了一個問題,外部的應用

跟我學SpringCloud | 第十服務Zuul基於Apollo動態路由

目錄 SpringCloud系列教程 | 第十七篇:服務閘道器Zuul基於Apollo動態路由 Apollo概述 Apollo相比於Spring Cloud Config優勢 工程實戰 示例程