1.作用
請求路由。請求過濾。
通過使用Zuul來創建各種校驗過濾器,然后指定哪些規則的請求需要執行校驗邏輯,只有通過校驗的才會被路由到具體的微服務接口,不然就返回錯誤提示
2.zuul-client
2.1 配置文件
server:
port: 8766 #端口號
spring:
application:
name: service-zuul #服務注冊中心測試名
zuul:
routes:
api-a:
path: /ribbon/**
serviceId: ribbon-provider #如果是/ribbon/**路徑下的請求,則跳轉到service-ribbon
api-b:
path: /feign/**
serviceId: feign-provider #如果是/feign/**路徑下的請求,則跳轉到service-feign
eureka:
client:
serviceUrl:
defaultZone: http://admin:123@localhost:8761/eureka/ #服務注冊中心
2.2 依賴和注解
依賴:spring-cloud-starter-netflix-zuul; spring-cloud-starter-netflix-eureka-client
注解:在啟動類上增加注解:@EnableZuulProxy;@EnableEurekaClient
2.3 通配符說明
?:匹配任意單個字符
* :匹配任意數量的字符
**:匹配任意數量的字符,並支持多級目錄
2.4 過濾類
在啟動類上增加過濾類:
@Bean
public AccessFilter accessFilter() {
return new AccessFilter();
}
編寫過濾類:AccessFilter
public class AccessFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(AccessFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
Object accessToken = request.getParameter("accessToken");
if (accessToken == null) {
log.warn("accessToken is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("accessToken is empty");
} catch (Exception e) {
}
return null;
}
log.info("access is ok");
return null;
}
}
2.5 過濾類說明
- filterType: 過濾器的類型,它決定過濾器在請求的哪個生命周期中執行。這里定義為pre,代表會在請求被路由之前執行。
- filterOrder: 過濾器的執行順序。當請求在一個階段中存在多個過濾器時,需要根據該方法返回的值來依次執行。
- shouldFilter: 判斷該過濾器是否需要被執行。這里我們直接返回了true,因此該過濾器對所有請求都會生效。實際運用中我們可以利用該函數來指定過濾器的有效范圍。
- run: 過濾器的具體邏輯。這里我們通過ctx.setSendZuulResponse(false)令zuul過濾該請求,不對其進行路由,然后通過ctx.setResponseStatusCode(401)設置了其返回的錯誤碼,當然也可以進 一步優化我們的返回,比如,通過ctx.setResponseBody(body)對返回的body內容進行編輯等。
2.6 訪問地址
訪問http://localhost:8766/ribbon/test?accessToken=ribbon,跳轉到ribbon服務的接口下。