7-ゲートウェイズールのスプリングクラウドロード
1 はじめに
- この記事は前回の記事の続きであるため、一部のクラスタやサービスについては紹介していません。たとえば、Eureka クラスタは前回の記事をベースにまだ起動しています。前回の記事の紹介は次のとおりです。
2.ズールについて
2.1 ズールの基本原則
-
Gateway (Zuul) - 重要なコアはフィルターです (実際にはこの文で十分です)
これらのフィルターは次の機能を実行します。
- 認証とセキュリティ: 各リソースの認証要件を特定し、要件を満たさないリクエストを拒否します。
- 監査と監視: エッジで意味のあるデータと統計を追跡し、生産状況を正確に把握します。
- 動的ルーティング: リクエストを異なるバックエンド クラスターに動的にルーティングします。
- ストレス テスト: パフォーマンスを理解するために、実行クラスターへのトラフィックを徐々に増やします。
- 負荷分散: 各負荷タイプに対応する容量を割り当て、制限を超えるリクエストを破棄します。
- 静的応答の処理: 部分応答は、内部クラスターへの転送を回避するために、エッジ ロケーションで直接構築されます。
- マルチリージョンの弾力性: AWS リージョン間のリクエストルーティング。ELB (Elastic Load Balancing) の使用を多様化し、システムのエッジをシステムのユーザーに近づけることを目的としています。
- リクエスト ルーティング機能を実装した後、クライアントは統合 API ゲートウェイの入り口を介して、マイクロサービス アプリケーションによって提供されるインターフェイスにアクセスできるようになります。ただし、各クライアント ユーザーがサーバー アプリケーションに提供されているインターフェイスを要求する場合、そのアクセス権には特定の制限があることが多く、システムはすべてのマイクロサービス インターフェイスをユーザーに公開しません。
- サービスのルーティングが完了した後も、クライアントがアクセスすべきリソースのみにアクセスしないように、サービスを外部に公開するためのセキュリティ対策が必要です。したがって、Zuul のフィルターを使用して外部サービスのセキュリティ制御を実装する必要があります。
-
サービス ゲートウェイでフィルターを定義するには、ZuulFilter 抽象クラスを継承し、リクエストをインターセプトしてフィルター処理するために定義されている 4 つの抽象関数を実装するだけです。
-
詳細については、次の記事を参照してください:
マイクロサービス: ゲートウェイ (zuul) - 基本原則、構成、認証、IP 制限、および電流制限。
2.2 ズールを使用する理由
- 次の記事
「 Getting Started with Zuul (Full Version) 」を参照してください。
3. ズールを構築する
3.1 プロジェクトの構造
- 次のように:
3.2 基本構成
3.2.1 pom ファイル
-
次のように:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>dog-cloud-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>dog-gateway-zuul-8090</artifactId> <packaging>jar</packaging> <name>dog-gateway-zuul-8090</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.liu.susu</groupId> <artifactId>dog-api</artifactId> <version>${project.version}</version> </dependency> <!--zuul相关的--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--actuator监控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--容错hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <!--下面这几个,版本同${spring-boot.version}--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </project>
3.2.2 ymlファイル
-
次のように:
server: port: 8090 # #网关的端口号 spring: application: name: dog-gateway-zuul # #网关在注册中心的唯一名称 eureka: client: # 客户端注册进eureka服务列表内 register-with-eureka: true # false表示不向注册中心注册自己 service-url: defaultZone: http://62.234.14.112:2886/eureka/,http://58.87.88.142:2886/eureka,http://154.8.150.175:2886/eureka/ instance: instance-id: dog-gateway-zuul-8090 # prefer-ip-address: true
3.3.3 スタートアップクラス
-
次のように:
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy
3.3 効果を確認するためのテスト
3.3.1 デモンストレーション
- まず、Eureka クラスターとサービス プロバイダーを起動し、次に zuul を起動します。Eureka クラスターとサービス プロバイダーはサーバー上で停止していないため、次のようにローカルの zuul を直接起動します。
- 次に、次のように、サービス プロバイダーに直接アクセスできることを確認します。
- 次に、zuul経由でアクセスします。Zuulには負荷分散機能も搭載されています、次のように:
// http://zuul_host:zuul_port/微服务在Eureka 注册中心上的服务提供者(对应的application.name)/接口映射地址 // 本地的话,如下3种访问均可 http://localhost:8090/dog-provider/dog/getDogByNum/1 http://127.0.0.1:8090/dog-provider/dog/getDogByNum/1 http://192.168.1.101:8090/dog-provider/dog/getDogByNum/1
3.3.1 アーキテクチャ図
- 以下のような単純なアーキテクチャ
4.zuulルーティングアクセスマッピングルール
4.1 サービスプロバイダーのサービス名のマッピング
-
構成は次のとおりです。
zuul: routes: zuulDog.serviceId: dog-provider # dog-provider 是服务提供者的服务名 zuulDog.path: /myDog/** # ignored-services: dog-provider #禁止通过此服务名访问,即 http://localhost:8090/dog-provider/dog/getDogByNum/1 不再可访问 ignored-services: "*" # 忽略多个微服务的情况
-
アクセス効果は以下の通りです。
// http://localhost:8090/dog-provider/dog/getDogByNum/1 没映射前的访问,暴漏了服务提供者名 http://localhost:8090/myDog/dog/getDogByNum/1 //myDog 随便映射
4.2 アクセスプレフィックス
- 次のように:
zuul:
routes:
zuulDog.serviceId: dog-provider # dog-provider 是服务提供者的服务名
zuulDog.path: /myDog/**
# ignored-services: dog-provider #禁止通过此服务名访问,即 http://localhost:8090/dog-provider/dog/getDogByNum/1 不再可访问
ignored-services: "*" # 忽略多个微服务的情况
prefix: /susu # 加前缀