中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Spring Cloud Zuul路由網關服務過濾

發布時間:2020-08-04 09:52:16 來源:億速云 閱讀:135 作者:小豬 欄目:編程語言

小編這次要給大家分享的是如何實現Spring Cloud Zuul路由網關服務過濾,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

Zuul 簡介

Zuul 的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如 /api/admin 轉發到到 Admin 服務,/api/member 轉發到到 Member 服務。Zuul 默認和 Ribbon 結合實現了負載均衡的功能。

引入依賴

在 pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-server 和 spring-cloud-starter-netflix-zuul 依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

相關配置

在 application.yml 中主要添加 Zuul 路由配置

zuul:
 routes:
  api-a:
   path: /api/ribbon/**
   serviceId: hello-spring-cloud-web-admin-ribbon
  api-b:
   path: /api/feign/**
   serviceId: hello-spring-cloud-web-admin-feign

路由說明:

以 /api/ribbon 開頭的請求都轉發給 spring-cloud-web-admin-ribbon 服務
以 /api/feign 開頭的請求都轉發給 spring-cloud-web-admin-feign 服務
在 Application 入口類中添加 @EnableZuulProxy 注解開啟 zuul 功能

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
  public static void main(String[] args) {
    SpringApplication.run(ZuulApplication.class, args);
  }
}

配置網關路由失敗時的回調

創建 WebAdminFeignFallbackProvider 回調類

/**
 * 路由 hello-spring-cloud-web-admin-feign 失敗時的回調
 */
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {

  @Override
  public String getRoute() {
    // ServiceId,如果需要所有調用都支持回退,則 return "*" 或 return null
    return "hello-spring-cloud-web-admin-feign";
  }

  /**
   * 如果請求服務失敗,則返回指定的信息給調用者
   * @param route
   * @param cause
   * @return
   */
  @Override
  public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    return new ClientHttpResponse() {
      /**
       * 網關向 api 服務請求失敗了,但是消費者客戶端向網關發起的請求是成功的,
       * 不應該把 api 的 404,500 等問題拋給客戶端
       * 網關和 api 服務集群對于客戶端來說是黑盒
       * @return
       * @throws IOException
       */
      @Override
      public HttpStatus getStatusCode() throws IOException {
        return HttpStatus.OK;
      }

      @Override
      public int getRawStatusCode() throws IOException {
        return HttpStatus.OK.value();
      }

      @Override
      public String getStatusText() throws IOException {
        return HttpStatus.OK.getReasonPhrase();
      }

      @Override
      public void close() {

      }

      @Override
      public InputStream getBody() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> map = new HashMap<>();
        map.put("status", 200);
        map.put("message", "無法連接");
        return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
      }

      @Override
      public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        // 和 getBody 中的內容編碼一致
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        return headers;
      }
    };
  }
}

測試路由訪問

依次運行 EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication > ZuulApplication 各服務

訪問:http://localhost:8769/api/ribbon/hi&#63;message=zuul

瀏覽器顯示

port : 8763,message : zuul

訪問:http://localhost:8769/api/feign/hi message=zuul

瀏覽器顯示

port : 8763,message : zuul

至此說明 Zuul 的路由功能配置成功。

使用 Zuul 的服務過濾功能

Zuul 不僅僅只是路由,還有很多強大的功能。比如用在安全驗證方面。

創建服務過濾器

/**
 * Zuul 的服務過濾演示
 */
@Component
public class LoginFilter extends ZuulFilter {

  private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);

  /**
   * 配置過濾類型,有四種不同生命周期的過濾器類型
   * 1. pre:路由之前
   * 2. routing:路由之時
   * 3. post:路由之后
   * 4. error:發送錯誤調用
   * @return
   */
  @Override
  public String filterType() {
    return "pre";
  }

  /**
   * 配置過濾的順序
   * @return
   */
  @Override
  public int filterOrder() {
    return 0;
  }

  /**
   * 配置是否需要過濾:true/需要,false/不需要
   * @return
   */
  @Override
  public boolean shouldFilter() {
    return true;
  }

  /**
   * 過濾器的具體業務代碼
   * @return
   * @throws ZuulException
   */
  @Override
  public Object run() throws ZuulException {
    RequestContext context = RequestContext.getCurrentContext();
    HttpServletRequest request = context.getRequest();
    String token = request.getParameter("token");
    if (token == null) {
      logger.warn("Token is empty");
      context.setSendZuulResponse(false);
      context.setResponseStatusCode(401);
      try {
        context.getResponse().getWriter().write("Token is empty");
      } catch (IOException e) {
      }
    } else {
      logger.info("OK");
    }
    return null;
  }
}

測試過濾器

訪問:http://localhost:8769/api/feign/hi message=zuul

網頁顯示

Token is empty

訪問:http://localhost:8769/api/feign/hi message=zuul&token=1

網頁顯示

port : 8763,message : zuul

看完這篇關于如何實現Spring Cloud Zuul路由網關服務過濾的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商丘市| 兴文县| 阿鲁科尔沁旗| 蒙自县| 宣汉县| 岫岩| 盐亭县| 丹东市| 长春市| 盘锦市| 延寿县| 霍山县| 奉化市| 中阳县| 开原市| 兴安县| 兴安盟| 扎兰屯市| 盐池县| 衡水市| 天柱县| 武陟县| 元朗区| 汽车| 朔州市| 南开区| 阳曲县| 华宁县| 内江市| 乌兰浩特市| 大埔区| 安仁县| 雷山县| 中江县| 民乐县| 东兰县| 东阳市| 禄丰县| 灵山县| 涞源县| 宣城市|