(D)春クラウドチュートリアル--Zuul(Fバージョン)

参考:牙Zhipeng列

マイクロサービスアーキテクチャでは、サービス管理は、登録及びサービス発見、サービス消費、負荷バランシング、回路遮断器、インテリジェント・ルーティング、構成管理、これらの基本的な構成要素の相互協力、共同Aを設定するなど、いくつかの基本的な構成要素を、必要シンプルなマイクロサービスシステム。:以下のシンプルなマイクロサービスシステム

 注:AとBのサービスは忘れ時間をプロットし、互いから呼び出すことができるサービスです。し、設定サービスは、サービスレジストリに登録されています。スプリングクラウドマイクロサービスシステムでは、この方法をバランス共通の負荷は、クライアントの要求は、特定のサービスへの最初のロードバランシング(zuul、Ngnix)を通過した後、サービスゲートウェイ(zuulクラスタ)に達し、そして。、高可用性クラスタサービスレジストリに統一登録サービスは、コンフィギュレーションサービス管理サービスにより、すべての設定ファイル(資料に記載の下)、のgitリポジトリ上のconfigureサービスプロファイルは、いつでも設定を変更するには、開発者を容易にします。

はじめに1. Zuul

Zuul主な機能は、ルートの転送およびフィルタにあります。機能ルーティングするよう/ API、マイクロサービスの一部である/ユーザがサービスに転送買い物をするユーザ/ API /店にサービスに転送されます。zuulデフォルトとリボンの組み合わせは、負荷分散機能を実現しています。

zuulは、次の機能があります。

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

プロジェクトで使用し続けます。元のプロジェクトでは、新しいプロジェクトを作成します。

サービスzuulプロジェクトを作成します。2.

そのpom.xmlファイルを次のように

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zang</groupId>
    <artifactId>service-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>service-zuul</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.zang</groupId>
        <artifactId>sc-f-zuul</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ServiceZuulApplication {

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

3. Zuul路由配置

配置文件application.yml加上以下的配置代码:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8769
spring:
  application:
    name: service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: service-ribbon
    api-b:
      path: /api-b/**
      serviceId: service-feign

首先指定服务注册中心的地址为http://localhost:8761/eureka/,服务的端口为8769,服务名为service-zuul;以/api-a/ 开头的请求都转发给service-ribbon服务;以/api-b/开头的请求都转发给service-feign服务;

依次运行这五个工程;打开浏览器访问http://localhost:8769/api-a/hi?name=zang,显示如下:

 访问http://localhost:8769/api-a/hi?name=zang,显示如下:

 这说明Zuul起到了路由的作用。

4. Zuul服务过滤

Zuul不仅只是路由,并且还能过滤,做一些安全验证。继续改造工程;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class ArgFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(ZuulFilter.class);

    @Override
    public String filterType() {
        // 前置过滤器
        return "pre";
    }

    @Override
    public int filterOrder() {
        // 优先级为0,数字越大,优先级越低
        return 0;
    }

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

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){}

            return null;
        }
        log.info("ok");
        return null;
    }
}

通过继承ZuulFilter然后覆写上面的4个方法,就可以实现一个简单的过滤器,下面是相关注意点进行说明:

  • filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
    • pre:路由之前
    • routing:路由之时
    • post: 路由之后
    • error:发送错误调用
  • filterOrder:过滤的顺序
  • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
  • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

这时访问:http://localhost:8769/api-a/hi?name=zang;网页显示:

访问 http://localhost:8769/api-a/hi?name=zang&token=1 ; 网页显示:

 

おすすめ

転載: www.cnblogs.com/zjfjava/p/12239447.html