この記事では、Spring Cloud での zuul の原理と使用法について紹介します。一定の参考価値があります。必要な友人は参照してください。お役に立てれば幸いです。
はじめに
Zuul は、デバイスや Web サイトから Netflix ストリーミング アプリケーションのバックエンドへのすべてのリクエストのフロント ドアです。 Zuul は、エッジ サービス アプリケーションとして、動的ルーティング、監視、復元力、セキュリティをサポートするように構築されています。必要に応じて、リクエストを複数の Amazon Autoscaling グループにルーティングすることもできます。
Zuul は、一連の異なるタイプのフィルターを使用して、機能をエッジ サービスに迅速かつ柔軟に適用できるようにします。これらのフィルターは、次の機能の実行に役立ちます。
- 認証とセキュリティ - 各リソースの認証要件を特定し、それらの要件を満たさないリクエストを拒否します。
- インサイトとモニタリング – エッジで意味のあるデータと統計を追跡し、生産状況を正確に把握します。
- 動的ルーティング - 必要に応じてリクエストを別のバックエンド クラスターに動的にルーティングします。
- ストレス テスト - クラスターへのトラフィックを徐々に増やしてパフォーマンスを評価します。
- 負荷を軽減する - 各タイプのリクエストに容量を割り当て、制限を超えるリクエストを削除します。
- 静的応答処理 - 内部クラスターに転送するのではなく、エッジで直接応答を構築します。
- マルチリージョンの復元力 - リクエストを AWS リージョン間でルーティングして、ELB の使用を多様化し、メンバーに近い当社の強み
概要を説明すると、Zuul 2.0 はプレフィルター (受信フィルター) を実行する Netty サーバーです。次に、Netty クライアントを使用してリクエストをプロキシし、ポスト フィルタ (アウトバウンド フィルタ) を実行した後に応答を返します。
#フィルターは、Zuul のビジネス ロジックの中核です。上の図に示すように、これらは非常に幅広い操作を実行でき、要求と応答のライフ サイクルのさまざまな部分で動作できます。
フィルタには 同期と非同期 の 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 サイトの他の関連記事を参照してください。