路由网关--spring boot Zuul

1.为什么需要Zuul?

  1. Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到集群状态的多个服务实例。
  2. 网关将所有服务的 API 接口统 聚合,并统 对外暴露。外界系统调用 PI 接口时,都是由网关对外暴露的 PI 接口,外界系统不需要知道微服务系统中各服务相互调用的复杂性。微服务系统 保护了其内部微服务单元的 API 接口 防止其被外界直接调用,导致服务的敏感信息对外暴露。
  3. 网关服务可以做用户身份认证和权限认证,防止非法请求操作 PI 接口,对服务器起到保护作用。
  4. 网关可以实现监控功能,实时日志输出,对请求进行记录。
  5. 网关可以用来实现流量监控 在高流量的情况下,对服务进行降级。
  6. API 接口从内部服务分离出来 方便做测试。

Zuul工作原理

Zuul 是通过 Servlet 来实现的, Zuul 通过自定义的 Zuu!Servlet (类似于 Spring MVC DispatcServlet 〕来对请求进行控制。 Zuul 的核心 系列过滤器,可以在 Http 请求的发起和响应返回期间执行 系列的过滤器。

  1. PRE 过滤器:它是在请求路由到具体的服务之前执行的,这种类型的过滤器可 以做安全验证,例如身份验证、 参数验证等。
  2. ROUTING 过滤器 它用于将请求路由到具体的微服务 。在默认情况下,它使用Http Client 进行网络请求。
  3. POST 过滤器:它是在请求己被路由到微服务后执行的 般情况下,用作收集统计信息、指标,以及将响 传输到客户端。
  4. ERROR 过滤器:它是在其他过滤器发生错误时执行的

    Zuul 采取了动态读取、编译和运行这些过滤器 过滤器 间不能直接 信,而是通RequestContext 对象来共享数据 每个请求都会创建 RequestContext 对象 Zuul 过滤

    具有 以下关键特性。

    Type (类型) Zuul 过滤器的类型,这个类型决定了过滤器在请求的哪个阶段起作用,例如 Pre Post 阶段等。

    Execution Order (执行顺序) :规定了过滤器的执行顺序, Order 的值越小,越先执行

    Criteria (标准) Filter 行所需的条

    Action (行动〉 如果符合执行条件,则执行 ction (即逻辑代码)。

Zuul生命周期

当一个客户端 Request 请求进入 Zuul 服务时,网关先进入“pre filter 进行一 系列的验证、操作或者判断 然后交给“routing filter ”进行路由转发,转发到具体的服务实例进行逻辑处理、返回数据。当具体的服务处理完后,最后由“post filter ”进行处理, 该类型的处

理器处理完之后,将 Response 信息返回给客户端。

Demo

项目名称:eureka-zuul-client

再启动类EurekaZuulClientApplication加上EnableEurekaClient注解,开启EurekaClient功能,加上@EnableZuulProxy注解,开启Zuul注解

@EnableZuulProxy

@EnableEurekaClient

@SpringBootApplication

public class EurekaZuulClientApplication{

public static void main(String[] args){

SpringApplication.run(EurekaZuulClientApplication.class,args);

}

}

application.yml配置

enruka:

client:

serviceUrl:

defaultZone:http://localhost:8761/eureka/

server:

port:5000

spring:

application:

name:service-zuul

zuul:

routes:

hiapa:

path:/hiapi/**

serviceId:eureka-client

ribbonapi:

path:/ribbonapi/**

serviceId:eureka-ribbon-client

feignapi:

......

zuul.prefix:XXXX版本号 //给api配置版本号

在Zuul上实现,熔断器

Zuul实现熔断功能需要实现 ZuulFallbackProvider 接口。实现该接口有两个方法,getRoute()方法,用于指定熔断功能应用于哪些路由的服务 个方法 fallbackResponseO为进入熔断功能时执行的逻辑

zuul中使用过滤器

@Component

public class MyFilter extends ZuulFilter

{

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

@Override
public String filterType(){
return Pre_TYPE;
} @Override
public int filterOrder(){
return 0;
} @Override
public boolean shouldFilter(){
return true;
} public Object run(){
RequestContext ctx=RequestContext.getCurrentContext();
HttpServletRequest request=ctx.getRequest("");
Object accessToken=request.getParameter("token");
if(accessToken==null){
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try{
ctx.getResponse().write("token is empty");
}catch(Exception e){
return null;
}
}
log.info("ok");
return null;
}

}

Zuul的常见使用方式

Zuul是采用类似于Spring mvc的DispatchServlet来实现的,采用的是异步阻塞模型,性能比ngnix差,由于Zuul和其他Netflix组件可以相互配合,无缝集成,Zuul很容易就能实现负载均衡,智能路由,熔断器。由于 川的横向扩展能力非常好,所以当负载过高时,可以通过添加实例来解决性

能瓶颈。

一种常见的使用方式是对不同的渠道使用不同的 Zuul 来进行路由,例如移动端共用Zuul 关实例 Web 端用另 Zuul 网关实例,其他的客户端用另外 Zuul 实例进行路由另外已种常见的集群是通过 Ngnix Zuul 相互结合来做负载均衡。暴露在最外面的是Ngnix 从双热备进行 Keepalive, Ngnix 经过某种路由策略,将请求路由转发到 Zuul 集群上,Zuul 最终将请求分发到具体的服务上。

路由网关--spring cloud zuul的更多相关文章

  1. SpringCloud(5)路由网关Spring Cloud Zuul

    一个简单的微服务系统如下图: 1.为什么需要Zuul Zuul很容易实现 负载均衡.智能路由 和 熔断器,可以做身份认证和权限认证,可以实现监控,在高流量状态下,对服务进行降级. 2.路由网关 继续前 ...

  2. spring boot 2.0.3+spring cloud (Finchley)5、路由网关Spring Cloud Zuul

    Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由.过滤.监控.弹性伸缩和安全. 为什么需要Zuul Zuul.Ribbon以及Eureka结合可以实现智能路由和负载均衡的功能:网关将 ...

  3. Spring Cloud 微服务二:API网关spring cloud zuul

    前言:本章将继续上一章Spring Cloud微服务,本章主要内容是API 网关,相关代码将延续上一章,如需了解请参考:Spring Cloud 微服务一:Consul注册中心 Spring clou ...

  4. 服务网关Spring Cloud Zuul

    Spring Cloud Zuul 开发环境 idea 2019.1.2 jdk1.8.0_201 Spring Boot 2.1.9.RELEASE Spring Cloud Greenwich S ...

  5. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  6. Spring Cloud 微服务三: API网关Spring cloud gateway

    前言:前面介绍了一款API网关组件zuul,不过发现spring cloud自己开发了一个新网关gateway,貌似要取代zuul,spring官网上也已经没有zuul的组件了(虽然在仓库中可以更新到 ...

  7. spring cloud: zuul: 微网关-简单使用与路由配置

    spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...

  8. Spring Cloud Zuul API服务网关之请求路由

    目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 ​ 通过前几篇文章的介绍,我们了解了Spring Cloud ...

  9. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

随机推荐

  1. Java访问数组

    package java03; /* 使用动态初始化数组的时候,其中的元素会自动拥有一个默认值,规则如下: 如果是整数类型,默认为0 如果是浮点类型,默认为0.0 如果是字符类型,默认为'\u0000 ...

  2. 力扣——Next Permutation(下一个排列) python实现

    题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  3. 代码解释n |= n >>> 16

    public static int nextPowerOf2(int n) {n -= 1;n |= n >>> 16;n |= n >>> 8;n |= n &g ...

  4. 数据库索引原理,及MySQL索引类型(转)

    在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable( ID INT NOT NULL, username ) NOT N ...

  5. 【leetcode】993. Cousins in Binary Tree

    题目如下: In a binary tree, the root node is at depth 0, and children of each depth k node are at depth  ...

  6. Halo(三)

    接口中可以定义方法 1. 定义静态方法(直接调用) public interface Test { public static void method() { /** * 1.定义一个静态的带有方法体 ...

  7. 理解webpack中的process.env.NODE_ENV

    参考资料 一. process 要理解 process.env.NODE_ENV 就必须要了解 process,process 是 node 的全局变量,并且 process 有 env 这个属性,但 ...

  8. 【MySQL】mysql查询强制大小写及替换字段

    强制大小写 select * from test where name like BINARY '%Adc%' mysql替换字段 update test set name= REPLACE (nam ...

  9. 轻松解决U盘拷贝文件时提示文件过大问题

    现在的高科技时代生活中,u盘的使用已经是许多从事电脑it行业的人每天都必须要用到的用具.可以在一台电脑上使用u盘拷贝文件到另外一台电脑上进行使用,加上它的身材小巧,非常方便我们随身携带到任何地方进行使 ...

  10. php对象方法链式调用编程

    E:\html\tproject\framework\modules\common\classes\Common\CURL.php <?php /** * 同步发起请求 * 针对http协议的8 ...