EclipseはSpringCloud(ホクストン+ 2.2.4)ゲートウェイ・サービス・フレームワークZuul +サービング微細構造を実行するように構成されました

簡単な紹介

サービスゲートウェイ

サービスゲートウェイはマイクロサービスアーキテクチャ不可欠な部分です。REST APIは、サービスルーティング、ロードバランシング機能を有することに加えて、それはまた、アクセス制御および他の機能を有し、統一されたゲートウェイシステムを提供することによってプロセスを提供します。Zuul春クラウドネットフリックスは、体がより多くのクラスタ化されたサービスを持つことができるように、そのような役割としての権限は、サービスレベルのルーティング非ビジネスロジックにこれらの重いコンテンツの移動を制御する一方で、フロントドアのマイクロサービスアーキテクチャのための保護を提供する役割を務めています高い再利用性とテスト容易性。

ルートの転送サービスゲートウェイ= +フィルタ

  • ルートの転送:マイクロサービスのバックエンドに転送すべての外部要求が上がる受信;例えば、/ Webアプリケーションにマッピングすることができ、ユーザサービスにマッピングされた/ API /ユーザー、および/ストアサービスにマッピングされたAPI /ショップ。
  • フィルタ:あなたは、このようなフィルタを介して(実際には、転送をルーティングするフィルタを介して達成される)に行うことができ、権限をチェック制限および監視など、クロスサービスゲートウェイ機能のシリーズを完了することができます。

Zuul

以下の操作を使用してNetflixのZuul:

  • 認証
  • 洞察
  • ストレステスト
  • カナリアテスト
  • ダイナミックルーティング
  • 移行サービス
  • 負荷遮断
  • セキュリティ
  • 静的応答処理
  • アクティブ/アクティブトラフィック管理

Zuul、リボンユーレカは、インテリジェント・ルーティングおよびロード・バランシング機能と組み合わせることができ、全てのサービス一貫した凝集、統一外部露光のゲートウェイAPIインターフェース。ときに外の世界のコールAPIインタフェースに、内部のマイクロサービスAPIインタフェースユニットを保護するために、それぞれ他の各サービスコールのためのマイクロサービスシステムの複雑さを知っている必要はありません。ゲートウェイは、ユーザ認証と証明機関を行うことができ、不正な操作はAPIインターフェースを要求防ぐ;ゲートウェイ監視、リアルタイムログ出力レコード要求を実現する、ゲートウェイトラフィック監視は、サービス低下に、高トラフィックの場合には、達成することができ、APIインターフェースは、テストを行うことが好都合内部サービスから分離します。

Zuulは、カスタム要求ZuulServletによって制御され、サーブレットによって達成しました。コアは、フィルタは、要求と応答を返すのHttpを開始する一連の間に実行することができる、一連のフィルタです。Zuulは、動的な読み込みを撮影したこれらのフィルタをコンパイルして実行します。フィルタとの間に直接通信するのではなく、RequestContextのを通してデータオブジェクトを共有、各要求はRequestContextのオブジェクトを作成できません。

以下に示すようにZuulライフサイクル。クライアント要求がZuulゲートウェイサービス、「プレフィルタ」への最初のゲートウェイ、ベリファイ動作や判断のシリーズを入力するための要求。そしてその後、転送をルーティング「ルーティングフィルタ」に、特定のサービスロジック処理に、例えば、データが返されます。特定のサービス・プロセスが完了し、そして最後に「ポストフィルタ」によって処理されると、処理後のプロセッサの種類は、クライアントへの要求メッセージのバック完了です。他のステージのエラーで「エラーフィルタ」の実装。デフォルトのフィルタタイプに加えて、Zuulはまた、私たちは、カスタムフィルタの種類を作成することができます。例えば、我々はリア転送マイクロサービスに要求することなく、直接応答Zuulで生成、フィルタの静的タイプをカスタマイズしていることができます。
ここに画像を挿入説明

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

ここに画像を挿入説明

ファイルの依存関係にのpom.xmlを追加

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.springcloud</groupId>
    <artifactId>springcloud-root</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>springcloud-zuul</artifactId>
  <name>springcloud-zuul</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <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>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

Application.yml設定ファイル

ここに画像を挿入説明

  • application.yml
spring:
  application:
    name: springcloud-zuul
  freemarker:
    prefer-file-system-access: false
  security:
    user:
      name: admin
      password: 123456
    
server:
  port: 8120

