- 網關的作用相當於一個過慮器、攔截器,它可以攔截多個系統的請求.
- Zuul:
-
服務網關是在微服務前邊設置一道屏障,請求先到服務網關,網關會對請求進行過慮、校驗、路由等處理。有了服
務網關可以提高微服務的安全性,網關校驗請求的合法性,請求不合法將被攔截,拒絕訪問。 -
使用方法:
-
使用@EnableZuulProxy註解
-
注意在啓動類上使用@EnableZuulProxy註解標識此工程爲Zuul網關
-
-
路由配置
-
zuul: routes: manage‐course: #路由名稱,名稱任意,保持所有路由名稱唯一 path: /course/** serviceId: service‐menu #指定服務id,從Eureka中找到服務的ip和端口 #url: http://localhost:8080#也可指定url strip‐prefix: false #true:代理轉發時去掉前綴,false:代理轉發時不去掉前綴 sensitiveHeaders: #默認zuul會屏蔽cookie,cookie不會傳到下游服務,這裏設置爲空則取消默認的黑名單,如果設置了具體的頭信息則不會傳到下游服務 # ignoredHeaders: Authorization serviceId:推薦使用serviceId,zuul會從Eureka中找到服務id對應的ip和端口。 strip-prefix: false #true:代理轉發時去掉前綴,false:代理轉發時不去掉前綴,例如,爲true請 求/course/menu/get/..,代理轉發到/coursebase/get/,如果爲false則代理轉發 到/course/menu/get sensitiveHeaders:敏感頭設置,默認會過慮掉cookie,這裏設置爲空表示不過慮 ignoredHeaders:可以設置過慮的頭信息,默認爲空表示不過慮任何頭
- 網關配置文件
-
zuul: routes: xc‐service‐learning: #路由名稱,名稱任意,保持所有路由名稱唯一 path: /menu/** serviceId: service‐menu#指定服務id,從Eureka中找到服務的ip和端口 strip‐prefix: false sensitiveHeaders: 網關的配置可以是/**/user,但是這樣配置的路徑就不會被截取了.就是直接按照地址轉發了.
-
-
測試:
-
使用postman訪問網關,看看網關是否把請求轉發到你的微服務上.
-
-
過濾器
-
Zuul的核心就是過慮器,通過過慮器實現請求過慮,身份校驗等。
-
自定義過慮器需要繼承 ZuulFilter,ZuulFilter是一個抽象類,需要覆蓋它的四個方法
-
1、 shouldFilter:返回一個Boolean值,判斷該過濾器是否需要執行。返回true表示要執行此過慮器,否則不執行。
-
2、 run:過濾器的業務邏輯。
-
3、 filterType:返回字符串代表過濾器的類型,如下 pre:請求在被路由之前執行 routing:在路由請求時調用 post:在routing和errror過濾器之後調用 error:處理請求時發生錯誤調用
4、 filterOrder:此方法返回整型數值,通過此數值來定義過濾器的執行順序,數字越小優先級越高。
-
-
-
測試
-
過慮所有請求,判斷頭部信息是否有Authorization,如果沒有則拒絕訪問,否則轉發到微服務。
-
定義過慮器,使用@Component標識爲bean
-
@Component public class LoginFilterTest extends ZuulFilter { private static final Logger LOG = LoggerFactory.getLogger(LoginFilterTest.class); @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 2;//int值來定義過濾器的執行順序,數值越小優先級越高 } @Override public boolean shouldFilter() {// 該過濾器需要執行 return true; } @Override public Object run() { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletResponse response = requestContext.getResponse(); HttpServletRequest request = requestContext.getRequest(); //取出頭部信息token String token= request.getHeader("token"); if(StringUtils.isEmpty(token)){ requestContext.setSendZuulResponse(false);// 拒絕訪問 requestContext.setResponseStatusCode(200);// 設置響應狀態碼 ResponseResult unauthenticated = new ResponseResult("此操作需要登錄.請登錄後再試!"); String jsonString = JSON.toJSONString(unauthenticated); requestContext.setResponseBody(jsonString); requestContext.getResponse().setContentType("application/json;charset=UTF‐8"); return null; } return null; } }
-
-
-
-
-
SpringCloud的Zuul網關
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.