サービスゲートウェイ春クラウドZuul

春の雲Zuul

開発環境

  • アイデア2019年1月2日
  • jdk1.8.0_201
  • 春ブーツ2.1.9.RELEASE
  • 春の雲グリニッジSR3

Zuulはじめに

Zuulがネットフリックスは、動的ルーティング、モニタリング、柔軟、セキュアゲートウェイサービスを提供するために開発され、彼は、ユーレカ、リボン、Hystrixおよび他の成分とを組み合わせて使用​​することができます。また、フィルタを作成することによって、フィルタをチェックするためのサポートを提供できるようにマイクロサービスアプリケーションとビジネスロジックの開発の詳細焦点。

Zuulゲートウェイサービスを使用する利点は、統一されたシステムをもたらすことであるRESTのAPIを提供し、さらに、アクセス制御、ロードバランシングおよび他の機能を提供し、これらの関数は、元のサービスから引き出され、個別があります。

Zuulが要求を処理するためのフィルタの種類を提供しています、フィルタは、私たちは以下の機能を実現することができます

  • そして、認証条件が満たされていない特定するための要求情報を拒否が必要になることがあります:アクセス・コントロールとセキュリティを
  • 監視:監視要求情報
  • ダイナミックルーティング:必要に応じて異なるサービスクラスタの背景に要求して動的ルーティング
  • ストレステスト:流量は、性能評価のために、クラスタに徐々に増加させます
  • ロード・バランシング:要求の種類ごとに割り当てる容量と要求が限界を超えて廃棄
  • 限定的
  • ブラックとホワイトリストのフィルタリング
  • 静的リソースの取り扱い:直接応答zuulにおける内部クラスタに要求を転送することなく、静的なリソースを扱います

フィルタ

ZuulFilterベース抽象クラスが抽象メソッドを定義しています

  • filterType方法:フィルターの種類は、「前」、「ルート」、「ポスト」、「誤り」がある「静的」
    • 前:リクエストがルーティングされる前に実行
    • ルート:リクエストがルーティングされたときに実行
    • ポスト:リクエストがルーティングされた後に実行
    • エラー:実行を要求するときにエラーが発生しました
    • 静的:特殊フィルターは、特にZuul自体からの応答を生成することができるStaticResponseFilter、代わりのソースに要求を転送を見ることができます
  • filterOrder方法:優先度、より高いレベルは、より速く実行される(値が小さいほど、より高いレベルを示します)

  • shouldFilter方法:それは本当である場合、スイッチは、実行方法が実行されない、または実行されます

  • この方法を実行します。フィルターの論理演算を行い

コードの実装

1.サービスのレジストリを作成します。

:zuul-ユーレカ・サーバープロジェクト、ユーレカ・サーバー依存の導入を作成するには、完全なソースプロジェクトを表示することができます春クラウドZuulのサンプルソースコードを

次の段落では、キーコードを貼り付け

POM依存関係を追加

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

コメント@EnableEurekaServerクラスの増加を開始します

@EnableEurekaServer
@SpringBootApplication
public class ZuulEurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulEurekaServerApplication.class, args);
    }
}

YMLの設定

server:
  port: 8761

spring:
  application:
    name: zuul-eureka-server

eureka:
  instance:
    hostname: localhost   # eureka 实例名称
  client:
    register-with-eureka: false # 不向注册中心注册自己
    fetch-registry: false       # 是否检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # 注册中心访问地址

2.サービスプロバイダを作成します。1

:、ユーレカ・クライアント依存の導入をzuulサーバ・プロバイダー・プログラムを作成するには、完全なソースプロジェクトを表示することができます春クラウドZuulのサンプルソースコードを

次の段落では、キーコードを貼り付け

POM依存関係を追加

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

HelloControllerサービスを書きます

@RestController
@Slf4j
public class HelloController {

    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        log.info("request one  name is " + name);
        return "hello " + name + ",this is first messge";
    }
}

クラス増加@EnableDiscoveryClientコメントを開始します

@SpringBootApplication
@EnableDiscoveryClient
public class ZuulServerProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerProviderApplication.class, args);
    }
}

YMLの設定

spring:
  application:
    name: zuul-server-provider
server:
  port: 9000
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

3.サービスプロバイダを作成します。2

zuul-サーバprovider2プロジェクト、他のサービスプロバイダとのユーレカ・クライアント依存の導入を作成する1つのプロジェクト、完全なソースコードを表示することができますプロジェクト:春クラウドZuulサンプルソースコードを

コードの違いが掲載します

