一、什麼是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();
}