ホームページ  >  記事  >  Java  >  SpringCloud での zuul の原理と使用法の紹介

SpringCloud での zuul の原理と使用法の紹介

不言
不言転載
2019-04-11 13:18:397637ブラウズ

この記事では、Spring Cloud での zuul の原理と使用法について紹介します。一定の参考価値があります。必要な友人は参照してください。お役に立てれば幸いです。

はじめに

Zuul は、デバイスや Web サイトから Netflix ストリーミング アプリケーションのバックエンドへのすべてのリクエストのフロント ドアです。 Zuul は、エッジ サービス アプリケーションとして、動的ルーティング、監視、復元力、セキュリティをサポートするように構築されています。必要に応じて、リクエストを複数の Amazon Autoscaling グループにルーティングすることもできます。

Zuul は、一連の異なるタイプのフィルターを使用して、機能をエッジ サービスに迅速かつ柔軟に適用できるようにします。これらのフィルターは、次の機能の実行に役立ちます。

  • 認証とセキュリティ - 各リソースの認証要件を特定し、それらの要件を満たさないリクエストを拒否します。
  • インサイトとモニタリング – エッジで意味のあるデータと統計を追跡し、生産状況を正確に把握します。
  • 動的ルーティング - 必要に応じてリクエストを別のバックエンド クラスターに動的にルーティングします。
  • ストレス テスト - クラスターへのトラフィックを徐々に増やしてパフォーマンスを評価します。
  • 負荷を軽減する - 各タイプのリクエストに容量を割り当て、制限を超えるリクエストを削除します。
  • 静的応答処理 - 内部クラスターに転送するのではなく、エッジで直接応答を構築します。
  • マルチリージョンの復元力 - リクエストを AWS リージョン間でルーティングして、ELB の使用を多様化し、メンバーに近い当社の強み

仕組み

概要を説明すると、Zuul 2.0 はプレフィルター (受信フィルター) を実行する Netty サーバーです。次に、Netty クライアントを使用してリクエストをプロキシし、ポスト フィルタ (アウトバウンド フィルタ) を実行した後に応答を返します。

SpringCloud での zuul の原理と使用法の紹介

#フィルターは、Zuul のビジネス ロジックの中核です。上の図に示すように、これらは非常に幅広い操作を実行でき、要求と応答のライフ サイクルのさまざまな部分で動作できます。

  • 受信フィルターは、ソースにルーティングする前に実行され、認証、ルーティング、リクエストの装飾に使用できます。
  • エンドポイント フィルターを使用して静的応答を返すことができます。それ以外の場合は、組み込みの ProxyEndpoint フィルターがリクエストをオリジンにルーティングします。
  • 送信フィルターは、ソースから応答を取得した後に実行され、ユーザー応答の測定、装飾、またはカスタム ヘッダーの追加に使用できます。

フィルタには 同期と非同期 の 2 種類があります。イベント ループで実行しているため、フィルターを決してブロックしないでください。ブロックしたい場合は、非同期フィルターでブロックし、別のスレッドプールでブロックできます。それ以外の場合は、同期フィルターを使用します。

ユーティリティ フィルター

  • DebugRequest - 追加のデバッグ ログをリクエストに追加するクエリ パラメーターを検索します。
  • Healthcheck - 単純な静的すべてが正しくブートストラップされた場合に 200 を返すエンドポイント フィルター
  • ZuulResponseFilter - ルーティング、リクエストの実行、ステータス、エラー理由に関する追加の詳細を提供する情報ヘッダーを追加します
  • GZipResponseFilter - gzip アウトバウンド レスポンスを有効にすることができます
  • SurgicalDebugFilter - 特定のリクエストをデバッグのために別のホストにルーティングできます

使用上のヒント

依存関係:

    <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-netflix-zuul</artifactid>
        </dependency>

MyFilter フィルター

@Component
public class MyFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);

    /**
     * pre:路由之前
     * routing:路由之时
     * post: 路由之后
     * error:发送错误调用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤的顺序
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 这里可以写逻辑判断,是否要过滤,本文true,永远过滤
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }


    /**
     * 过滤器的具体逻辑。
     * 可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }

}

application.yml 設定ルーティング転送

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: cloud-service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: cloud-service-ribbon
    api-b:
      path: /api-b/**
      serviceId: cloud-service-feign

zuul を有効にする

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class CloudServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudServiceZuulApplication.class, args);
    }

}

ルート メルトダウン

/**
 * 路由熔断
 */
@Component
public class ProducerFallback implements FallbackProvider {
    private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);

    //指定要处理的 service。
    @Override
    public String getRoute() {
        return "spring-cloud-producer";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        if (cause != null && cause.getCause() != null) {
            String reason = cause.getCause().getMessage();
            logger.info("Excption {}",reason);
        }
        return fallbackResponse();
    }

    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }

            @Override
            public String getStatusText() throws IOException {
                return "OK";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("The service is unavailable.".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }


}

概要

Zuul ゲートウェイには自動転送メカニズムがありますが、実際には、Zuul には認証、トラフィック転送、リクエスト統計など、さらに多くのアプリケーション シナリオがあります。これらの機能はすべて Zuul を使用して実装できます。


以上がSpringCloud での zuul の原理と使用法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。