1. 程式人生 > >spring cloud 2.x版本 Zuul路由閘道器教程

spring cloud 2.x版本 Zuul路由閘道器教程

前言

本文采用Spring cloud本文為2.1.8RELEASE,version=Greenwich.SR3

本文基於前兩篇文章eureka-server、eureka-client、eureka-ribbon和eureka-feign的實現。
參考

  • eureka-server
  • eureka-client
  • eureka-ribbon
  • eureka-feign

概念

Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,例如將請求/api/goods轉發到商品服務上、/api/order轉發到訂單服務上等。

Zull預設和Ribbon結合實現了負載均衡功能。

建立Zuul工程

1.1 建立sping boot工程:eureka-zuul

1.2 新增pom.xml相關依賴

<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.3 application新增配置資訊

spring:
  application:
    name: eureka-zuul
server:
  port: 8400

eureka:
  instance:
    hostname: localhost
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

zuul:
  routes:
    eureka-ribbon: #對應服務名稱,可以自定義(最好保持一致)
      path: /ribbon/*
      serviceId: eureka-ribbon #對應服務名稱
    eureka-feign:
      path: /eureka-feign/*
      serviceId: eureka-feign #對應服務名稱

1.4 啟動類EurekaZuulApplication增加註解

package spring.cloud.demo.eurekazuul;

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

@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {

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

}

@EnableZuulProxy:開啟Zuul網關注解

1.5 啟動eureka-zuul服務

開啟瀏覽器,分別輸入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,顯示結果分別如下:

可以看到Zuul按照路由轉發的配置規則,把/ribbon/的請求轉發到eureka-ribbon服務上,把/eureka-feign/的請求轉發到eureka-feign的服務上。

至此,一個簡單基於Zuul路由閘道器就搭建完成了。

彩蛋

新增自定義過濾器

Zuul過濾器有四種類型分別是

  • pre 路由前
  • route 路由時
  • post 路由完畢
  • error 發生錯誤時

建立自定義過濾器filter

package spring.cloud.demo.eurekazuul.fillter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 簡單filter過濾器
 * @auther: maomao
 * @DateT: 2019-09-17
 */
public class CommonFilter extends ZuulFilter {

    /**
     * 在請求被路由之前呼叫
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * filter執行順序,通過數字指定 ,優先順序為0,數字越大,優先順序越低
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否執行該過濾器,此處為true,說明需要過濾
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();

        //獲取請求引數
        String token = request.getParameter("token");

        //校驗token是否可以通過
        if (StringUtils.isNotBlank(token) && token.equals("maomao")) {
            requestContext.setSendZuulResponse(true);
            requestContext.setResponseStatusCode(200);
            requestContext.set("code", 1);
        } else {
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(401);
            HttpServletResponse response = requestContext.getResponse();
            response.setHeader("content-type", "text/html;charset=utf-8");
            requestContext.setResponseBody("閘道器認證失敗,停止路由");
            requestContext.set("code", 0);
        }
        return null;
    }
}

將過濾器加入Bean,增加Config類

package spring.cloud.demo.eurekazuul.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter;

/**
 * @auther: maomao
 * @DateT: 2019-09-17
 */
@Configuration
public class ZuulFilterConfig {

    @Bean
    public CommonFilter commonFilter() {
        return new CommonFilter();
    }
}

啟動工程

在瀏覽器分別輸入http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello,顯示結果如下:

顯示結果證明,過濾器已經生效。因為過濾CommonFilter中要求輸入參入帶token=maomao,所以請求被攔截,Zuul停止轉發。

在瀏覽器中URL中增加token引數,顯示如下:

顯示結果證明,在token正確的情況下,Zuul轉發成功。

至此,自定義的過濾器就演示完成。

總結

本文要實現了簡單的Zuul路由轉發應用。

程式碼地址

gitHub地址


《Srping Cloud 2.X小白教程》目錄
  • spring cloud 2.x版本 Eureka Server服務註冊中心教程
  • spring cloud 2.x版本 Eureka Client服務提供者教程
  • spring cloud 2.x版本 Ribbon服務發現教程(內含整合Hystrix熔斷機制)
  • spring cloud 2.x版本 Feign服務發現教程(內含整合Hystrix熔斷機制)
  • spring cloud 2.x版本 Zuul路由閘道器教程
  • spring cloud 2.x版本 config分散式配置中心教程
  • spring cloud 2.x版本 Hystrix Dashboard斷路器教程
  • spring cloud 2.x版本 Gateway路由閘道器教程
  • spring cloud 2.x版本 Gateway自定義過濾器教程
  • spring cloud 2.x版本 Gateway熔斷、限流教程
  • spring cloud 2.x版本 Gateway動態路由教程

  • 寫作不易,轉載請註明出處,喜歡的小夥伴可以關注公眾號檢視更多喜歡的文章。
  • 聯絡方式:[email protected]