1. 程式人生 > >SpringCloud2.0 Zuul 閘道器路由 基礎教程(十)

SpringCloud2.0 Zuul 閘道器路由 基礎教程(十)

1、啟動基礎工程

1.1、啟動【服務註冊中心】,工程名稱:springcloud-eureka-server

參考 SpringCloud2.0 Eureka Server 服務中心 基礎教程(二)

1.2、啟動【服務提供者】,工程名稱:springcloud-eureka-client

參考 SpringCloud2.0 Eureka Client 服務註冊 基礎教程(三)

1.3、啟動【服務消費者】,工程名稱:springcloud-eureka-ribbon

參考 SpringCloud2.0 Hystrix Ribbon 基於Ribbon實現斷路器 基礎教程(六)

1.4、啟動【服務消費者】,工程名稱:springcloud-eureka-feign

參考 SpringCloud2.0 Hystrix Feign 基於Feign實現斷路器 基礎教程(七)

2、建立【閘道器路由】,即 Eureka Zuul

2.1、新建 Spring Boot 工程,工程名稱:springcloud-eureka-zuul

2.2、工程pom.xml檔案新增如下依賴:

<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-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2.3、在工程啟動類中,添加註解 @EnableZuulProxy

package com.miniooc.eurekazuul;

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

/**
 * EurekaZuulApplication
 *
 * @author 宋陸
 * @version 1.0.0
 */
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {

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

}

2.4、建立工程配置檔案application.yml,新增如下配置:

server:
  port: 8080

spring:
  application:
    name: eureka-gateway

eureka:
  instance:
    hostname: localhost
    # 表示eureka client間隔多久去拉取服務註冊資訊,預設為30秒,如果要迅速獲取服務註冊狀態,可以縮小該值
    lease-renewal-interval-in-seconds: 5
    # 表示eureka server至上一次收到client的心跳之後,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance。
    # 預設為90秒
    # 如果該值太大,則很可能將流量轉發過去的時候,該instance已經不存活了。
    # 如果該值設定太小了,則instance則很可能因為臨時的網路抖動而被摘除掉。
    # 該值至少應該大於 leaseRenewalIntervalInSeconds
    lease-expiration-duration-in-seconds: 10
  client:
    serviceUrl:
      defaultZone: http://localhost:9527/eureka/,http://localhost:9528/eureka/,http://localhost:9529/eureka/

zuul:
  routes:
    api-ribbon:
      path: /ribbon/*
      serviceId: eureka-discovery-ribbon
    api-feign:
      path: /feign/*
      serviceId: eureka-discovery-feign

2.5、啟動工程

2.6、開啟瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

【路由閘道器】按照路由轉發規則,把 /ribbon/* 的請求,轉發到了 eureka-discovery-ribbon 服務,把 /feign/* 的請求,轉發到了 eureka-discovery-feign

3、為【閘道器路由】新增自定義過濾器

zuul過濾器有四種類型分別是:pre 路由前,route 路由時,post 路由完畢,error 發生錯誤時。

3.1、建立自定義過濾器 AuthFilter

package com.miniooc.eurekazuul.filter;

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;

/**
 * EurekaZuulApplication
 *
 * @author 宋陸
 * @version 1.0.0
 */
public class AuthFilter extends ZuulFilter {

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

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

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

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

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

        // 如果有token引數並且token值為miniooc,才進行路由
        if (StringUtils.isNotBlank(token) && token.equals("miniooc")) {
            ctx.setSendZuulResponse(true); //對請求進行路由
            ctx.setResponseStatusCode(200);
            ctx.set("code", 1);
        } else {
            ctx.setSendZuulResponse(false); //不對其進行路由
            ctx.setResponseStatusCode(401);
            HttpServletResponse response = ctx.getResponse();
            response.setHeader("content-type", "text/html;charset=utf8");
            ctx.setResponseBody("閘道器認證失敗,停止路由");
            ctx.set("code", 0);
        }
        return null;
    }
}

3.2、建立應用配置類 EurekaRibbonConfig

package com.miniooc.eurekazuul.config;

import com.miniooc.eurekazuul.filter.AuthFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * EurekaZuulConfig
 * 應用配置類,初始化 Bean和配置資訊
 *
 * @author 宋陸
 * @version 1.0.0
 */
@Configuration
public class EurekaZuulConfig {

    @Bean
    public AuthFilter authFilter(){
        return new AuthFilter();
    }
}

3.3、重新啟動工程

3.4、開啟瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo

 

沒有通過校驗,zuul過濾器停止路由轉發

3.5、開啟瀏覽器,分別訪問 http://localhost:8080/ribbon/ribbonInfo?token=miniooc,http://localhost:8080/feign/feignInfo?token=miniooc

 

通過校驗,zuul過濾器正常路由轉發

至此,一個簡單的【閘道器路由】搭建完成。