eureka:
  instance:
    hostname: eureka-zuul.com
    instance-id: eureka-zuul
  client:
    service-url:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer1.com:8897/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer2.com:8898/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer3.com:8899/eureka/

zuul:
  #接口前缀(v1作为版本号)
  prefix: /v1
  routes:
    hiapi:
      path: /hiapi/**
      serviceId: springcloud-eureka-provider
    ribbonapi:
      path: /ribbonapi/**
      serviceId: springcloud-ribbon
    feignapi:
      path: /feignapi/**
      serviceId: springcloud-feign

変更C:\ WINDOWS \ System32に\ drivers \ etcに\ホスト

127.0.0.1 eureka-zuul.com

指定されたフィルタを無効にします。

あなたはフィルタを無効にするapplication.yml必要性、フォーマットを設定することができます

zuul.<SimpleClassName>.<filterType>.disable=true

たとえば、無効org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilterに設定されています

zuul:
  SendResponseFilter:
    post:
      disable: true

サービスゲートウェイの起動クラスを追加します。

ここに画像を挿入説明

  • ZuulApplication.java

コメントを追加@EnableZuulProxy

package org.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

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

プロジェクトを開始するためには、

springcloud-ユーレカ・クラスタ・ピア1
springcloud-ユーレカ・クラスタ・ピア2
springcloud-ユーレカ・クラスタpeer3
springcloud-ユーレカ-provider1
springcloud-ユーレカ-provider2
springcloud-ユーレカ-provider3
springcloudリボン
springcloud-装う
springcloud-zuul

ここに画像を挿入説明

  1. ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
    ここに画像を挿入説明
    Zuulルーティング転送DOロード・バランシング

  2. ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/ribbonapi/hi?name=zhaojq
    ここに画像を挿入説明
    Zuulとリボンのロードバランシング(ランダム戦略)を達成するために組み合わせます

  3. ブラウザの多数の訪問http://eureka-zuul.com:8120/v1/feignapi/hi?name=zhaojq
    ここに画像を挿入説明
    Zuulと装う負荷分散(ランダム戦略)を達成するために組み合わせます

サービスゲートウェイZuulのヒューズを設定します

別の方法fallbackResponse()が実行されるヒューズの機能が入射した場合、ヒューズがFallbackProviderインタフェースを達成するための機能を実装する必要があり、二つの方法のインタフェースは、一方が使用されているサービスをルーティングするヒューズ機能を指定getRoute()、ありますロジック。
ここに画像を挿入説明

  • ZuulHystrix.java

あなたはサービスにすべてのルートが追加されているヒューズ機能が必要な場合は、必要がgetRoute()メソッド「*」文字の一致に戻ります

package org.springcloud.zuul;

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

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;

@Component
public class ZuulHystrix implements FallbackProvider {
    @Override
    //指定熔断器功能应用于哪些路由的服务
    public String getRoute() {
        //return "springcloud-eureka-provider";
    	return "*";
    }

    @Override
    //进入熔断器功能时执行的逻辑
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        System.out.println("route:"+route);
        System.out.println("exception:"+cause.getMessage());
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

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

            @Override
            public String getStatusText() throws IOException {
                return "ok";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("eureka-provider is down!! this is the fallback.".getBytes());
            }

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

すべての通常の開始後、ストップspringcloud-ユーレカ・provider2プロバイダー、ポート:8002回のサービスの
コマンドウィンドウへのアクセスカールhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq、力ですでにサーキットブレーカー、ヒント:サービスプロバイダがハングアップ
ここに画像を挿入説明

カスタムフィルタZuulフィルター

Zuulフィルタ4であっ

  • PREフィルタ:要求のルーティングが行われ、認証、パラメータの検証など、特定のサービスを、前に安全な検証を行うことができます。
  • フィルタルーティング:これは、特定のマイクロサービスインスタンスへの要求の経路に使用されます。ネットワーク要求のためのHTTPクライアントのデフォルト。
  • POSTはフィルタ:マイクロイン要求は、サービスルートの後に行われています。これは、収集、統計、指標、およびクライアントへの応答に使用することができます。
  • ERRORフィルタ:他のフィルタエラーが発生したときに実行。

Zuulデフォルトのフィルタの実装

タイプ オーダー フィルタ 機能
-3 ServletDetectionFilter マーキングプロセスサーブレットタイプ
-2 Servlet30WrapperFilter HttpServletRequestのリクエストをパッキング
-1 FormBodyWrapperFilter パッキングリクエストボディ
ルート 1 DebugFilter マーク・デバッグフラグ
ルート 5 PreDecorationFilter その後の使用のための処理要求コンテキスト
ルート 10 RibbonRoutingFilter サービスIDの要求の転送
ルート 100 SimpleHostRoutingFilter URL要求の転送
ルート 500 SendForwardFilter 前方への要求を転送
役職 0 送信エラーフィルタ エラー処理要求の応答
役職 1000年 SendResponseFilter 通常の処理要求応答

カスタムフィルタを実装する継承ZuulFilter、ZuulFilterへのfilterType()、filterOrder()とIZuulFilter shouldFilter()とrun()メソッドを含む抽象メソッドを実装する必要があります。

  • プリ、ポスト、ルーティングおよびエラー:のfilterType()はフィルタタイプで、4種類があります。
  • filterOrder()は、int型の値は、フィルタの値が小さいほど、先に実行され、フィルタの次数です。
  • もし真ラン()は、処理が実行されていないという誤った手段に、実行される真を表し、フィルタロジックを実行するか否かを示すshouldFilter()。
  • run()メソッドは、特定の論理フィルタリングです。全く送信が存在しない場合、直接ルーティングされないように、特定のサービスインスタンスを要求し、このパラメータを渡す、トークンパスワードかどうか、本実施の形態におけるパラメータチェック要求は、ステータスコード401で応答を返します。

TokenFilterフィルタ

ここに画像を挿入説明

  • TokenFilter.java
package org.springcloud.zuul;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

public class TokenFilter extends ZuulFilter {

    private static Logger LOGGER=LoggerFactory.getLogger(TokenFilter.class);

    @Override
    //定义filter的类型,有pre、route、post、error四种
    public String filterType() {
        //可以在请求被路由之前调用
    	return "pre"; 
    }

    @Override
    //定义filter的顺序,数字越小表示顺序越高,越先执行
    public int filterOrder() {
        return 0;
    }

    @Override
    //表示是否需要执行该filter,true表示执行,false表示不执行
    public boolean shouldFilter() {
        return true;
    }

    @Override
    //filter需要执行的具体操作
    public Object run() throws ZuulException { 
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        LOGGER.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 {
        	LOGGER.warn("token is empty");
            //不对请求进行路由
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

フィルタを有効にし、このようZuulFilterApplicationは豆を追加するプログラムを開始

  • ZuulApplication.java
package org.springcloud.zuul;

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

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
    
    @Bean
    public TokenFilter TokenFilter() {
        return new TokenFilter();
    }
}

プロジェクトを再起動した後、訪問http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
ここに画像を挿入説明
促さトークンは空です。

アクセスhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc
ここに画像を挿入説明
要求をフィルタリングすると、論理ルーティング要求が転送前に決定し、ビーンTokenFilter IOC容器の注入後、見。

ヒントトークンが空の表示二回エラーです

ここに画像を挿入説明
ここに画像を挿入説明
@ComponentのカスタムTokenFilterはそれをキャンセルし、Springコンテナの管理をさせてください。

PasswordFilterフィルタ

ここに画像を挿入説明

  • PasswordFilter.java
package org.springcloud.zuul;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

public class PasswordFilter extends ZuulFilter {

    private final Logger LOGGER = LoggerFactory.getLogger(PasswordFilter.class);

    @Override
    public String filterType() {
    	//请求已被路由到微服务后执行
        return "post";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        //判断上一个过滤器结果为true,否则就不走下面过滤器,直接跳过后面的所有过滤器并返回 上一个过滤器不通过的结果
        return (boolean) ctx.get("isSuccess");     
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        LOGGER.info("--->>> PasswordFilter {},{}", request.getMethod(), request.getRequestURL().toString());

        String username = request.getParameter("password");
        if (null != username && username.equals("123456")) {
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);
            return null;
        } else {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("The password cannot be empty");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

フィルタを有効にし、このようZuulFilterApplicationは豆を追加するプログラムを開始

  • ZuulApplication.java
package org.springcloud.zuul;

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

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
    
    @Bean
    public TokenFilter TokenFilter() {
        return new TokenFilter();
    }

    @Bean
    public PasswordFilter PasswordFilter() {
        return new PasswordFilter();
    }
}

アクセスhttp://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc&password=123456
ここに画像を挿入説明

72元記事公開 ウォン称賛66 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/miaodichiyou/article/details/104398229