#ゲートウェイは何である
あなたが電気のサプライヤアプリケーション、モバイルAPPのフロントエンド、バックエンドのマイクロサービスのさまざまな操作を行うとします。その後、複数のサービスからの表示データにページを呼び出す必要があります。ゲートウェイが存在しない場合は、このようなシステムのルックスは、次のとおりです。
ゲートウェイと接続された場合や、お使いのシステムは次のようになります:
#Springゲートウェイクラウド
春クラウドゲートウェイは、新しいプロジェクト春の雲で、プロジェクトがなど春5.0、春ブーツ2.0プロジェクト炉、によって開発されたゲートウェイ技術に基づいていますそれは、シンプルで効果的な統一されたマイクロサービスアーキテクチャAPIのルーティング管理を提供することを目的とします。
スプリングクラウドエコシステムのゲートウェイとしてのスプリングクラウドゲートウェイは、目標は、だけでなく、統一されたルーティングを提供するNetflixのZuulを交換することで、そのようなものとして、ゲートウェイベースのアプローチのフィルタ・チェーンの基本的な機能を提供する:/指標を監視、セキュリティ、および電流制限。
#####関連する概念
- ルート(ルート):これは、ゲートウェイの基本的なビルディング・ブロックです。これは、ID、ターゲットURI、アサーションのセットとフィルターのセットによって定義されます。アサーションがtrueの場合、ルートは一致します。
- 述語(アサーション):これは、述語のJavaの8です。入力タイプはServerWebExchangeです。私たちは、このようなヘッダやパラメータとして、HTTPリクエストからコンテンツのいずれかに一致するようにそれを使用することができます。
- フィルター(フィルター):これはorg.springframework.cloud.gateway.filter.GatewayFilterは、我々は要求と応答を変更するためにそれを使用することができます例です。
#####ワークフロー
(PS:多くのリクエスト処理のSpringMVCのように、はい、この絵は非常に精通していない参照)
-
请求发送到网关,DispatcherHandler是HTTP请求的中央分发器,接管请求并将请求匹配到相应的 HandlerMapping。
-
请求与处理器之间有一个映射关系,网关将会对请求进行路由,handler 此处会匹配到 RoutePredicateHandlerMapping,匹配请求对应的 Route。
-
随后到达网关的 web 处理器,该 WebHandler 代理了一系列网关过滤器和全局过滤器的实例,如对请求或者响应的 Header 处理(增加或者移除某个 Header)。
-
最后,转发到具体的代理服务。
简而言之:
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
快速开始
#####1.新建一个项目gatewayTest,在项目中添加3个moduleeureka,producer,gateway
项目结构
#####2.rureka
新建module
添加eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
完整pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.eureka</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gateway.test</groupId>
<artifactId>gatewayTest</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>..</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件
spring:
application:
name: eureka
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://localhost:8761/eureka/
启动类
package com.example.eureka.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
启动程序,访问http://localhost:8761/
现在还没有服务进行注册
#####3.producer
新建producer的module,同创建rureka,不同处如下图,其他都一样。
完整pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.producer</groupId>
<artifactId>producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>producer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gateway.test</groupId>
<artifactId>gatewayTest</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>..</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件
spring:
application:
name: producer
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
启动类
package com.example.producer.producer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
新建2个类控制器
HelloController
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("say")
public String say() {
return "Hello Every Buddy";
}
}
GoodByeController
@RestController
@RequestMapping("/goodbye")
public class GoodByeController {
@RequestMapping("say")
public String say() {
return "Bye Bye";
}
}
启动程序,访问http://localhost:8761/
##### 4.gateway
ユーレカと作成プロセス
の完全なポンポン
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.gateway</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gateway.test</groupId>
<artifactId>gatewayTest</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>..</relativePath> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
プロファイル
test:
uri: lb://producer
spring:
application:
name: gateway
# cloud:
# gateway:
# routes:
# - id: route_producer_hello
# uri: ${test.uri} # uri以lb://开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称
# predicates:
# - Path=/api-hello/**
# filters:
# - StripPrefix=1 # 表示在转发时去掉api
#
# - id: route_producer_goodbye
# uri: ${test.uri}
# predicates:
# - Path=/api-goodbye/**
# filters:
# - StripPrefix=1
# - name: Hystrix
# args:
# name: myfallbackcmd
# fallbackUri: forward:/user/fallback
server:
port: 8080
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
enabled: true # 是否启用注册服务 默认为true, false是不启用
instance:
prefer-ip-address: true
スタートアップクラス
package com.example.gateway.gateway;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class GatewayApplication {
@Value("${test.uri}")
private String uri;
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
return builder.routes()
.route(r ->r.path("/hello/**").uri(uri))
.route(r ->r.path("/goodbye/**").uri(uri)).build();
}
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
// localhostを:8761 /プログラム、訪問HTTP起動します
。##### 5つのテスト
サービスがreurekaに登録されている、我々はこんにちは定義に転送される要求の先頭にさよならlb://producer
サービス、我々はゲートウェイのポートは8080で定義され、プロデューサーをポートは8081です
直接请求producer服务
// localhostを:8081 /こんにちは/言うHTTP
HTTP:// localhostを:8081 /さようなら/回答
通过网关请求
http:// localhost:8080 /こんにちは/言う
にhttp:// localhost:8080 /さようなら/回答
自分自身のバランスをとる###ゲートウェイロード
並行ボリュームアップ、およびゲートウェイのクマの場合には、唯一のマイクロサービスゲートウェイをがあるすべてのことは、どのように行うには?
春クラウドゲートウェイは、それ自体が比較的大きい同時に耐えることができるようになります根本ネッティー、です。まだ同時実行を買う余裕ができない場合は、それが複数のゲートウェイインスタンスを登録することができ、およびロードバランサの前のようにnginxのF5または取得します。おそらく、このような図: