ゲートウェイのコンセプト
サービスA、Bは、外部の直接呼び出しのために露出され、
時には、このようなユーザーがログインしているかどうかをテストするなど、フィルタの要求、検証、の必要性が、あなたが露出し、各サービスに書くことができますが、複数のサービスで同じコードを書くために、あまりにも面倒、上、前方に置くことができますゲートウェイ。
Aの使用を決定するために必要なバランシングAの場合、Bのクラスタリング、ロード| Bどのノード処理するには、転送(負荷分散)をルーティングするためのゲートウェイを使用することができます。
上記に対応するゲートウェイ・サービス・レベル、サービスの入り口、要求は、ルーティングを達成することができ、濾過、チェックで統一することができます。
(C、D)をバランス内部サービス負荷を達成リボン、ゲートウェイは、負荷分散およびサービス(A、B)を達成露出しました。
アクセスする外部サービスA、Bが、アクセスゲートウェイに直接アクセスしないゲートウェイを介してA、B全く。
B固定ノード(なぜならサービスのみつのノード)スタティックルーティングとして知られる、静的、静的、| A、Bではないクラスタを行う場合、各ゲートウェイはAに転送されます。
A、Bクラスタ場合、これはAに転送されてもよい| Bはノードであり、次はAに転送することができる|別のノードのBを、転送ノードが固定されておらず、それはダイナミックルーティングと呼ばれる、動的に変化します。
ゲートウェイクラスタ場合は、必要nginxの負荷がどのゲートウェイノードを決定するためにバランスをとります。
Zuulは技術ゲートウェイ、フレームワーク、だけでなく、Netflixの家で、SpringCloudが統合されました。
使用Zuulルーティング転送
(1)新たなサブモジュールAPI-ゲートウェイ
(2)のpom.xml
<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-zuul</artifactId>
</dependency>
ユーレカクライアントへのゲートウェイとしてユーレカ・サーバは、内蔵のリボンユーレカクライアントの負荷分散を使用して、ノードのリストからサービスを取得するため。
だから、コンフィギュレーションユーレカクライアントが持っている必要があります。
(3)ブートストラップ・クラス
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy //也可以使用@EnableZuulServer
パブリッククラスGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
リボンは、あなたが道とリボンを修正するために他の戦略を使用する場合とまったく同じ、デフォルトのポーリングで使用されています。
(4)application.properties
ゲートウェイ設定###
#使用ポート
はserver.port = 11001
#サービスを提供する、サービス名
spring.application.name = API-ゲートウェイ
セットとして構成#2は、複数のセットを配置することができる
簡単に取ることができ、端部が固定されている経路、サービスID、中間部に対応するセットIDが配置され、固定された開始#1 zuul.routesで
#マッピングされたアドレス
zuul.routesを.user-service.path = /ユーザー・サーバ / **
#マッピングするサービス
zuul.routes.user-service.service-ID = USER-サーバーを
#登録ユーレカサーバへ
eureka.client.serviceUrl.defaultZone =のhttp://127.0.0.1:9001 /ユーリカ/
実際のIPとき#ローカルアドレス、ラインは、マシン上で変更する必要があります
eureka.client.ipAddress = 127.0.0.1
#インスタンス名がIPする:ポート・レジスタをサーバーへの形で
eureka.instance.instance-ID =
{}はserver.port
ノードのIP優先順位を登録する場合#、デフォルトでは、ホスト名の登録false--ある
eureka.instance.prefer-IPアドレスを=真
#どのくらいの頻度でデフォルト30代は、デバッグ短く設定することができ、ハートビートを送信します
。#eureka.instance.lease-更新間隔-に -seconds = 30
要求アドレス:のhttp:// IP:ポート/ユーザー・サーバー/ユーザー/オーダー/ {}のuser_id
使用IPのゲートウェイ(Zuul):サービス名マッピングされたパスが続きポート、(いないサービス名、サービス名とパスが、私は上記と同じ設定しました)
自動的にサービスを使用するノードを決定するために、パス、ロードバランシングに基づいて対応するサービス名(たservice_id)を検索します。異なるサービスは、(これらのサービスが露出)別のパスにマッピングされます。
あなたは接頭辞を追加することができます。
zuul.prefix = / APIは、
アドレスを要求:要求アドレス:HTTP:// IPアドレス:ポート/ API /ユーザサーバ/ユーザ/順序/ {USER_ID} フロントアドレスマッピングを追加します
アヤックスのURL、リンクのhref、上記のアドレスを書き込むためのアクション要求。
あなたは(サービスによって公開された)消費者、それが呼び出すことはありませんが、上記のURLの使用を呼び出した後、ゲートウェイを介して呼び出すには、
ゲートウェイインターフェイス(API)の当量は、ゲートウェイのアドレスを提供するために、外部コールのパスサービス、また、APIゲートウェイとして知られているゲートウェイ(ゲートウェイ)。
ゲートウェイは、ゲートウェイのIPを直接使用するので、ここでは、クラスタませんでした:ポート、ゲートウェイへの要求。
クラスタへのゲートウェイは、あなたは、負荷分散ゲートウェイ、nginxのへの要求を行うためにnginxのを使用する必要がある場合。
Zuulは要求を用いて濾過し
、新たなパケットフィルタ、新しいクラスmyFilterをパッケージを作成するには:
自動的にこのインターセプタ使用することができます春の容器に@Component //
パブリッククラスmyFilterを継承はZuulFilterにZuulFilter {//必要性を拡張します
//指定过滤时机
//String类型,"pre"——路由转发之前,"routing"——路由转发之时,"post"——路由转发之后,"error"——发生错误时
@Override
public String filterType() {
return "pre";
}
//设置此拦截器的执行顺序
// 因为可能有多个拦截器,设置一个int型的值,数值越小,优先级越高、越先执行
@Override
public int filterOrder() {
return 0;
}
//是否要进行过滤,即是否要使用此过滤器,这个需要改一下,因为默认为false
@Override
public boolean shouldFilter() {
return true;
}
//核心方法,进行过滤
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
//获取传递的参数、验证权限
String token = request.getParameter("token");
//token要和数据库查到的进行比较,此处随便写一个代替
if (token==null || !token.equals("123456")) {
//直接就返回响应了,请求终止,不再转发给服务
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(400);
//把提示信息显示到页面
try {
currentContext.getResponse().getWriter().write("token is invalid");
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
説明
要求ゲートウェイフィルタは、それは一般的にサービスでは、普遍的ではない場合、書き込みを、ログイン状態チェックなどの一般的なフィルタを、書き込みされ、公開されたサービスのためのすべての要求をフィルタリングします。
サービスがクラスタに公開されていない場合は、サービスノードを要求するために、直接、ゲートウェイを使用することはできません。
SpringMVC使用ファイルアップロードファイルアップロードが、ファイルをアップロードするデフォルトゲートウェイのサイズは、サイズを要求した限定されている、我々はapplication.propertiesゲートウェイで外観を設定する必要があります。
#アップロードされたファイルの最大サイズは、デフォルトの1メガバイト
spring.servlet.multipart.max-ファイルサイズ= 2000メガバイト
#最大サイズを要求し、デフォルトの10メガバイトの
spring.servlet.multipart.maxリクエストサイズ= 2500メガバイト
ブートクラス@ EnableZuulProxy、@ EnableZuulServer、これら2つのノート、ほぼすべて同じで使用することができ、差は小さいです。
フィルタZuulFilterクラスを実装継承するには、フィルタを指定する機会は、このクラスは、これらのサブクラスは、タイミングを指定されている多くのサブクラスを持って、我々はそうフィルタ、使用@EnableZuulServer、少数のタイミングを指定していない、と直接継承することができます不可能サブクラス、ほとんど効果。
それは、性能ダウン、時間のオーバーヘッドが増加しますので、我々は、多数のフィルタを使用することをお勧めしません。