zuul路由网关

时间:2022-08-31 15:45:45
  zuul作为网关组件,主要用来管理api请求接口(统一对外暴露,负载均衡),身份认证,流量监控等。它是通过servlet来实现的,核心是一系列过滤器,可以在请求的发起跟相应返回阶段进行一系列的处理。
------------------------------------------------------------------------------------------------------------------------
原理简介
  过滤器分类:
    PRE过滤器:在请求路由到具体的服务之前执行,可以用作安全验证,例如身份验证,参数验证等;
    ROUTING过滤器:用于将请求路由到具体的微服务实例,默认情况下使用http client进行网络请求;
    POST过滤器:在请求被路由到微服务后执行,一般用作收集统计信息,及将响应传输到客户端;
    ERROR过滤器:在其他过滤器发生错误时执行;
  zuul采用了动态读取、编译和运行这些过滤器。过滤器之间不能直接通信,而是通过RequestContext对象共享数据,每个请求都会创建一个RequestContext对象。zuul请求的生命周期如图:
 zuul路由网关
  request请求进入zuul网关后,先进入pre 类别的过滤器,进行一系列验证操作或判断,然后交给routing filter进行路由转发,转发到具体的微服务实例进行逻辑处理并返回数据;当具体的服务处理完成后,最后又post filters进行处理,该类型的过滤器处理完成后,将response信息返回给客户端。
demo搭建
  pom主要内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
  zuul功能开启:
  在启动类加注解@EnableZuulProxy跟@EnableEurekaClient,启用相应功能。
  yml文件配置:
