SpringCloud學習第六篇:Zuul學習(Hoxton.SR4)

一、什麼是Zuul

Zuul作爲微服務系統的網關組件。所有從設備或網站來的請求都會經過Zuul到達後端,用於構建邊界服務,致力於動態路由、過濾、監控、彈性伸縮和安全。Zuul底層利用各種filter來實現如:認證和安全、性能檢測、動態路由、壓力測試、負載均衡、靜態資源處理。

二、Zuul和Nginx的區別

  • 相同點
    Zuul和Nginx都可以實現負載均衡、反向代理(隱藏真實ip地址),過濾請求,實現網關的效果
  • 不同點
    Nginx:C語言開發,採用服務器負載均衡
      Zuul:java開發,使用eureka+ribbon實現負載均衡。
    Nging相對Zuul更加強大,Nginx可以整合一些腳本語言。

三、Zuul學習

3.1、Demo搭建
Zuul的學習是在上一章工程基礎之上建立的

  • Maven
<dependencies>
    <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>
</dependencies>
  • application.properties
# Tomcat
server:
  tomcat:
    uri-encoding: UTF-8
    max-threads: 1000
    min-spare-threads: 30
  port: 1104
spring:
  application:
    name: zuul
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1101/eureka/
  instance:
    hostname: localhost
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: web-demo
#    api-b:
#      path: /api-b/**
#      serviceId: service-feign

  • 啓動入口
@EnableZuulProxy
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class,args);
    }
}
  • Demo演示
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

3.2、ZuulFilter

  • 創建RequestFilter
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.context.RequestContext;

public class RequestFilter extends ZuulFilter {
    //這裏可以處理邏輯
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        System.out.println(String.format( request.getMethod(), request.getRequestURL().toString()));
        // 對該請求進行路由
        ctx.setSendZuulResponse(true);
        ctx.setResponseStatusCode(200);
        // 設值,讓下一個Filter看到上一個Filter的狀態
        ctx.set("isSuccess", true);
        return null;
    }
   //過濾器類型
   //per:前置過濾器、route:負責轉發請求到微服務、error:處理請求錯誤是被調用、post:在route和error過濾器之後調用
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 優先級爲0,數字越大,優先級越低
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    //是否執行該過濾器 false爲不執行
    @Override
    public boolean shouldFilter() {
        return true;
    }
}
  • 入口類增加RequestFilter Bean
  @Bean
    public RequestFilter requestFilter(){
        return new RequestFilter();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章