リクエストルーティング
路由转发
ステップ 1: ゲートウェイ モジュールなどの新しい SpringBoot プロジェクトを作成し、ゲートウェイの依存関係と nacos サービス ディスカバリの依存関係を導入します。
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
ステップ 2: スタートアップ クラスをgateway模块
に記述します。
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
ステップ 3: 基本的な構成とルーティング ルールを作成する
路由名称(id)
: ルートの一意の表現。一意である必要があるのはユーザー定義のみです。路由目标地址(uri)
: 固定アドレスにルーティングすることも、サービスにルーティングして、負荷分散ルールに従ってサービス インスタンスを選択することもできます。路由断言(predicates)
:リクエストがルーティングルールの条件を満たすかどうかを判定し(複数設定可能)、条件を満たしていれば、一致したホストまたはインターフェースにリクエストを転送します。路由过滤器(filters)
: リクエストまたはレスポンスに対していくつかの処理操作を実行します。
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # 将网关服务注册到nacos
#server-addr: localhost:80 # 使用nginx反向代理功能
gateway:
routes: # 网关路由配置
- id: userservice
uri: lb://userservice # 配置userservice服务的路由规则
# uri: http://localhost:8081
predicates:
- Path=/user/** # 按照路径匹配,只要是以/user开头的请求路径就符合规则
- id: orderservice
uri: lb://orderservice # 配置orderservice服务的路由规则
predicates:
- Path=/order/** # 按照路径匹配,只要是以/order开头的请求路径就符合规则
ステップ 4: ゲートウェイ サービスを開始します。ゲートウェイは、指定されたルーティング ルールに従って、対応するサービス インスタンスにリクエストを転送します。このとき、将网关端口号后面的地址拼接到要转发地址的端口号后面
http://localhost:10010/user/1
にアクセスすると、ゲートウェイは にリクエストを転送します。http://userservice/user/1
http://localhost:10010/order/101
にアクセスすると、ゲートウェイは にリクエストを転送します。http://orderservice/order/101
{
"id": 1,
"username": "柳岩",
"address": "湖南省衡阳市"
}
{
"id": 101,
"price": 699900,
"name": "Apple 苹果 iPhone 12 ",
"num": 1,
"userId": 1,
"user": {
"id": 1,
"username": "柳岩",
"address": "湖南省衡阳市"
}
}
ゲートウェイのルーティング実装の基本プロセス
アサーションファクトリー
常见的断言规则
設定ファイルに記述したアサーション ルールは単なる文字列です。これらのアサーション ルールはPredicate Factory(断言工厂)
によって読み取られ、ルーティングの判定条件に変換されます。
SpringCloudGatewway は、11 の基本的なアサーション ファクトリを提供します。これらは、ユーザー定義のアサーション条件を読み取り、リクエストを判断するために使用されます >
Path表示按照路径匹配
、このルールはorg.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
によって処理されます。
- は、任意のマルチレイヤ パスと一致する
**
の使用をサポートします。{xx}
は、プレースホルダがパスの 1 つのレイヤと一致できることを示します。 - カンマで区切られた複数のパスルールの設定をサポート
predicates:
# 最终将请求地址拼接到转发地址的端口号后面
- Path=/red/{
segment},/blue/**
# 同时segment这个参数也可以通过网关过滤工厂拿到
Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);
String segment = uriVariables.get("segment");
After
これは、xx 時間後にルーティング ターゲット アドレスに転送できることを意味し、アクティビティ用の Web サイトをアップロードするために使用できます。
predicates:
- After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Before
xx 時間前にルーティング先アドレスに転送できることを示します。
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
Between
2 つの時点の間でルーティング ターゲット アドレスに転送できることを示します。
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie
リクエストをルーティング ターゲット アドレスに転送する前に、Cookie 内の対応するキーと値を使用してリクエストを構成する必要があることを示します。
predicates:
- Cookie=chocolate, ch.p
Header
は、リクエストがリクエスト ヘッダー X-Request-Id で構成されている必要があることを意味します。\d+
は、値が数値タイプであり、ルーティング ターゲット アドレスに転送できることを意味します上記の条件が満たされる場合
predicates:
- Header=X-Request-Id, \d+
Host
ルーティング ターゲット アドレスに転送するには、要求されたホストが指定された式と一致する必要があることを示します
predicates:
- Host=**.somehost.org,**.anotherhost.org
Method
リクエストをルーティング ターゲット アドレスに転送する前に、リクエストのリクエスト メソッドが GET または POST であることを示します。
predicates:
- Method=GET,POST
Query
は、リクエストに指定されたリクエスト パラメータの名前と値が含まれている必要があることを意味します。複数の値を設定し、カンマで区切ることができます。.
任意の文字との一致をサポート
predicates:
# key为Query,value为red或gree.或greet或greed等
- Query=red, gree.
RemoteAddr
要求された IP アドレスが指定された範囲内にある必要があることを示します。パラメータは配列であり、複数の構成を構成できます。パラメータの形式は次のとおりです。IP/子网掩码
predicates:
- RemoteAddr=192.168.1.1/24
Weight
複数のルーティング対象アドレスを 1 つのグループにまとめ、アドレスごとに異なる重みを設定することを示します。
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8 # 80%的请求会路由给https://weighthigh.org
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2 # 20%的请求会路由给https://weightlow.org