server:
port: 5000
spring:
application:
name: zuul-demo
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serverUrl:
defaultZone: http://127.0.0.1:8761/eureka
zuul:
routes:
smsapi:
path: /sms/**
serviceId: sms-module
consumerapi:
path: /consumertest/**
serviceId: consumer-module
  routes下的smsapi是路由名字,随便起,可以配置多个,每个要配相应的规则。path表示要匹配的url路径,/sms/**表示匹配包含sms的url,将其路由到sms-module服务。第二个consumerapi是路由名,path跟serviceId同上。配置完成后,我们分别启动eureka-server,跟两个服务sms-module跟consumertest,其中sms-module启用三个实例(只需要启动一个服务多个实例即可测试)。
zuul默认结合ribbon的负载均衡测试:
  各个服务启动后服务实例信息如下:

 zuul路由网关
   访问zuul进行测试,可以看到能正常返回结果:
 zuul路由网关
   url中包含两个sms的原因是sms-module的controller的RequestMapping为sms:
 zuul路由网关
   多次访问,可以发现zuul对sms-module的请求会分到不同的实例中,说明zuul默认集成了ribbon做了负载均衡处理。
自定义过滤器测试:
  既然zuul的主要功能之一是对请求进行拦截校验,那我们就做一个对请求进行校验的例子。比如很多网站都有token授权,我们不做token授权,做一个对url参数进行校验的filter,原理是类似的。
  filter代码:
@Component
public class MyFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
//是否走过滤逻辑
@Override
public boolean shouldFilter() {
return true;
}
//判断url中是否包含参数testParam,不包含则拦截请求
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String testParam = request.getParameter("testParam");
if( null == testParam){
System.out.println("缺失关键参数,驳回请求");
ctx.setSendZuulResponse(false);//是否把该请求转发给具体服务
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("qing jiancha canshu shifou wanzheng");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
return null;
}
}
  自定义过滤器只需要继承ZuulFilter并实现4个方法即可。四个方法解释:
    filterType:同开头的过滤器分类,分为4中过滤器。
    filterOrder:执行顺序或者优先级,返回int数值,数值越小优先级越高。
    shoudlFilter:是否走过滤器逻辑,true则会走run方法,false不会。
    run:过滤器主要逻辑处理方法。
  还是同样的请求,发现添加过滤器后被拦截了:
zuul路由网关
  加上参数后再次请求,可以通过并返回正常数据:

 zuul路由网关
熔断器测试:
  zuul作为netflix的组件,可以与hystrix结合实现熔断器功能,zuul实现熔断功能需要实现ZuulFallbackProvider接口。该接口有两个方法:
  getRoute:用于指导熔断功能用于哪些微服务;
  fallbackResponse:进入熔断功能时只需的逻辑;
  代码:
@Component
public class MyFallbackProvider implements ZuulFallbackProvider {
@Override
public String getRoute() {
return "sms-module"; //匹配所有,用“*”
}
@Override
public ClientHttpResponse fallbackResponse() {
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("{\"msg\":\"error, 少年,你的程序出异常了,这里是失败回调函数\"}".getBytes());
// return new ByteArrayInputStream("少年,你的程序出异常了,这里是失败回调函数".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
   停掉sms-module的相关实例,再次访问:
 zuul路由网关
------------------------------------------------------------------------------------------------------------------------
这样吧先。

zuul路由网关的更多相关文章

  1. 【七】zuul路由网关

    一.zuul是什么?zuul 包含以下两个最主要的功能:1.路由功能: 负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.2.过滤器功能: 则负责对请求的处理过程进行干预,是实现请 ...

  2. SpringCloud 进阶之Zuul&lpar;路由网关&rpar;

    1. Zuul(路由网关) Zuul 包含了对请求的路由和过滤两个最主要的功能; 路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础; 过滤功能:负责对请求的处理过程进行干 ...

  3. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  4. spring cloud 2&period;x版本 Zuul路由网关教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  5. SpringCloud的入门学习之概念理解、Zuul路由网关

    1.Zuul路由网关是什么? 答:Zuul包含了对请求的路由和过滤两个最主要的功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进 ...

  6. SpringCloud学习笔记(八):Zuul路由网关

    概述 是什么? Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请 ...

  7. SpringCloud与微服务Ⅸ --- Zuul路由网关

    一.Zool是什么 Zuul包含了对请求路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现 ...

  8. zuul路由网关集成ssl,实现http到https的转变

    1 前言 最近几天刚开始接触微信小程序的开发,才接触到了https的概念(微信小程序中的请求必须为https请求,不然请求无法成功).https算是对http的安全封装,在http的基础上加了ssl证 ...

  9. Spring-Cloud之Zuul路由网关-6

    一.为什么需要Zuul? Zuul 作为微服务系统的网关组件,用于构建边界服务( Edge Service ),致力于动态路由.过滤.监控.弹性伸缩和安全.Zuul 作为路由网关组件,在微服务架构中有 ...

随机推荐

  1. 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:http://www.cnblogs.com/linguanh/) 前序: 距离  2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...

  2. iOS开发:创建真机调试证书及描述文件

    iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...

  3. jquery 替换文本内容

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  4. Linux Top 命令解析 比较详细--转

    TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...

  5. Nginx报错:Sorry&comma; the page you are looking for is currently unavailable&period; Please try again later&period;

    查看了进程, nginx, php-fpm都在运行, 排除程序错误, 那么就是配置的问题了. 一个可能的错误, 是由于配置中的 fastcgi_pass 配置错了 错误的配置如下 server { l ...

  6. bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch

    Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...

  7. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果

    最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...

  8. Android 开发者,如何提升自己的职场竞争力?

    前言 该文章是笔者参加 Android 巴士线下交流会成都站 的手写讲稿虚拟场景,所以大家将就看一下. 开始 大家好,我是刘世麟,首先感谢安卓巴士为我们创造了这次奇妙的相遇.现场的氛围也让我十分激动. ...

  9. 【转】Entity Framework 5&period;0系列之自动生成Code First代码

    在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power Tools ...

  10. Spring Boot&colon; Yaml配置文件 以及 &commat;ConfigurationProperties属性获取

    Yaml配置文件 概述 Spring Boot在支持application.properties配置文件的同时,也支持application.yaml配置文件. 配置文件中的属性,可以通过: 通过@V ...