[クラウドネイティブとマイクロサービス>SCGゲートウェイ第9章]リクエストの負荷を実現するためにNacosを統合するSpringCloudGatewayの詳細なケース

I.はじめに

これまでに、マイクロサービスゲートウェイシリーズの記事が公開されています。

  1. [クラウドネイティブとマイクロサービス>SCGゲートウェイパート1]ゲートウェイがある理由と本番環境でゲートウェイを選択する方法
  2. クラウドネイティブとマイクロサービス>SCGゲートウェイパート2]本番環境でのこれらのグレースケールリリース方法
  3. [クラウドネイティブとマイクロサービス>SCGゲートウェイパート3]SpringCloudGatewayとは何ですか?詳細なユースケース
  4. クラウドネイティブとマイクロサービス>SCGゲートウェイパート4]SpringCloudGatewayで11の組み込みPredicateFactoryを使用する方法
  5. [クラウドネイティブとマイクロサービス>SCGゲートウェイパート5]SpringCloudGatewayカスタムPredicateFactory
  6. [クラウドネイティブとマイクロサービス>SCGゲートウェイ第6章]SpringCloudGatewayに組み込まれた18のフィルター使用姿勢
  7. [クラウドネイティブとマイクロサービス>SCGゲートウェイ第7章]SpringCloud Gatewayは、組み込みのフィルターに基づいて、現在の制限、融合、および再試行を実装します
  8. [クラウドネイティブとマイクロサービス>SCGゲートウェイ第8章]SpringCloudGatewayフィルターとGlobalFilterをカスタマイズする3つの方法

次の問題について話し合いました。

  1. なぜゲートウェイがあるのですか?ゲートウェイの役割は何ですか?
  2. ゲートウェイの分類?
  3. ゲートウェイテクノロジーの選択?
  4. ゲートウェイを使用するときに一般的に使用されるグレースケール公開方法は何ですか?
  5. Spring Cloud Gatewayとは何ですか?詳細なユースケース?
  6. SpringCloudGatewayに組み込まれた11種類のPredicateFactory
  7. PredicateFactoryをカスタマイズする方法は?
  8. SpringCloudGatewayに組み込まれている18の一般的に使用されるフィルター
  9. Spring Cloud Gatewayは、組み込みのフィルターに基づいて、現在の制限、融合、および再試行を実装します
  10. SpringCloudGatewayでFilterとGlobalFilterをカスタマイズする3つの方法

この記事では、SpringCloudGatewayとNacosサービスレジストリの統合ケースについて説明します。

PS:SpringCloudのバージョン情報:

<properties>
    <spring-boot.version>2.4.2</spring-boot.version>
    <spring-cloud.version>2020.0.1</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud alibaba-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.ゲートウェイ、Nacos統合の場合

プロジェクトディレクトリ全体には、nacos-gatewayとnacos-provider-serviceの2つのモジュールが含まれています。
ここに画像の説明を挿入

その中で、nacos-gatewayはルーティングゲートウェイとして使用され、nacos-provider-serviceは共通のマイクロサービスとしてGatewayに統合されています。

0.最上位の親プロジェクトspring-cloud-alibaba-center

プロジェクト全体のMaven依存関係管理に使用されるspring-cloud-alibaba-centerプロジェクトでは、1つとpomのみが予約されています。

1)pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-cloud-alibaba-center</artifactId>
    <groupId>com.saint</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-center</name>
    <packaging>pom</packaging>

    <modules>
        <module>gateway-center</module>
        <module>simple-service</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.2</spring-boot.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1.共通サービスnacos-provider-service

nacos-provider-serviceプロジェクトの全体的なコード構造ディレクトリは次のとおりです。
ここに画像の説明を挿入

pom.xmlファイル、application.yml構成ファイル、スタートアップクラス、およびコントローラーが含まれています。

1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>spring-cloud-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

</project>

2、application.yml

サービスのポートとプログラム名を設定し、サービスレジストリNacosにサービスを登録します。

server:
  port: 10001

