いわゆるゲートウェイとはどういう意味ですか?
コミュニティの警備員に相当します。コミュニティの生命と財産の健康を守るために、コミュニティに出入りするには警備員の同意が必要です。ゲートウェイも同様で、あらゆるリクエストを厳密に制御します。法的または許可されたリクエストをサーバーに送信します。
ゲートウェイの機能:
- 認証と認可の検証
- サービスルーティング、負荷分散
- スロットリングのリクエスト
一般的な共通ゲートウェイは次のとおりです。
ゲートウェイ: Spring5 で提供される WebFlux に基づいており、レスポンシブ プログラミングの実装に属し、パフォーマンスが向上しています。
zuul: サーブレットベースの実装。ブロッキング プログラミングに属します。
ゲートウェイサービスの構築
1. 新しいモジュールを作成し、SpringCloudGateway の依存関係と nacos のサービス検出依存関係を導入します。
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2. nacos アドレスであるルーティング設定を書き込みます。
server:
port: 10010
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
spring:
application:
name: gateway
cloud:
nacos:
server-addr: nacos:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
要約:
ゲートウェイを構築する手順:
1. プロジェクトを作成し、nacos サービス検出とゲートウェイの依存関係を導入します。
2. 基本的なサービス情報、nacos アドレス、ルーティングを含む application.yml を設定します。
ルーティング設定には次のものが含まれます。
1. 理由 ID: ルートの一意の識別子
2. ルーティング宛先: ルーティングの宛先アドレス。http は固定アドレスを表し、lb はサービス名に基づく負荷分散を表します。
3 ルーティングアサーション:ルーティングの判定ルール
4. ルート フィルター: リクエストまたはレスポンスを処理します。
ルート述語ファクトリー
ゲートウェイルーティングで設定できる内容は次のとおりです。
- ルート ID: ルートの一意の識別子
- uri: ルーティング先、lb と http の両方をサポート
- predicates: ルーティング アサーション。リクエストが要件を満たしているかどうかを判断し、リクエストを満たしていればルーティング先に転送します。
設定ファイル内のルールは単なる文字列です。この文字列はPredicate Factoryで読み取られて処理され、ルーティングの判定条件に変換されます。例えば、「Path=/user/**」はパスに応じて一致し、「Path=/user/**」のみが一致します。 /user で始まるものは許可されます。
- フィルタ: ルートフィルタ、リクエストまたはレスポンスの処理
11種類の工場:
ルートフィルター GatewayFilter
GatewayFilter はゲートウェイに提供されるフィルターで、ゲートウェイに入るリクエストとマイクロサービスから返されるレスポンスを処理できます。
Spring が提供するいくつかの異なるルート フィルター ファクトリを次に示します。
ここで、A サービスに入るすべてのリクエストにリクエスト ヘッダーを追加する必要があります。どのように実装しますか?
リクエスト ヘッダーをサービスに個別に追加します。
spring:
cloud:
gateway:
routes:#网关路由配置
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
filters: #过滤器
- AddRequestHeader=Truth,Itcast is freaking awesome!#添加请求头
すべてのルートに対して有効にしたい場合は、次のようにデフォルトでフィルター ファクトリを作成できます。
spring:
application:
name: gateway
cloud:
nacos:
server-addr: nacos:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userservice # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters:#对所有的路由都生效的过滤器
- AddRequestHeader=Truth,Itcast is freaking awesome!
グローバルフィルター
グローバル フィルターの役割は、すべてのゲートウェイ リクエストとマイクロサービスの応答を処理することです。GatewayFilter の役割と同じです。違いは、GatewayFilter は構成によって定義され、処理ロジックが固定されているのに対し、GlobalFilter のロジックは固定であることです。自分でコードを書いて実装する必要がありますが、その定義は GlobalFilter インターフェイスを実装することです。
//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();
// 2.获取参数中的 authorization 参数
String auth = params.getFirst("authorization");
// 3.判断参数值是否等于 admin
if ("admin".equals(auth)) {
// 4.是,放行
return chain.filter(exchange);
}
// 5.否,拦截
// 5.1.设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 5.2.拦截请求
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
ステップ:
1. GlobalFilter インターフェイスを実装する
2. @Order アノテーションを追加するか、Ordered インターフェースを実装します。
3. 処理ロジックの書き込み
フィルターの実行順序
- 各フィルターには int 型の順序値を指定する必要があります。順序値が小さいほど優先順位が高く、実行順序も高くなります。
- GlobalFilter は、Ordered インターフェイスを実装するか、@Order アノテーションを追加することによって順序値を指定します。
- ルーティングフィルターとdefaultFilterの順序はSpringで指定されており、デフォルトは宣言順序に従って1から増加します。
- フィルタの順序値が同じ場合、defaultFilter>ローカルルーティングフィルタ>GlobalFilterの順に実行されます。
クロスドメインの問題
クロスドメインの問題: 一貫性のないドメイン名はクロスドメインです。ブラウザーは、リクエストの開始者がサーバーに対してクロスドメイン Ajax リクエストを行うことを禁止し、リクエストはブラウザーによってインターセプトされます。
コルス:
spring:
application:
name: gateway
cloud:
nacos:
server-addr: nacos:8848 # nacos地址
gateway:
globalcors: #全年的跨域处理
add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
corsconfigurations:
'[/**]':
allowedOrigins: #允许哪些网站的跨域请求
-"http://127.0.0.1:8090"
allowedMethods: #允许的跨域ajax的请求方式
-"GET"
-"POST"
-"DELETE"
-"PUT"
-"OPTIONS"
allowedHeaders: "*" #允许在请求中携带的头信息
allowCredentials: true #是否允许携带cookie
maxAge: 360000 #这次跨域检测的有效期