SpringCloud Zuul

7108 ワード

1.マイクロサービスゲートウェイの概要
マイクロサービス環境の下で、異なるサービスには異なるネットワークアドレスがあり、クライアントを直接各マイクロサービスと通信させると、クライアントは何度も異なるマイクロサービスを要求し、ドメイン間要求が存在し、処理は比較的複雑である.この場合、マイクロサービスゲートウェイを使用する必要があります.マイクロサービスゲートウェイはサービス側とクライアントの中間層にあり、すべての外部サービス要求はまずマイクロサービスゲートウェイを通過し、顧客はマイクロサービスゲートウェイと対話するしかなく、特定のマイクロサービスインタフェースを呼び出す必要がなく、開発を簡素化する.
2.Zuulの概要
Zuulはオープンソースのマイクロサービスゲートウェイであり、Eureka、Ribbon、Hystrixなどのコンポーネントと組み合わせて使用することができ、Zuulの核心は一連のフィルタであり、これらのフィルタは以下の機能を完成することができる.
  • アイデンティティ認証とセキュリティ:各リソースの検証要件を識別し、それらの要件が満たされていないリクエスト
  • を拒否する.
  • 監査と監視:エッジ位置で有意義なデータと統計結果を追跡し、正確な生産ビュー
  • をもたらす.
  • 動的ルーティング:要求を動的に異なるバックエンドクラスタ
  • にルーティングする.
  • 圧力試験:性能
  • を理解するためにクラスタへの流量を徐々に増加させる.
  • 負荷割当:各負荷タイプに対応する容量を割り当てる、制限値を超える要求
  • を廃棄する.
  • 静的応答処理:エッジ位置で直接部分応答を確立し、内部クラスタ
  • への転送を回避する.
  • マルチゾーン弾性:AWS Regionを越えてリクエストルーティングを行い、ELBの使用の多様化を実現し、システムエッジを利用者
  • に近づける.
    3.構成
    Maven spring-cloud-starter-netflix-eureka-clientspring-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にアクセスしてルーティング状況を表示できます.
  • は、ルーティングが必要なパスと無視されるパスを構成する.構成ルーティングフォーマットは【サービス名:パス】であり、productサービスを構成する場合:
  •   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();
        }
    }
    
  • デフォルトルーティング経由でクッキーなどの情報を転送しないで、プロファイルにsensitiveHeadersを追加して
  • を開くことができます.
    zuul:
      routes:
        product: /myProduct/**
      ignored-patterns:
         - /**/product/**
      sensitiveHeaders:
    
  • SpringBusに合わせてZuulを動的に構成します.構成項目
  • を追加する必要がある
     @ConfigurationProperties("zuul")
        @RefreshScope
        public ZuulProperties zuulProperties() {
            return new ZuulProperties();
        }
    

    Zuulには4種類のフィルタがあります.
  • PRE:要求がルーティングされる前に呼び出され、認証、クラスタ内で要求を選択するマイクロサービス、デバッグ情報の記録などに使用でき、ストリーム制限、認証、パラメータ検証調整、転送要求に使用できる.
  • ROUTING:要求がマイクロサービスにルーティングされたときに実行され、HttpClientまたはRibbonを使用してマイクロサービスに送信された要求を構築するために使用される.
  • POST:マイクロサービスにルーティングした後に実行し、応答にヘッドを追加し、統計情報と指標を収集し、対応するマイクロサービスからクライアントに送信するなど、統計、ログなどに使用することができる.
  • ERROR:他のフェーズでエラーが発生した場合にこのフィルタを実行します.

  • げんりゅうトークンバケット
    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あ、どうもありがとう!