ソフトウェアアーキテクチャ-springcloud-zuulマイクロサービスゲートウェイ(下記)

成熟したアーキテクチャにはライフサイクルがあり、ズールも同様です。一緒に調べてみましょう。

(1)ズールリクエストのライフサイクル

  • 処理する
  1. クライアントHTTPはリクエストを送信します。
  2. Spring Frameworkは、多くの場合、インターセプター、フィルター、およびzuulも使用して、マイクロサービスをカスタマイズします。
  3. プレフィルター「プリフィッター」と「ルーティングフィッター」を介してバックエンドマイクロサービスにアクセスし、「ポストフィッター」がクライアントに返されます

(2)ズールフィルターの使用と詳細な説明

フィルタ(filter)はzuulのコアコンポーネントであり、zuulの機能のほとんどはフィルタを介して実装されます。リクエストの一般的なライフサイクルに対応する、zuulで定義された4つの標準フィルタータイプがあります。

  • PRE

このフィルターは、要求がルーティングされる前に呼び出されます。このフィルターを使用して、認証の実装、クラスター内の要求されたマイクロサービスの選択、デバッグ情報のログ記録などを行うことができます。

  • ルーティング

このフィルターは、リクエストをマイクロサービスにルーティングします。このフィルターは、マイクロサービスへのリクエストを構造化し、ApacheHttpCIientまたはNetfilxリボンを使用してマイクロサービスをリクエストするために使用されます。

  • 役職

このフィルターは、マイクロサービスにルーティングした後に実行されます。このようなフィルターを使用して、標準のHTTPヘッダーを応答に追加したり、統計とメトリックを収集したり、マイクロサービスからクライアントに応答を送信したりできます。

  • エラー

このフィルターは、他のステージでエラーが発生したときに実行されます。

  • ソースコード

08-ms-gateway-zuul-filterコードからわかるように、カスタムzuulFilterは次のメソッドを実装する必要があります。

  • filterType

フィルタのタイプを返します。上記のフィルターに対応するpre、route、post、errorなどのいくつかの値があります。詳細については、com.netflix.zuul.ZuulFilter.filterType()のコメントを参照してください。

  • filter0rder

フィルタが実行される順序を指定するint値を返します。異なるフィルタは、同じ番号を返すことができます。

  • shouldFilter

フィルタを実行するかどうかを決定するブール値を返します。実行する場合はtrue、実行しない場合はfalseを返します。

  • 走る

过滤器的具体逻辑。本例中让它打印了请求的 HTTP方法以及请求的地址。

  • 代码示例

1.08-ms-provider-user

2.08-ms-gateway-zuul-filter 3.08-ms-eureka-server 4.08-ms-consumer-order-ribbon

直接源码运行就可以了,上几次文章都演示了,这次不演示了。直接main方法运行起来就可以了。

运行项目访问地址:http://localhost:8040/microservice-provider-user/getIpAndPort 可以看到zuul服务的后台正常打印了run方法里的日志。

  • 禁用zuul过滤器

Spring Cloud默认为Zuul编写并启用了一些过滤器,例如DebugFilter、

FormBodyWrapperFilter等,这些过滤器都存放在spring-cloud-netflix-core这个jar包里,一些场景下,想要禁用掉部分过滤器,该怎么办呢?

只需在application.yml里设置

zuul...disable=true

例如,要禁用上面我们写的过滤器,这样配置就行了:
zuul.PreRequestLogFilter.pre.disable=true
复制代码

  • zuul的容错与回退

老铁!如果zuul代理的后端微服务挂了会出现什么情况?zuul默认已经整合了hystrix,也就是zuul也是可以利用hystrix做降级容错处理的,但是zuul监控的粒度是微服务级别,而不是某个API。

源码:08-ms-gateway-zuul-fallback 编写zuul的降级回退类如下

启动项目 1.08-ms-gateway-zuul-fallback

2.08-ms-eureka-server 3.08-ms-consumer-order-ribbon 注意:这里不启动记住不启动 08-ms-provider-user

关闭zuul代理的用户微服务,再运行本项目,访问地址:http://localhost:8040/microservice-provider-user/getIpAndPort,将会返回如下内容

(三)zuul的高可用

分两种场景讨论zuul的高可用

  • zuul客户端也注册到了Eureka Server上

这种情况下,Zuul的高可用非常简单,只需将多个Zuul节点注册到Eureka Server上,就可实现Zuul的高可用。此时,Zuul的高可用与其他微服务的高可用没什么区别。

当zuul客户端也注册到Eureka Server上时,只需部署多个Zuul节点即可实现其高可用。zuul客户端会自动从Eureka Server中查询zuul Server的列表,并使用Ribbon负载均衡地请求Zuul集群。

  • zuul客户端未注册到Eureka Server上

现实中,这种场景往往更常见,例如,zuul客户端是一个手机APP——我们不可能让所有的手机终端都注册到Eureka Server上。这种情况下,我们可借助一个额外的负载均衡器来实现Zuul的高可用,例如Nginx、HAProxy、F5等。

zuul客户端将请求发送到负载均衡器,负载均衡器将请求转发到其代理的其中一个zuul节点。这样,就可以实现Zuul的高可用。

PS:zuul 作为网关这么重要的角色,高可用是非常有必要的。但是通常来说网关所面对的请求应该的是来于外部,所以虽然说网关可以注册到Eureka Server上,但是外部的客户端数量众多,是不可能向Eureka Server注册的。那么要实现高可用的,要么在网关前面再架一个前置代理(如Nginx)。

おすすめ

転載: juejin.im/post/7087757104789848071