SpringCloud Zuul
7108 ワード
1.マイクロサービスゲートウェイの概要
マイクロサービス環境の下で、異なるサービスには異なるネットワークアドレスがあり、クライアントを直接各マイクロサービスと通信させると、クライアントは何度も異なるマイクロサービスを要求し、ドメイン間要求が存在し、処理は比較的複雑である.この場合、マイクロサービスゲートウェイを使用する必要があります.マイクロサービスゲートウェイはサービス側とクライアントの中間層にあり、すべての外部サービス要求はまずマイクロサービスゲートウェイを通過し、顧客はマイクロサービスゲートウェイと対話するしかなく、特定のマイクロサービスインタフェースを呼び出す必要がなく、開発を簡素化する.
2.Zuulの概要
Zuulはオープンソースのマイクロサービスゲートウェイであり、Eureka、Ribbon、Hystrixなどのコンポーネントと組み合わせて使用することができ、Zuulの核心は一連のフィルタであり、これらのフィルタは以下の機能を完成することができる.アイデンティティ認証とセキュリティ:各リソースの検証要件を識別し、それらの要件が満たされていないリクエスト を拒否する.監査と監視:エッジ位置で有意義なデータと統計結果を追跡し、正確な生産ビュー をもたらす.動的ルーティング:要求を動的に異なるバックエンドクラスタ にルーティングする.圧力試験:性能 を理解するためにクラスタへの流量を徐々に増加させる.負荷割当:各負荷タイプに対応する容量を割り当てる、制限値を超える要求 を廃棄する.静的応答処理:エッジ位置で直接部分応答を確立し、内部クラスタ への転送を回避する.マルチゾーン弾性:AWS Regionを越えてリクエストルーティングを行い、ELBの使用の多様化を実現し、システムエッジを利用者 に近づける.
3.構成
Maven
注記の追加
最後に彼を登録センターに登録すれば、直接実行できることを覚えています.とても簡単ではありませんか.
4.詳細構成プロファイルに は、ルーティングが必要なパスと無視されるパスを構成する.構成ルーティングフォーマットは【サービス名:パス】であり、productサービスを構成する場合: ドメイン間サービス内の単一のインタフェースがドメイン間で必要である場合、 デフォルトルーティング経由でクッキーなどの情報を転送しないで、プロファイルにsensitiveHeadersを追加して を開くことができます. SpringBusに合わせてZuulを動的に構成します.構成項目 を追加する必要がある
Zuulには4種類のフィルタがあります. PRE:要求がルーティングされる前に呼び出され、認証、クラスタ内で要求を選択するマイクロサービス、デバッグ情報の記録などに使用でき、ストリーム制限、認証、パラメータ検証調整、転送要求に使用できる. ROUTING:要求がマイクロサービスにルーティングされたときに実行され、HttpClientまたはRibbonを使用してマイクロサービスに送信された要求を構築するために使用される. POST:マイクロサービスにルーティングした後に実行し、応答にヘッドを追加し、統計情報と指標を収集し、対応するマイクロサービスからクライアントに送信するなど、統計、ログなどに使用することができる. ERROR:他のフェーズでエラーが発生した場合にこのフィルタを実行します.
げんりゅうトークンバケット
要求ヘッダの追加
検証要求パラメータ
一般的にrunに論理を書き、shouldFilterに論理の明確さを保証するためにフィルタリングが必要かどうかを書きます.
文中の多くの内容はhttps://www.jianshu.com/p/29e9c91e3f3eあ、どうもありがとう!
マイクロサービス環境の下で、異なるサービスには異なるネットワークアドレスがあり、クライアントを直接各マイクロサービスと通信させると、クライアントは何度も異なるマイクロサービスを要求し、ドメイン間要求が存在し、処理は比較的複雑である.この場合、マイクロサービスゲートウェイを使用する必要があります.マイクロサービスゲートウェイはサービス側とクライアントの中間層にあり、すべての外部サービス要求はまずマイクロサービスゲートウェイを通過し、顧客はマイクロサービスゲートウェイと対話するしかなく、特定のマイクロサービスインタフェースを呼び出す必要がなく、開発を簡素化する.
2.Zuulの概要
Zuulはオープンソースのマイクロサービスゲートウェイであり、Eureka、Ribbon、Hystrixなどのコンポーネントと組み合わせて使用することができ、Zuulの核心は一連のフィルタであり、これらのフィルタは以下の機能を完成することができる.
3.構成
Maven
spring-cloud-starter-netflix-eureka-client
spring-cloud-starter-netflix-zuul
導入
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
注記の追加
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
最後に彼を登録センターに登録すれば、直接実行できることを覚えています.とても簡単ではありませんか.
4.詳細構成
management.endpoints.web.exposure.include=*
を追加すると、actuator/routes
にアクセスしてルーティング状況を表示できます. routes:
product: /myProduct/**
ignored-patterns:
- /**/product/**
@CrossOrigin(allowCredentials = "true")
注釈がメソッドに追加される限り.複数のインタフェースをドメイン間で構成する必要がある場合は、Zuulで構成できます./**
*
*
* @author BaoZhou
* @date 2018/9/13
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// , http://www.baidu.com
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("GET","POST"));
config.setMaxAge(300L);
source.registerCorsConfiguration("/**", config);
return new CorsFilter();
}
}
zuul:
routes:
product: /myProduct/**
ignored-patterns:
- /**/product/**
sensitiveHeaders:
@ConfigurationProperties("zuul")
@RefreshScope
public ZuulProperties zuulProperties() {
return new ZuulProperties();
}
Zuulには4種類のフィルタがあります.
げんりゅうトークンバケット
public class RateLimitFilter extends ZuulFilter {
private static final RateLimiter RATE_LIMITER =RateLimiter.create(100);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return SERVLET_DETECTION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
if(!RATE_LIMITER.tryAcquire())
{
throw new RateLimitException();
}
return null;
}
}
要求ヘッダの追加
public class AddResponseHeaderFilter extends ZuulFilter {
@Override
public String filterType() {
return POST_TYPE;
}
@Override
public int filterOrder() {
return SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletResponse response = requestContext.getResponse();
response.setHeader("X-Foo",UUID.randomUUID().toString());
return null;
}
}
検証要求パラメータ
public class TokenFilter extends ZuulFilter {
/**
*
*
* public static final String ERROR_TYPE = "error";
* public static final String POST_TYPE = "post";
* public static final String PRE_TYPE = "pre";
* public static final String ROUTE_TYPE = "route";
*
* @return
*/
@Override
public String filterType() {
return PRE_TYPE;
}
/**
* ,
* public static final int DEBUG_FILTER_ORDER = 1;
* public static final int FORM_BODY_WRAPPER_FILTER_ORDER = -1;
* public static final int PRE_DECORATION_FILTER_ORDER = 5;
* public static final int RIBBON_ROUTING_FILTER_ORDER = 10;
* public static final int SEND_ERROR_FILTER_ORDER = 0;
* public static final int SEND_FORWARD_FILTER_ORDER = 500;
* public static final int SEND_RESPONSE_FILTER_ORDER = 1000;
* public static final int SIMPLE_HOST_ROUTING_FILTER_ORDER = 100;
* public static final int SERVLET_30_WRAPPER_FILTER_ORDER = -2;
* public static final int SERVLET_DETECTION_FILTER_ORDER = -3;
*
* @return
*/
@Override
public int filterOrder() {
return PRE_DECORATION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
/**
*
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
// Url token, cookie,header
String token = request.getParameter("token");
if(StringUtils.isEmpty(token))
{
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
}
}
一般的にrunに論理を書き、shouldFilterに論理の明確さを保証するためにフィルタリングが必要かどうかを書きます.
文中の多くの内容はhttps://www.jianshu.com/p/29e9c91e3f3eあ、どうもありがとう!