創建zuul工程時選擇Cloud Routing-Zuul
在啓動類上添加@EnableZuulProxy註解
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
訪問其他應用的頁面
zuul服務的端口爲8020,使用localhost:8020/應用名稱/路徑,進行訪問
應用名稱爲其他應用註冊在eureka的名稱,路徑爲在該應用下的路徑
如,我order服務下的一個url地址爲http://localhost:8081/buyer/order/profiles,我通過zuul來訪問的話,使用http://localhost:8020/order/buyer/order/profiles來訪問
擴充或更改代理路由
使用zuul訪問時,默認是ip:port/applicationName/來方法,如果不想使用應用名稱,想自定義的話,可以在yml文件中進行配置
zuul:
routes:
order: /myOrder/**
配置之後,可以同時使用order和myOrder進行訪問
禁止通過路由訪問
如果應用的url不想通過路由訪問,可以在zuul服務的yml配置中進行如下設置
zuul:
ignored-patterns:
- /order/buyer/order/profiles
配置後該url無法訪問到,但是通過myOrder仍可以訪問
也可以通過使用通配符的方式
zuul:
ignored-patterns:
- /**/buyer/order/profiles
這樣,通過order和myOrder都將不能訪問。
cookie和敏感頭
在同一個系統中的服務之間共享標題是可行的,但是您可能不希望敏感標頭泄漏到外部服務器的下游。您可以在路由配置中指定被忽略頭文件列表。
zuul中默認是將"Cookie", "Set-Cookie", "Authorization"設置爲敏感頭,不對外部提供的,如果需要調整敏感頭,需要在yml文件中進行如下設置
zuul:
routes:
order:
path: /morder/**
serviceId: order
sensitiveHeaders:
sensitiveHeaders後面沒有參數,即不設置敏感頭
下面進行測試
在order應用的controller中,添加一個設置cookie的方法
@RequestMapping("cookie")
public String cookie(HttpServletResponse Response) {
Cookie c = new Cookie("name", "aaralyn");
Response.addCookie(c);
return "";
}
先通過應用名稱order進行訪問:http://localhost:8020/order/buyer/order/cookie,來添加cookie,再訪問另一個url 來查看request中是否有cookie
從上圖的結果中可以看到,由於/order這個路徑的敏感頭中仍然包括cookie,所以response中沒有設置cookie,request中也查不到設置的cookie
下面使用將敏感頭置爲空的/morder來進行訪問
創建cookie:http://localhost:8020/morder/buyer/order/cookie
訪問其他url:http://localhost:8020/morder/buyer/order/profiles
自定義過濾器
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
/**
* @Auther: aaralyn
* @Date: 2018/8/9 13:42
* @Description:
*/
@Component
public class TokenFilter extends ZuulFilter {
/**
* 設置過濾器的類型
*
* @return
*/
@Override
public String filterType() {
return PRE_TYPE;
}
/**
* 設置過濾器的順序,數字越小越靠前
*
* @return
*/
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 1;
}
/**
* 是否使用此過濾器
*
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 寫過濾器的邏輯
* 模擬所有的url必須帶有token參數,如果沒有的話,不通過
*
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
context.setSendZuulResponse(false);
context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
}
return null;
}
}