記事ディレクトリ
I.はじめに
これまでに、マイクロサービスゲートウェイシリーズの記事が公開されています。
- [クラウドネイティブとマイクロサービス>SCGゲートウェイパート1]ゲートウェイがある理由と本番環境でゲートウェイを選択する方法
- クラウドネイティブとマイクロサービス>SCGゲートウェイパート2]本番環境でのこれらのグレースケールリリース方法
- [クラウドネイティブとマイクロサービス>SCGゲートウェイパート3]SpringCloudGatewayとは何ですか?詳細なユースケース
- クラウドネイティブとマイクロサービス>SCGゲートウェイパート4]SpringCloudGatewayで11の組み込みPredicateFactoryを使用する方法
- [クラウドネイティブとマイクロサービス>SCGゲートウェイパート5]SpringCloudGatewayカスタムPredicateFactory
- [クラウドネイティブとマイクロサービス>SCGゲートウェイ第6章]SpringCloudGatewayに組み込まれた18のフィルター使用姿勢
- [クラウドネイティブとマイクロサービス>SCGゲートウェイ第7章]SpringCloud Gatewayは、組み込みのフィルターに基づいて、現在の制限、融合、および再試行を実装します
- [クラウドネイティブとマイクロサービス>SCGゲートウェイ第8章]SpringCloudGatewayフィルターとGlobalFilterをカスタマイズする3つの方法
次の問題について話し合いました。
- なぜゲートウェイがあるのですか?ゲートウェイの役割は何ですか?
- ゲートウェイの分類?
- ゲートウェイテクノロジーの選択?
- ゲートウェイを使用するときに一般的に使用されるグレースケール公開方法は何ですか?
- Spring Cloud Gatewayとは何ですか?詳細なユースケース?
- SpringCloudGatewayに組み込まれた11種類のPredicateFactory
- PredicateFactoryをカスタマイズする方法は?
- SpringCloudGatewayに組み込まれている18の一般的に使用されるフィルター
- Spring Cloud Gatewayは、組み込みのフィルターに基づいて、現在の制限、融合、および再試行を実装します
- 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つのポイントがあります。
- GatewayはReactiveを使用するため、
spring-boot-starter-web
依存関係を適用することはできません。 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を統合してサービスコールリンク情報を追跡する方法について引き続き説明します。