ここでは、サービス劣化試験を行うために、サービスを書く、現在のスレッドの長い休眠期間を設定します

@RestController
@Slf4j
public class HelloController {
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        log.info("request two name is " + name);
        try{
            //为做服务降级测试,设置一个超长休眠时间,故意导致该服务访问超时
            Thread.sleep(1000000);  
        }catch ( Exception e){
            log.error(" hello two error",e);
        }
        return "hello " + name + ",this is two messge";
    }
}

4. zuulサービスゲートウェイを作成します。

:zuulサーバ・ゲートウェイプロジェクト、Netflixの-zuulユーレカ・クライアント依存の導入を作成するには、完全なソースプロジェクトを表示することができます春クラウドZuulのサンプルソースコードを

次の段落では、キーコードを貼り付け

pom.xml設定

        <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>

フィルタを作成しますTokenFilter.java

package com.easy.zuulServerGateway.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import javax.servlet.http.HttpServletRequest;

@Slf4j
public class TokenFilter extends ZuulFilter {

    @Override
    public String filterType() {
        //可以在请求被路由之前调用
        return "pre";
    }

    @Override
    public int filterOrder() {
        //filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        //是否执行该过滤器,此处为true,说明需要过滤
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        log.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 {
            //不对其进行路由
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(400);
            ctx.setResponseBody("token is empty");
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

ヒューズ対応zuulサーバ・プロバイダサービスの作成(サービス全体のためにここにヒューズを、単一のサービス・インターフェース・ヒューズに対処するために行うことができます)、ProviderFallback.java

package com.easy.zuulServerGateway.fallback;

import lombok.extern.slf4j.Slf4j;
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;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

@Slf4j
@Component
public class ProviderFallback implements FallbackProvider {

    @Override
    public String getRoute() {
        return "zuul-server-provider";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        if (cause != null) {
            String reason =cause.getMessage();
            log.info("Excption {}", reason);
        }
        return fallbackResponse();
    }

    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() {
                return 200;
            }

            @Override
            public String getStatusText(){
                return "OK";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() {
                return new ByteArrayInputStream("The service is unavailable.".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

YMLの設定

spring:
  application:
    name: zuul-service-gateway
server:
  port: 8888

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

  #是否开启重试功能
zuul:
  retryable: true
  #对当前服务的重试次数
ribbon:
  MaxAutoRetries: 2
  #切换相同Server的次数
  MaxAutoRetriesNextServer: 0

サービスゲートウェイを開始するために、@EnableZuulProxy起動クラスのノートを増やす
ZuulServerGatewayApplication.javaを

package com.easy.zuulServerGateway;

import com.easy.zuulServerGateway.filter.TokenFilter;
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 ZuulServerGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerGatewayApplication.class, args);
    }

    @Bean
    public TokenFilter tokenFilter() {
        return new TokenFilter();
    }
}

まず、4つのサービスの例が作成され、その後、効果を参照してくださいサンプルを実行します

使用

四件の既存のプロジェクト以下の通りです。

zuul-ユーレカ・サーバー:サービスレジストリ、サービス名:zuul-ユーレカ・サーバー、ポート:8761
Zuul-サーバープロバイダ:サービスプロバイダ1.サービス名:zuulサーバー・プロバイダー、ポート:9000
Zuul-サーバーProvider2です:サービスプロバイダ、サービス名:zuul-サーバー・プロバイダー、ポート:9001
zuul-サーバーゲートウェイ:ゲートウェイサービス、サービス名:zuulサーバ・ゲートウェイ、ポート:8888

テストを実行

それぞれzuul-ユーレカ・サーバー、zuulサーバ・ゲートウェイ、zuulサーバ・プロバイダの3つのサービスを開始

  • アクセスアドレスます。http:// localhost:?8888 / zuulサーバ・プロバイダ/ハロー名= yuntianは、返す:トークンは空で、要求が返さインターセプトされます。
  • アクセスアドレスます。http:// localhost:?8888 / zuulサーバ・プロバイダ/ハロー名= yuntian&トークン= XX、リターンは:yuntianこんにちは、これはその要求正常な応答を示し、最初のmessgeです。

zuul-サーバprovider2を開始

  • HTTPに多くの訪問:// localhostを:8888 / zuulサーバ・プロバイダ/ハローyuntian&トークン名= = XX、今回は返し切り替わりますか?
hello yuntian,this is first messge
The service is unavailable
...

結果から分かるように返さ:zuul-サーバprovider2プロジェクトが吹きリターンを有効にしています。サービスは利用できません。

データ

おすすめ

転載: www.cnblogs.com/tqlin/p/11670884.html