spring cloud学習の8:APIゲートウェイサービス-zul


Zuul Apiゲートウェイはよりスマートで安全なサービスであり、私たちの内部サービスを包装できます.すべての外部アクセスはこのサービスを通じてフィルター検査、ルート転送、負荷バランスなどの機能を行います.ZuulとEurekaは結合して、デフォルトではサービス名をContectPathとしてルートマップを作成します.
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()
  • filterType:戻り文字列は異なるフィルタタイプを表し、4つのフィルタ:pre:要求がルーティングされる前に呼び出します.routing:ルーティング要求時に呼び出します.post:routingとerrorの後に呼び出しられます.error:処理要求に異常が発生した場合に呼び出します.
  • filterOrder:フィルタの実行順序はint値で定義され、値が小さいほど先に実行されます.
  • shuldFilter:リターンbollan値は、フィルタが実行されるかどうかを識別する.
  • run:フィルタの具体的な実行ロジック.
  • Zuul Filterを引き継いで上記の4つの方法を上書きすることにより、カスタムzulブロックを実現するためのケースを実現します.
    @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;
        }