簡単な紹介
サービスゲートウェイ
サービスゲートウェイはマイクロサービスアーキテクチャ不可欠な部分です。REST APIは、サービスルーティング、ロードバランシング機能を有することに加えて、それはまた、アクセス制御および他の機能を有し、統一されたゲートウェイシステムを提供することによってプロセスを提供します。Zuul春クラウドネットフリックスは、体がより多くのクラスタ化されたサービスを持つことができるように、そのような役割としての権限は、サービスレベルのルーティング非ビジネスロジックにこれらの重いコンテンツの移動を制御する一方で、フロントドアのマイクロサービスアーキテクチャのための保護を提供する役割を務めています高い再利用性とテスト容易性。
ルートの転送サービスゲートウェイ= +フィルタ
- ルートの転送:マイクロサービスのバックエンドに転送すべての外部要求が上がる受信;例えば、/ Webアプリケーションにマッピングすることができ、ユーザサービスにマッピングされた/ API /ユーザー、および/ストアサービスにマッピングされたAPI /ショップ。
- フィルタ:あなたは、このようなフィルタを介して(実際には、転送をルーティングするフィルタを介して達成される)に行うことができ、権限をチェック制限および監視など、クロスサービスゲートウェイ機能のシリーズを完了することができます。
Zuul
以下の操作を使用してNetflixのZuul:
- 認証
- 洞察
- ストレステスト
- カナリアテスト
- ダイナミックルーティング
- 移行サービス
- 負荷遮断
- セキュリティ
- 静的応答処理
- アクティブ/アクティブトラフィック管理
Zuul、リボンユーレカは、インテリジェント・ルーティングおよびロード・バランシング機能と組み合わせることができ、全てのサービス一貫した凝集、統一外部露光のゲートウェイAPIインターフェース。ときに外の世界のコールAPIインタフェースに、内部のマイクロサービスAPIインタフェースユニットを保護するために、それぞれ他の各サービスコールのためのマイクロサービスシステムの複雑さを知っている必要はありません。ゲートウェイは、ユーザ認証と証明機関を行うことができ、不正な操作はAPIインターフェースを要求防ぐ;ゲートウェイ監視、リアルタイムログ出力レコード要求を実現する、ゲートウェイトラフィック監視は、サービス低下に、高トラフィックの場合には、達成することができ、APIインターフェースは、テストを行うことが好都合内部サービスから分離します。
Zuulは、カスタム要求ZuulServletによって制御され、サーブレットによって達成しました。コアは、フィルタは、要求と応答を返すのHttpを開始する一連の間に実行することができる、一連のフィルタです。Zuulは、動的な読み込みを撮影したこれらのフィルタをコンパイルして実行します。フィルタとの間に直接通信するのではなく、RequestContextのを通してデータオブジェクトを共有、各要求はRequestContextのオブジェクトを作成できません。
以下に示すようにZuulライフサイクル。クライアント要求がZuulゲートウェイサービス、「プレフィルタ」への最初のゲートウェイ、ベリファイ動作や判断のシリーズを入力するための要求。そしてその後、転送をルーティング「ルーティングフィルタ」に、特定のサービスロジック処理に、例えば、データが返されます。特定のサービス・プロセスが完了し、そして最後に「ポストフィルタ」によって処理されると、処理後のプロセッサの種類は、クライアントへの要求メッセージのバック完了です。他のステージのエラーで「エラーフィルタ」の実装。デフォルトのフィルタタイプに加えて、Zuulはまた、私たちは、カスタムフィルタの種類を作成することができます。例えば、我々はリア転送マイクロサービスに要求することなく、直接応答Zuulで生成、フィルタの静的タイプをカスタマイズしていることができます。
サービスゲートウェイを作成します。
ファイルの依存関係にのpom.xmlを追加
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>springcloud-root</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>springcloud-zuul</artifactId>
<name>springcloud-zuul</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.yml設定ファイル
- application.yml
spring:
application:
name: springcloud-zuul
freemarker:
prefer-file-system-access: false
security:
user:
name: admin
password: 123456
server:
port: 8120
eureka:
instance:
hostname: eureka-zuul.com
instance-id: eureka-zuul
client:
service-url:
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer1.com:8897/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer2.com:8898/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer3.com:8899/eureka/
zuul:
#接口前缀(v1作为版本号)
prefix: /v1
routes:
hiapi:
path: /hiapi/**
serviceId: springcloud-eureka-provider
ribbonapi:
path: /ribbonapi/**
serviceId: springcloud-ribbon
feignapi:
path: /feignapi/**
serviceId: springcloud-feign
変更C:\ WINDOWS \ System32に\ drivers \ etcに\ホスト
127.0.0.1 eureka-zuul.com
指定されたフィルタを無効にします。
あなたはフィルタを無効にするapplication.yml必要性、フォーマットを設定することができます
zuul.<SimpleClassName>.<filterType>.disable=true
たとえば、無効org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilterに設定されています
zuul:
SendResponseFilter:
post:
disable: true
サービスゲートウェイの起動クラスを追加します。
- ZuulApplication.java
コメントを追加@EnableZuulProxy
package org.springcloud.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
プロジェクトを開始するためには、
springcloud-ユーレカ・クラスタ・ピア1
springcloud-ユーレカ・クラスタ・ピア2
springcloud-ユーレカ・クラスタpeer3
springcloud-ユーレカ-provider1
springcloud-ユーレカ-provider2
springcloud-ユーレカ-provider3
springcloudリボン
springcloud-装う
springcloud-zuul
-
ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
Zuulルーティング転送DOロード・バランシング -
ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/ribbonapi/hi?name=zhaojq
Zuulとリボンのロードバランシング(ランダム戦略)を達成するために組み合わせます -
ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/feignapi/hi?name=zhaojq
Zuulと装う負荷分散(ランダム戦略)を達成するために組み合わせます
サービスゲートウェイZuulのヒューズを設定します
別の方法fallbackResponse()が実行されるヒューズの機能が入射した場合、ヒューズがFallbackProviderインタフェースを達成するための機能を実装する必要があり、二つの方法のインタフェースは、一方が使用されているサービスをルーティングするヒューズ機能を指定getRoute()、ありますロジック。
- ZuulHystrix.java
あなたはサービスにすべてのルートが追加されているヒューズ機能が必要な場合は、必要がgetRoute()メソッド「*」文字の一致に戻ります
package org.springcloud.zuul;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
@Component
public class ZuulHystrix implements FallbackProvider {
@Override
//指定熔断器功能应用于哪些路由的服务
public String getRoute() {
//return "springcloud-eureka-provider";
return "*";
}
@Override
//进入熔断器功能时执行的逻辑
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
System.out.println("route:"+route);
System.out.println("exception:"+cause.getMessage());
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "ok";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("eureka-provider is down!! this is the fallback.".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
すべての通常の開始後、ストップspringcloud-ユーレカ・provider2プロバイダー、ポート:8002回のサービスの
コマンドウィンドウへのアクセスカールhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq、力ですでにサーキットブレーカー、ヒント:サービスプロバイダがハングアップ
カスタムフィルタZuulフィルター
Zuulフィルタ4であっ
- PREフィルタ:要求のルーティングが行われ、認証、パラメータの検証など、特定のサービスを、前に安全な検証を行うことができます。
- フィルタルーティング:これは、特定のマイクロサービスインスタンスへの要求の経路に使用されます。ネットワーク要求のためのHTTPクライアントのデフォルト。
- POSTはフィルタ:マイクロイン要求は、サービスルートの後に行われています。これは、収集、統計、指標、およびクライアントへの応答に使用することができます。
- ERRORフィルタ:他のフィルタエラーが発生したときに実行。
Zuulデフォルトのフィルタの実装
タイプ | オーダー | フィルタ | 機能 |
---|---|---|---|
前 | -3 | ServletDetectionFilter | マーキングプロセスサーブレットタイプ |
前 | -2 | Servlet30WrapperFilter | HttpServletRequestのリクエストをパッキング |
前 | -1 | FormBodyWrapperFilter | パッキングリクエストボディ |
ルート | 1 | DebugFilter | マーク・デバッグフラグ |
ルート | 5 | PreDecorationFilter | その後の使用のための処理要求コンテキスト |
ルート | 10 | RibbonRoutingFilter | サービスIDの要求の転送 |
ルート | 100 | SimpleHostRoutingFilter | URL要求の転送 |
ルート | 500 | SendForwardFilter | 前方への要求を転送 |
役職 | 0 | 送信エラーフィルタ | エラー処理要求の応答 |
役職 | 1000年 | SendResponseFilter | 通常の処理要求応答 |
カスタムフィルタを実装する継承ZuulFilter、ZuulFilterへのfilterType()、filterOrder()とIZuulFilter shouldFilter()とrun()メソッドを含む抽象メソッドを実装する必要があります。
- プリ、ポスト、ルーティングおよびエラー:のfilterType()はフィルタタイプで、4種類があります。
- filterOrder()は、int型の値は、フィルタの値が小さいほど、先に実行され、フィルタの次数です。
- もし真ラン()は、処理が実行されていないという誤った手段に、実行される真を表し、フィルタロジックを実行するか否かを示すshouldFilter()。
- run()メソッドは、特定の論理フィルタリングです。全く送信が存在しない場合、直接ルーティングされないように、特定のサービスインスタンスを要求し、このパラメータを渡す、トークンパスワードかどうか、本実施の形態におけるパラメータチェック要求は、ステータスコード401で応答を返します。
TokenFilterフィルタ
- TokenFilter.java
package org.springcloud.zuul;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
public class TokenFilter extends ZuulFilter {
private static Logger LOGGER=LoggerFactory.getLogger(TokenFilter.class);
@Override
//定义filter的类型,有pre、route、post、error四种
public String filterType() {
//可以在请求被路由之前调用
return "pre";
}
@Override
//定义filter的顺序,数字越小表示顺序越高,越先执行
public int filterOrder() {
return 0;
}
@Override
//表示是否需要执行该filter,true表示执行,false表示不执行
public boolean shouldFilter() {
return true;
}
@Override
//filter需要执行的具体操作
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
LOGGER.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
//获取请求的参数
String token = request.getParameter("token");
if (StringUtils.isNotBlank(token)) {
//对请求进行路由
ctx.setSendZuulResponse(true);
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);
return null;
} else {
LOGGER.warn("token is empty");
//不对请求进行路由
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (IOException e) {
e.printStackTrace();
}
ctx.set("isSuccess", false);
return null;
}
}
}
フィルタを有効にし、このようZuulFilterApplicationは豆を追加するプログラムを開始
- ZuulApplication.java
package org.springcloud.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
@Bean
public TokenFilter TokenFilter() {
return new TokenFilter();
}
}
プロジェクトを再起動した後、訪問http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
促さトークンは空です。
アクセスhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc
要求をフィルタリングすると、論理ルーティング要求が転送前に決定し、ビーンTokenFilter IOC容器の注入後、見。
ヒントトークンが空の表示二回エラーです
@ComponentのカスタムTokenFilterはそれをキャンセルし、Springコンテナの管理をさせてください。
PasswordFilterフィルタ
- PasswordFilter.java
package org.springcloud.zuul;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
public class PasswordFilter extends ZuulFilter {
private final Logger LOGGER = LoggerFactory.getLogger(PasswordFilter.class);
@Override
public String filterType() {
//请求已被路由到微服务后执行
return "post";
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
//判断上一个过滤器结果为true,否则就不走下面过滤器,直接跳过后面的所有过滤器并返回 上一个过滤器不通过的结果
return (boolean) ctx.get("isSuccess");
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
LOGGER.info("--->>> PasswordFilter {},{}", request.getMethod(), request.getRequestURL().toString());
String username = request.getParameter("password");
if (null != username && username.equals("123456")) {
ctx.setSendZuulResponse(true);
ctx.setResponseStatusCode(200);
ctx.set("isSuccess", true);
return null;
} else {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("The password cannot be empty");
} catch (IOException e) {
e.printStackTrace();
}
ctx.set("isSuccess", false);
return null;
}
}
}
フィルタを有効にし、このようZuulFilterApplicationは豆を追加するプログラムを開始
- ZuulApplication.java
package org.springcloud.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
@Bean
public TokenFilter TokenFilter() {
return new TokenFilter();
}
@Bean
public PasswordFilter PasswordFilter() {
return new PasswordFilter();
}
}
アクセスhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc&password=123456