一、zuul的简单介绍

强烈建议阅读官网介绍,官网写的非常棒!!!

Zuul官网地址:https://github.com/Netflix/zuul/wiki

1.zuul是什么?

原文搬运:

Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.

译文:

Zuul是所有来自设备和web站点到Netflix流媒体应用程序后端的请求的前门。作为一个边缘服务应用程序,Zuul的构建是为了支持动态路由、监视、弹性和安全性。它还可以根据需要将请求路由到多个Amazon自动伸缩组。Netflix API流量的数量和多样性有时会导致生产问题迅速而且没有任何警告。我们需要一个允许我们快速改变行为的系统,以便对这些情况做出反应。

2.为什么使用zuul?

Netflix API流量的数量和多样性有时会导致生产问题在没有警告的情况下迅速出现。我们需要一个能让我们迅速改变行为以应对这些情况的系统。

Zuul使用一系列不同类型的过滤器,使我们能够快速、灵活地将功能应用到edge服务。这些过滤器帮助我们执行以下功能:

  身份验证和安全性——为每个资源确定身份验证需求并拒绝不满足需求的请求。

  洞察和监控——在边缘跟踪有意义的数据和统计数据,以便为我们提供准确的生产视图。

  动态路由——根据需要动态地将请求路由到不同的后端集群。

  压力测试——逐步增加集群的流量,以评估性能。

  减少负载——为每种类型的请求分配容量,并删除超过限制的请求。

  静态响应处理——直接在边缘构建一些响应,而不是将它们转发到内部集群

  多区域弹性——跨AWS区域路由请求,以使我们的ELB使用多样化,并使我们的优势更接近我们的成员

3.总结

1.Zuul具有基本的路由功能,外部请求经由zuul设置的策略进行路由,实现系统访问入口的统一,提高系统的安全性

2.zuul具有功能丰富的过滤器,是我们对请求进行加工处理变得更为简单。

二、实际应用demo

接着前文我们创建了springcloud的6个demo工程,本章节介绍如何使用zuul

没看过上文的,请先查看相关文章:

springcloud教程 -- 1.快速搭建入门级demo, 看这一篇就够了

springcloud教程 -- 2.feign的使用实践优雅的发送请求

springcloud教程 -- 3.微服务熔断机制,断路器hystrix的使用详解

1. 接前文的demo基础,在j-cloud下添加moudle:j-cloud-zuul

2.项目结构如下:

springcloud uri可以是数组吗 springcloud zuul详解_springboot

3.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.jorian.framework</groupId>
    <artifactId>j-cloud-zuul</artifactId>
    <version>1.0.0</version>
    <name>j-cloud-zuul</name>
    <description>Demo project for Spring Boot</description>
    <!-- lookup parent from repository -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath />
    </parent>
    <!-- 属性设置 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- eureka  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <!--LOMBOK-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <!--单元测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!-- dependency management -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

4.启动器JCloudZuulApplication代码如下:

package cn.jorian.framework;


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

@SpringBootApplication
@EnableZuulProxy  //开启zuul代理
@EnableEurekaClient		//zuul服务要注册到Eureka上
public class JCloudZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(JCloudZuulApplication.class, args);
    }
}

5.配置文件application.yml如下:

注意:

1.routes.app-a指的应用app-a,这个名字可改为app-b,app-c

2.routes.app-a.path指的是属于应用app-a的请求,使用**进行通配

3.routes.app-a.servieId指的是请求被指向的应用名称

下图配置代表:http://127.0.0.1:9000/u/addUser   会被重新指向 provider-user/addUser ,而provider-user已经在Eureka中注册,所以最终的请求路径为:http://127.0.0.1:7901/addUser

注意:假如我们系统中启动了两个provider-user实例,那么zuul会自动负载均衡,默认轮询来转发请求。

server:
  port: 9000
spring:
  application:
    name: gateway-zuul
eureka:
  client:
    serviceUrl:
      defaultZone: http://jorian:123456@localhost:8761/eureka
zuul:
  ignoredServices: '*'
  routes:
    app-a:
      path: /u/**
      serviceId: provider-user

 

6.以上步骤做完,依次启动j-cloud-server,j-cloud-provider1,j-cloud-zuul

7.在注册中心查看各个服务是否上线,上线如下:

springcloud uri可以是数组吗 springcloud zuul详解_zuul_02

8.在浏览器输入 网关地址+应用名称+接口,例如:http://localhost:9000/u/user/sayHello

能够返回接口的结果:

springcloud uri可以是数组吗 springcloud zuul详解_spring_03

 9.负载均衡测试:再启动一个provider-user,即工程:j-cloud-provider2

springcloud uri可以是数组吗 springcloud zuul详解_springcloud_04

再次反复访问网关地址+应用名称+接口,例如:http://localhost:9000/u/user/sayHello

返回结果会自动切换,证明zuul对请求进行了负载均衡

第n次:

springcloud uri可以是数组吗 springcloud zuul详解_zuul_05

第n+1次:

springcloud uri可以是数组吗 springcloud zuul详解_springboot_06

10.其余复杂情况请自行挖掘

 

至此,zuul的基本学习已经完成

您可继续关注后续内容更新