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