spring:
  application:
    name: gateway-nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3.クラスNacosProviderApplicationを開始します

package com.saint.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosProviderApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

4、HelloController

package com.saint.nacos.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Saint
 */
@RestController
@RequestMapping("hello")
public class HelloController {
    
    

    @GetMapping("/sayHello")
    public String say() {
    
    
        System.out.println("[simple-service]:say Hello!");
        return "[simple-service]:say Hello!";
    }
}

5.nacos-provider-serviceを開始します

起動が成功すると、コンソールの出力は次のようになります。
ここに画像の説明を挿入

6.nacos-provider-service-10002を開始します

入力しEdit Configurations、コピーNacosProviderApplicationして名前を付けNacosProviderApplication-10002、プログラム引数に設定して--server.port=10002
ここに画像の説明を挿入
NacosProviderApplication-10002を起動すると、コンソールログの出力は次のようになります。

ここに画像の説明を挿入

7.NacosDashBoardに入ります

現時点でのサービス登録情報は次のとおりです。gateway-nacos-providerサービスの2つのインスタンス。
ここに画像の説明を挿入

2.nacos-gatewayを構築します

nacos-gatewayの全体的なコード構造ディレクトリは次のとおりです。
ここに画像の説明を挿入

これには、pom.xmlファイル、application.yml構成ファイル、およびスタートアップクラスが含まれています。

1、pom.xml

pomファイルには注意が必要な2つのポイントがあります。

  1. GatewayはReactiveを使用するため、spring-boot-starter-web依存関係を適用することはできません。
  2. spring-cloud-loadbalancerサービスには複数のインスタンスがあるため、負荷分散のために導入する必要があります。
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>spring-cloud-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

</project>

2、application.yml

server:
  port: 9999

spring:
  application:
    name: nacos-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能
          enabled: true
          # 是否使用service-id的小写,默认是大写
          lower-case-service-id: true
      routes:
        - id: gateway-nacos-service-route
          # 其中配置的lb://表示从注册中心获取服务,后面的gateway-nacos-provider表示目标服务在注册中心上的服务名
          uri: lb://gateway-nacos-provider
          predicates:
            - Path=/nacos/**
          filters:
            # 路由转发请求时,移除一层路径
            - StripPrefix=1

3.クラスNacosGatewayApplicationを開始します

package com.saint.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosGatewayApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosGatewayApplication.class, args);
    }
}

4.gnacos-gatewayを開始します

起動が成功すると、コンソールの出力は次のようになります。
ここに画像の説明を挿入

Gatewayが外部にサービスを提供するNettyServerのポート番号は、カスタム9999であることがわかります。

5、ナコスダッシュボード

現時点でのサービス登録情報は次のとおりです。gateway-nacos-providerサービスの2つのインスタンスとnacos-gatewayサービスの1つのインスタンス。
ここに画像の説明を挿入

3.ルーティング/負荷分散効果の検証

上記の手順では、nacos-provider-serviceとnacos-gatewayを順番に開始しました。

ゲートウェイ経由でnacos-provider-serviceにアクセスします(4回の訪問):

ここに画像の説明を挿入

負荷分散効果

1>まず、NacosProviderApplicationコンソールの出力を確認します。
ここに画像の説明を挿入

2> NacosProviderApplication-10002コンソールの出力を最初に確認します
ここに画像の説明を挿入
。2つのサービスインスタンスのコンソール出力と組み合わせて、Nacosに登録されたサービスインスタンスにゲートウェイを介してアクセスし、負荷分散を実現します。

4.まとめ

NacosのSpringCloudGateway統合は、Spring Cloudエコシステムの主流の統合ソリューションであり、全体的なケースは依然として非常に単純です。

フォローアップのブログ投稿では、Spring Cloud Gatewayにアクチュエータを統合してサービスステータスを追跡し、zipkinを統合してサービスコールリンク情報を追跡する方法について引き続き説明します。

おすすめ

転載: blog.csdn.net/Saintmm/article/details/125832522