路由器和過濾器:Zuul
Zuul是 Netflix 的基于JVM的路由器和服務(wù)器端負(fù)載均衡器瓤狐。
默認(rèn)集成了 Ribbon洛心,實現(xiàn)了負(fù)載均衡功能乳讥。
Netflix使用Zuul進(jìn)行以下操作:
- 認(rèn)證
- 洞察
- 壓力測試
- 金絲雀測試
- 動態(tài)路由
- 服務(wù)遷移
- 負(fù)載脫落
- 安全
- 靜態(tài)響應(yīng)處理
- 主動/主動流量管理
測試考蕾、代理掖肋、路由甩苛、過濾蹂楣。
zuul 將自己也注冊進(jìn) Eureka 注冊中心,使用方向代理:
zuul:
ignoredServices: '*'
routes:
users: /myusers/**
在此示例中浪藻,除 “用戶” 之外捐迫,所有服務(wù)都被忽略。
要獲得對路由的更細(xì)粒度的控制爱葵,可以獨立地指定路徑和serviceId:
zuul:
routes:
users:
path: /myusers/**
serviceId: users_service
zuul不僅只是路由施戴,并且還能過濾,做一些安全驗證萌丈。
package com.xuxx.dept.filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class MyFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
if (accessToken == null) {
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (Exception e) {
}
return null;
}
log.info("ok");
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}
這個例子聲明了一個 filterType
為 pre
的前置過濾器赞哗,filterOrder 為 0,shouldFilter 為 true 表始終過濾辆雾。在 run 方法中肪笋,我們從 request 中獲取 token,不存在返回錯誤代碼度迂。
Zuul Request Lifecycle.png
將此過濾器加入到 Spring Context 中(加 @Component 注解藤乙,并保證在包路徑掃描中),Zuul 會自動去加載惭墓、調(diào)用這個過濾器坛梁。