構成とプロジェクトコード全体については、giteeにアクセスしてhttps://gitee.com/xwb1056481167/spring-cloud/を表示してください。
サービスゲートウェイ
Spring Cloudに統合されたZuulバージョンはTomcatコンテナを使用します。従来のサーブレットIO処理
サーブレットはサーブレットコンテナのライフサイクル管理です。
サーブレットオブジェクトはコンテナの起動時に構築され、サーブレットinit()が呼び出されて
コンテナが初期化さ れます。各リクエストはスレッドを割り当て(通常はスレッドプールからアイドルスレッドを取得します)、service()を呼び出します。
コンゲイナが閉じられたら、サーブレットdestroy()を呼び出してサーブレットを破棄します。
ズール(netflix会社)
バージョン2.0はまだ出ていません(コアタレントは辞め、他の人は彼らの目標が統一されていないと主張しています)
GateWay(春の会社)
公式ドキュメント:https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories
公式アーキテクチャ図
説明
クライアントはSpringCloudGatewayにリクエストを送信します。ゲートウェイハンドラーマッピングにより、要求がルートと一致すると判断された場合、その要求はゲートウェイWebハンドラーに送信されます。
ハンドラーは、要求固有のフィルターのチェーンを介して要求を実行します。フィルタが点線で区切られている理由は、プロキシ要求が送信される前後にフィルタがロジックを実行できるためです。
すべての「事前」フィルターロジックが実行されます。次に、プロキシリクエストを発行します。プロキシリクエストが発行された後、「ポスト」フィルタロジックが実行されます。
ゲートウェイルーティング転送+実行フィルターチェーンのコアロジック
Spring CloudGatewayには次の特徴があります
1、基于Spring Framework 5 ,Project Reactor和Spring Boot1.0进行构建 2、动态路由:能够匹配任何请求属性 3、可以对路由指定Predicate(断言)和Filter(过滤器) 4、集成Hystrix的断路器功能 5、集成Spring Cloud 服务发现功能 6、易于编写的Predicate(断言)和Filter(过滤器) 7、请求限流功能 8、支持路经重新
3つのコアコンセプト
1. Route
は、Wanguqianを構築するための基本モジュールであり、ID、ターゲットURI、一連のアサーション、およびフィルターで構成されます。アサーションがtrueの場合、ルートと一致します
。2。述語
はJava8のjava.util.functionを参照します。述語開発者は、HTTPリクエストのすべてのコンテンツ(リクエストヘッダーやリクエストパラメータなど)を照合し、リクエストがアサーション
3と一致する場合にルーティングできます。フィルタ
はSpringフレームワークを参照しますGatewayFilterのインスタンスは、フィルタを使用して、リクエストがルーティングされた後またはそれ以降のリクエスト
プロジェクトで使用する
ルーティングゲートウェイcloud-gateway-gateway9527を作成します
1、pom.xml
<dependencies>
<!-- gateway路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- eureka 服务发现 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.ゲートウェイapplication.yml
spring:
application:
name: cloud-gateway9527 #服务名
cloud:
gateway:
routes:
- id: payment_route #payment_route 路由的id,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #payment_route2 路由的id,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
3.テスト
7001、cloud-provider-payment8001(何も変更する必要はありません)、cloud-gateway-gateway9527を開始し、アドレスにアクセスします
http:// localhost:8001 / payment / get / 1后
概要:アクセス8001の前に保護レイヤーを追加するのと同じです。
2つのルーティング方法
構成
@Configuration
public class GateWayConfig {
/**
* 配置了一个Id为route-name的路由规则,方访问地址http://localhost:9527/guonei是会自动转发到地址http://news.baidu.com/guonei
*/
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("path_route_xwb", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
}
ただし、上記は推奨されません。構成はより面倒です。ymlを使用することをお勧めします。
1つは、gateWay動的ルーティング構成です。
server:
port: 9527
spring:
application:
name: cloud-gateway9527 #服务名
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_route #payment_route 路由的id,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
#cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能
uri: lb://cloud-payment-service #微服务提供服务的路由地址()
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_route2 #payment_route2 路由的id,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
説明
1.次の構成を有効にする必要がありますspring.cloud.gateway.discovery.locator.enable = trueサービス名によるルーティングを有効にします。2。uri
:lb:// cloud-payment-serviceサービス名、lbでサービスにアクセスします。 loadBalanceClient(https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#the-between-route-predicate-factory)です負荷分散機能
実際の表示効果:
2、述語をアサートします
合計:11の構成方法。
1、ルート述語ファクトリ後
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
2、ルート述語ファクトリの前
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
3、ルート述語ファクトリ間
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
4、Cookieルート述語ファクトリ
predicates:
- Cookie=chocolate, ch.p
5、ヘッダールート述語ファクトリ
predicates:
- Header=X-Request-Id, \\d+
6、ホストルート述語ファクトリ
predicates:
- Host=**.somehost.org,**.anotherhost.org
7、メソッドルート述語ファクトリ
predicates:
- Method=GET,POST
8、パスルート述語ファクトリ
predicates:
- Path=/red/{segment},/blue/{segment}
9、クエリルート述語ファクトリ
predicates:
- Query=green
10、RemoteAddrルート述語ファクトリ
predicates:
- RemoteAddr=192.168.1.1/24
11、ウェイトルート述語ファクトリ
predicates:
- Weight=group1, 2
例えば:
spring:
application:
name: cloud-gateway9527 #服务名
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_route #payment_route 路由的id,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
#cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能
uri: lb://cloud-payment-service #微服务提供服务的路由地址()
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- After=2020-12-06T16:05:15.580+08:00[Asia/Shanghai] #在当前访问时间之后有效
- Method=GET
- id: payment_route2 #payment_route2 路由的id,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
- Host=**.gateway9527.com #当匹配规则为此路径的时候允许访问
curl http:// localhost:9527 / Payment / lb -H "Host:gateway9527.com" "Host:gateway9527.com"のgateway9527.comが
ホストで構成されています。
3、フィルター
カスタムフィルター
9527プロジェクトにカスタムフィルターを追加する
/**
* Gateway的Filter过滤连
* 总的全局过滤器,档在所有微服务前面,进行校验
*/
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("*********************** come in MyLogGatewayFilter:" + new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null) {
log.info("************用户名为null,非法用户,(꒦_꒦) ");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
注:9527は、いわゆるマイクロサービスの前でブロックされます。(7001,8001,8002,9527)を要求するときは、アクセスアドレスhttp:// localhost:9527 / Payment / lb?uname = 234を介して前後に 更新します。通常のアクセス、unameが削除された場合、呼び出しは失敗します