spring cloud学習の8:APIゲートウェイサービス-zul
Zuul Apiゲートウェイはよりスマートで安全なサービスであり、私たちの内部サービスを包装できます.すべての外部アクセスはこのサービスを通じてフィルター検査、ルート転送、負荷バランスなどの機能を行います.ZuulとEurekaは結合して、デフォルトではサービス名をContectPathとしてルートマップを作成します.
Zuulゲートウェイ構築
1、依存のpom.xmlを追加します.
Eurekaを結合する
上の構成によって、異なるサービスに対して異なるルートアドレスがあることが分かりますが、各サブアプリケーションは通常、複数のインスタンスがあることを知っていますので、転送する経路を設定するのは面倒です.私達はeureka-clientを使って各アプリケーションが起動後にeureka-serverに登録され、登録センターで維持されているインスタンスリストがローカルに保存されていることを知っています.この特性により、zulもeurka-clientとして登録して、各サービスのインスタンスリストを取得します.ribbonによる負荷バランスは、
1、config依存を追加する
フィルタ
zullのもう一つの機能フィルタリングは、検証、サービス集約などの機能を実現します.zulフィルタは四つの基本的な方法を含みます.filterType()、fileOrder()、ShuldFilter()、run() filterType:戻り文字列は異なるフィルタタイプを表し、4つのフィルタ:pre:要求がルーティングされる前に呼び出します.routing:ルーティング要求時に呼び出します.post:routingとerrorの後に呼び出しられます.error:処理要求に異常が発生した場合に呼び出します. filterOrder:フィルタの実行順序はint値で定義され、値が小さいほど先に実行されます. shuldFilter:リターンbollan値は、フィルタが実行されるかどうかを識別する. run:フィルタの具体的な実行ロジック. Zuul Filterを引き継いで上記の4つの方法を上書きすることにより、カスタムzulブロックを実現するためのケースを実現します.
Zuulゲートウェイ構築
1、依存のpom.xmlを追加します.
org.springframework.cloud
spring-cloud-starter-zuul
1.3.5.RELEASE
2、プロファイルを追加します.properties# , serviceId ,
zuul.ignored-services=*
#
zuul.routes.client-one.path=/one/**
#
zuul.routes.client-one.url=http://192.168.2.83:8181/
3、起動類に注解を追加し、zul機能を開く@EnableZuulProxy
ribbon、hystrix
@EnableCircuitBreaker
@EnableDiscoveryClient
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ZuulProxyMarkerConfiguration.class)
public @interface EnableZuulProxy {
}
spring-cloud-starter-hystrix:この依存は、ゲートウェイサービスにおいてマイクロサービス転送時の保護を実現し、スレッド隔離、遮断器を通じて、マイクロサービスの故障によってAppゲートウェイリソースが解放されなくなり、対外サービス全体に影響を与える.spring-cloud-starter-ribbon:この依存は、経路指定時に転送するサービスに対してクライアントの負荷バランスを実現し、再試行を要求するゲートウェイサービスを実行させる.Eurekaを結合する
上の構成によって、異なるサービスに対して異なるルートアドレスがあることが分かりますが、各サブアプリケーションは通常、複数のインスタンスがあることを知っていますので、転送する経路を設定するのは面倒です.私達はeureka-clientを使って各アプリケーションが起動後にeureka-serverに登録され、登録センターで維持されているインスタンスリストがローカルに保存されていることを知っています.この特性により、zulもeurka-clientとして登録して、各サービスのインスタンスリストを取得します.ribbonによる負荷バランスは、
# eureka
eureka.client.service-url.defaultZone=http://192.168.2.83:7081/eureka/
## eureka
zuul.routes.client-demo.path=/demo/**
zuul.routes.client-demo.serviceId=clientdemo
configと結合して動的ルートを実現する.1、config依存を追加する
org.springframework.cloud
spring-cloud-starter-config
1.4.0.RELEASE
org.springframework.retry
spring-retry
org.springframework.boot
spring-boot-starter-aop
2、プロファイルを追加する# eureka
eureka.client.service-url.defaultZone=http://192.168.2.83:7081/eureka/
# -
# config
spring.cloud.config.discovery.enabled=true
#config
spring.cloud.config.discovery.service-id=config-server
# ${application}
spring.cloud.config.name=zuul-client
# profile
spring.cloud.config.profile=dev
#
spring.cloud.config.label=dev
##
spring.cloud.config.fail-fast=true
## ,
#
spring.cloud.config.retry.max-attempts=6
# ,
spring.cloud.config.retry.initial-interval=1000
# , 1.1*
spring.cloud.config.retry.multiplier=1.1
# ,
spring.cloud.config.retry.max-interval=2000
##ribbon
#
spring.cloud.loadbalancer.retry.enabled=true
# , 250
ribbon.ConnectTimeout=60000
# , 1000
ribbon.ReadTimeout=60000
# , true
ribbon.OkToRetryOnAllOperations=true
# , 2
ribbon.MaxAutoRetriesNextServer=2
# , 1
ribbon.MaxAutoRetries=1
# feign
feign.hystrix.enabled=true
# , 2000, ribbon , ,zuul
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
3、zullの設定を動的に取得する@RefshScope--動的な更新構成 @RefreshScope
@ConfigurationProperties(prefix = "zuul")
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
4、ルーティングルールを構成ファイルに配置し、調整:/refshインターフェースによるリフレッシュ構成により、動的なルーティングを実現する.フィルタ
zullのもう一つの機能フィルタリングは、検証、サービス集約などの機能を実現します.zulフィルタは四つの基本的な方法を含みます.filterType()、fileOrder()、ShuldFilter()、run()
@Component
public class AccessFilter extends ZuulFilter{
/**
* @author:XingWL
* @description: , 。
* pre--
* @date: 2019/4/26 15:06
*/
@Override
public String filterType() {
return "pre";
}
/**
* @author:XingWL
* @description: , , 。
* @date: 2019/4/26 15:09
*/
@Override
public int filterOrder() {
return 0;
}
/**
* @author:XingWL
* @description: 。 ,
* @date: 2019/4/26 15:12
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* @author:XingWL
* @description:
* @date: 2019/4/26 15:14
*/
@Override
public Object run() {
RequestContext ctx =RequestContext.getCurrentContext();//
HttpServletResponse response=ctx.getResponse();//
HttpServletRequest request=ctx.getRequest();//
response.setCharacterEncoding("utf-8");
response.setHeader("Access-Control-Allow-Origin", "*"); // , origin
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");//
response.setHeader("Access-Control-Allow-Credentials", "true");//
response.setHeader("Access-Control-Max-Age", "3600"); //
/*
* Access-Control-Allow-Headers preflight request( ) ,
* Access-Control-Expose-Headers
*
* X-Requested-With ajax
*/
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,accessToken");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
// response.setHeader("Pragma", "no-cache"); // HTTP 1.0. response.setHeader("Expires", "0");
//
String url = request.getRequestURL().toString();
Object accessToken=request.getHeader("accessToken");//
if(accessToken==null || "".equals(accessToken)){
ctx.setSendZuulResponse(false);//
ctx.setResponseStatusCode(401);//
}
return null;
}