ゲートウェイの概要
ゲートウェイはSpringCloudのゲートウェイコンポーネントです。SpringCloudGatewayは、APIにルーティングするためのシンプルで効率的な方法を提供することを目的としています。Spring Cloudはバージョン1.xではZuulゲートウェイを使用しますが、バージョン2.xではZuulの代わりにゲートウェイを使用します。Zuulはサーブレットベースの実装であり、ブロッキングプログラミングに属しています。SpringCloudGatewayは、Spring5で提供されるWebFluxに基づいています。これは、リアクティブプログラミングの実装に属し、パフォーマンスが向上しています。
ゲートウェイの機能
- ユーザーリクエストの認証と権限の検証
- ユーザーリクエストをマイクロサービスにルーティングし、負荷分散を実装します
- ユーザーリクエストを制限する
ゲートウェイの構築
1.SpringBootプロジェクトを作成します
2.ゲートウェイとnacosの依存関係をインポートします
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
3.ルーティング構成とnacosアドレスを書き込みます
server:
port: 10010 #网关端口
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
gateway:
routes: #网关路由配置
- id: user-service #路由id,保证唯一
uri: lb://userservice #路由的目标地址,lb就是负载均衡,后面跟服务名称
predicates: #路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合要求
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
4.開始
5.テスト
ルートアサーションファクトリー
ゲートウェイ構成ファイルの述語に入力されたルーティングアサーションは、述語ファクトリによって読み取られて処理され、ルーティング判断の条件に変換されます。Spring Cloudは、12のアサーションファクトリを提供します
各アサーションファクトリの公式ドキュメントに例が記載されています
名前 | 説明する | 例 |
---|---|---|
後 | ある時点以降のリクエストです | -After = 2037-01-20T17:42:47.789-07:00[アメリカ/デンバー] |
前 | ある時点より前のリクエストです | --Before = 2031-04-13T15:14:47.433 + 08:00[アジア/上海] |
間 | ある時点より前のリクエストです | --Between = 2037-01-20T17:42:47.789-07:00 [アメリカ/デンバー]、2037-01-21T17:42:47.789-07:00[アメリカ/デンバー] |
クッキー | リクエストには特定のCookieが含まれている必要があります | -Cookie = chocolate、ch.p |
ヘッダ | リクエストには特定のヘッダーが含まれている必要があります | --Header = X-Request-Id、\ d + |
亭主 | リクエストは特定のホスト(ドメイン名)にアクセスする必要があります | -Host = **。somehost.org、**。anotherhost.org |
方法 | リクエストメソッドは指定されたメソッドである必要があります | -メソッド=GET、POST |
道 | リクエストパスは、指定されたルールに準拠している必要があります | -パス=/赤/{セグメント}、/青/ ** |
クエリ | リクエストパラメータには、指定されたパラメータが含まれている必要があります | --Query = name、Jackまたは--Query = name |
RemoteAddr | リクエスターのIPは指定された範囲内にある必要があります | -RemoteAddr = 192.168.1.1 / 24 |
重さ | 重量処理 | -重み=グループ1、2 |
ルートフィルター
GatewayFilterは、ゲートウェイに提供されるフィルターであり、ゲートウェイに入る要求とマイクロサービスから返される応答を処理できます。Springは
31の異なるルートフィルターファクトリ(ドキュメントアドレス)を提供します。
spring:
cloud:
gateway:
routes:
- id: lb://userservice
uri: https://example.org
predicates:
- Path=/user/**
filters: #过滤器(与id同级)
- AddRequestHeader=X-Request-red, blue#添加请求头
すべてのルートで有効にする場合は、デフォルトでフィルターファクトリを作成できます
spring:
cloud:
gateway:
routes:
#路由1
#路由2
#...
default-filters: #与routes同级
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
グローバルフィルター
グローバルフィルターの役割は、GatewayFilterと同様に、ゲートウェイに入るすべての要求とマイクロサービス応答を処理することです。違いは、GatewayFilterが構成によって定義され、処理ロジックが固定されていることです。GlobalFilterのロジックは、独自のコードを記述して実装する必要があります。これは、GlobalFilterインターフェースを実装することによって定義されます。
【場合】
グローバル・フィルターを定義し、要求をインターセプトし、要求のパラメーターが以下の条件を満たすかどうかを判別します
。1.パラメーターに許可がある
かどうか、2。許可パラメーターの値がadminであるかどうか。両方が満たされている場合は解放し、そうでない場合は傍受します
//指定Order值得第一种方式使用注解
//指定Order值得第二种方式实现Ordered接口重写getOrder方法
//@Order(-1)//值越小优先执行
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
/**
* @param exchange:请求上下文,里面可以获取Request、Response等信息
* @param chain:用来把请求委托给下一个过滤器
* @return {@code Mono<Void>} 返回标示当前过滤器业务结束
*/
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
//获取参数中的authorization参数
String auth = queryParams.getFirst("authorization");
//校验参数值是否等于admin
if ("admin".equals(auth)){
//是,放行
return chain.filter(exchange);
}
//否,拦截
//设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401未登录
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
テスト
フィルタの実行順序
- 各フィルターは、int型の順序値を指定する必要があります。順序値が小さいほど、優先度が高くなり、実行順序が高くなります。
- GlobalFilterは、Orderedインターフェースを実装するか、@ Orderアノテーションを追加することにより、注文値を指定します
- ルートフィルターとdefaultFilterの順序はSpringによって指定され、デフォルトは宣言の順序に従って1から増加します。
- フィルタの順序値が同じである場合、defaultFilter> RouteFilter>GlobalFilterの順序で実行されます。
クロスドメインの問題の処理
クロスドメインの問題:ブラウザーは、サーバーとのクロスドメインからの要求の発信者を禁止しますajaxリクエスト、リクエストはブラウザによってブロックされます
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期