【九】Spring Cloud zuul

zuul相當于是路由網關,默認結合了Ribbon。Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何長連接。

1.zuul單獨搭建網關項目

1.1 增加項目依賴

 <!--增加服務注冊能力-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--增加網關能力-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

1.2 增加配置文件配置

server:
  port: 8855
spring:
  application:
    name: demo-springcloud-zuul
zuul:

  routes:
    api-a:
      path: /api-a/**
      serviceId: demo-springcloud-service-order

    api-b:
      path: /api-b/**
      serviceId: demo-springcloud-service-user
eureka:
  client:
    service-url:
      defaultZone: http://user:user@demo-springcloud-eureka-one:8761/eureka/
  instance:
    prefer-ip-address: true

1.3 啟動類增加代碼修改

//開啟網關能力
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class DemoSpringcloudZuulApplication {

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


    //實例化我們的攔截器
    @Bean
    public AccessFilter accessFilter() {
        return new AccessFilter();
    }
}

1.4 增加一些常用的攔截器

//利用Zuul的過濾器來實現我們對外服務的安全控制, 這個只是pre過濾器
public class AccessFilter extends ZuulFilter {


    /**
     * filterType:返回一個字符串代表過濾器的類型,在zuul中定義了四種不同生命周期的過濾器類型,具體如下:
     * pre:可以在請求被路由之前調用
     * routing:在路由請求時候被調用
     * post:在routing和error過濾器之后被調用
     * error:處理請求時發生錯誤時被調用
     */
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //這里可以寫邏輯判斷,是否要過濾,本文true,永遠過濾。
        return true;
    }

    //過濾器的具體邏輯??捎煤軓碗s,包括查sql,nosql去判斷該請求到底有沒有權限訪問
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();


        Object accessToken = request.getParameter("age");
        if(accessToken == null) {
            System.out.println("未通過安全校驗");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);

            return "you can not  access to the  api-*";
        }

        System.out.println("通過安全校驗");
        return null;

    }
}

1.5調用例子

image.png

2.zuul其他相關知識

2.1 zuul常用的過濾器

就和上文一樣,我們同時繼承 zuulFilter,里面有四種方法

1. filterType:該函數需要返回一個字符串來代表過濾器的類型,而這個類型就是在HTTP請求過程中定義的各個階段。在Zuul中默認定義了四種不同生命周期的過濾器類型,具體如下:
  • pre:可以在請求被路由之前調用。
  • routing:在路由請求時候被調用。
  • post:在routing和error過濾器之后被調用。
  • error:處理請求時發生錯誤時被調用。
  • filterOrder:通過int值來定義過濾器的執行順序,數值越小優先級越高。
  • shouldFilter:返回一個boolean類型來判斷該過濾器是否要執行。我們可以通過此方法來指定過濾器的有效范圍。
  • run:過濾器的具體邏輯。在該函數中,我們可以實現自定義的過濾邏輯,來確定是否要攔截當前的請求,不對其進行后續的路由,或是在請求路由返回結果之后,對處理結果做一些加工等。
image.png
image.png

2.2 zuul處理異常

因為zuul不太好用,建議替換成gateway. 所以后續再更新這塊。
todo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一個朋友通過自己的努力考進了比較中意的大學,入大學后把自己的生活安排的井然有序,每天讀書和跑步,長久的積累讓自己身...
    云由故理閱讀 390評論 0 0
  • 一年一年又一年,轉眼又是一天。今天年初二,去了姥姥家。年初二,回娘家。俗話說“一個姑爺半個兒”。大年初二這天,出嫁...
    石頭唔閱讀 162評論 0 1
  • 以往我是從沒講過身邊人故事的,不是沒有事情可說,而是不想說。因為我覺得,如果非要講的話那就必須得完完整整地寫完他一...
    北辰星海閱讀 730評論 4 22