SpringCloud的Zuul網關

  • 網關的作用相當於一個過慮器、攔截器,它可以攔截多個系統的請求.
  • 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;
              }
            }
          •  

             

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章