社区编辑申请
注册/登录
SpringCloud系列之Zuul网关和Zuul过滤器
开发 架构
Zuul是SpringCloud全家桶的微服务网关。所有从app或者网站(第三方)来的请求都会经过Zuul到达后端的Netflix应用程序。

Zuul网关

什么是Zuul网关?

Zuul是SpringCloud全家桶的微服务网关。所有从app或者网站(第三方)来的请求都会经过Zuul到达后端的Netflix应用程序。作为一个边界性质的应用程序,Zuul提供了动态路由、监控、弹性负载和安全功能。

Zuul底层利用filter实现如下功能:

  1. 认证和安全,识别每个需要认证的资源,拒绝不服务要求的请求。
  2. 性能检测,在服务边界追踪并统计数据,提供精确的生产视图。
  3. 动态路由,根据需要将请求动态路由到后端集群。
  4. 压力测试,逐渐增加对集群的流量以及了解其性能。
  5. 负载卸载,预先为每种类型的请求分配容量,当请求超过流量时自动丢弃。静态资源处理,直接在边界返回某种响应。
  6. 静态资源处理,直接在Zuul处理静态资源并响应,而并非转发这些请求到内部集群中。
  7. 多区域弹性,跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

Zuul网关Demo

引入jar包:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>

配置文件:application.yml。

server:
port: 7004 # 端口
spring:
application:
name: zuul-getway # 服务名
eureka:
client:
service-url:
defaultZone: http://jack:666@localhost:8764/eureka/ # 需要注册到eureka
instance:
instance-id: ${spring.application.name}:${server.port}
zuul:
routes:
order-service: /od/** # 对某个服务自定义路由规则
serviceId: order-service # 这个配置可以实现负载均衡,默认是轮询
# 设置某些服务不要进行反向代理 进行路由,多个服务用逗号隔开
ignored-services: order-service, user-service
prefix: /api # 请求路径的前缀

查看是否注册到eureka。

Eureka注册中心

访问路径:

localhost:7004/api/od/getOrder?token=1235。

(后面带token是因为我配置了pre过滤器,下面会介绍)。

Zuul过滤器

Zuul四种过滤器类型,这些类型对应请求的生命周期

  • pre(前置):在请求被路由之前调用。可利用这种过滤器来实现身份认证、在集群中选择请求的微服务,记录调试等。
  • routing(路由):将请求路由到微服务。用于构建发送给微服务的请求,并使用apache httpclient或netflix ribbon请求微服务。
  • post(后置):在路由到微服务后执行。可用于响应添加标准的http header、收集统计信息和指标、将响应从微服务发送到客户端。
  • error(错误):在其他阶段发送错误时执行该过滤器。

注:除了默认的过滤器类型以外Zuul还允许创建自定义的过滤器类型。

如何禁用过滤器?

很简单,只需设置zuul.ClassName.filterType.disable=true ,即可禁用SimpleClassName所对应的过滤器。例如:zuul.TokenFilter.pre.disable=true; 即可禁用TokenFilter过滤器。

pre过滤器

例子: 鉴权认证。如果参数带了token就允许访问。

/**
* pre过滤器
* @Author Big.Hu
*/
@Component
public class TokenFilter extends ZuulFilter {
@Override
public Object run() {
System.err.println("执行pre前置过滤器。。。。。。。。。");
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
StringBuffer requestURL = request.getRequestURL();
System.out.println("requestURL:" + requestURL);
// 获取请求的参数
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
// 如果参数为空则过滤该请求,不对其进行路由
currentContext.setSendZuulResponse(false);
// 设置错误码:401
currentContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
currentContext.set("SUCCESS", false);
} else {
// 不过滤该请求,对其进行路由
currentContext.setSendZuulResponse(true);
// 设置成功码:200
currentContext.setResponseStatusCode(HttpStatus.SC_OK);
currentContext.set("SUCCESS", true);
}
System.out.println("token:" + token);
return null;
}
/**
* 当前filter类型:pre、post、route、error
*/
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
/**
* 表示当前filter优先级
*/
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
/**
* 是否执行该过滤器?
**/
@Override
public boolean shouldFilter() {
return true;
}
}

POST过滤器

例: 在返回的时候设置一个cookie。

/**
* Post过滤器
* @Author Big.Hu
*/
@Component
public class PostFilter extends ZuulFilter {
/**
* POST过滤器:在route和error过滤器之后执行
*/
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
System.err.println("执行Post过滤器。。。。。。。。。");
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletResponse response = currentContext.getResponse();
Cookie cookie = new Cookie("name", "Jack.Hu");
cookie.setMaxAge(60 * 60 * 24);
response.addCookie(cookie);
return null;
}
}

访问路径:

localhost:7004/api/od/getOrder。

(没带token参数)请求被pre过滤器过滤掉了。

不带token请求

带上token参数请求成功!

带token请求

再按f12看post过滤器设置的cookie。

查看cookie

控制台:

控制台

责任编辑:姜华 来源: 今日头条
相关推荐

2022-05-20 12:14:50

2017-04-12 14:43:01

Spring ClouZuul过滤器

2022-04-11 07:34:46

OAuth2UAA节点

2021-04-20 10:15:34

Spring ClouZuul架构

2020-11-18 11:26:45

SpringCloudZuulJava

2022-04-01 10:08:21

SQL 优化MySQL数据库

2022-05-09 11:19:12

CSS函数开源

2022-05-16 10:49:28

网络协议数据

2022-05-03 22:25:57

Python浏览器语言

2022-05-11 08:22:21

服务网关架构

2022-05-26 11:37:58

亚马逊云科技C7g实例

2022-05-10 08:02:05

2022-05-16 23:13:38

边缘计算数字化转型数据

2022-05-16 10:41:40

GNOME 42Console控制台

2022-05-22 21:23:10

前端监控系统

2017-05-04 22:30:17

Zuul过滤器微服务

2022-03-14 10:12:22

架构网关技术

2022-03-04 15:19:59

Spring BooJavaVert.x

2022-05-19 14:57:30

CSS代码工具

2022-04-30 09:09:55

SecureFXSecureCRT

同话题下的热门内容

架构师必备:多维度查询的优秀实践快手一面:讲一讲 Hadoop、Hive、Spark 之间的关系?分布式系统之Sentinel介绍与使用图解 Kafka 生产者元数据拉取管理全流程链路追踪:Sleuth整合ZipKinSOA中的软件架构设计及软硬件解耦方法论链路追踪:项目整合Sleuth实现链路追踪阿里10年沉淀|那些技术实战中的架构设计方法

编辑推荐

终于有人把Elasticsearch原理讲透了!花了一个星期,我终于把RPC框架整明白了!拜托!面试不要再问我Spring Cloud底层原理陌陌基于K8s和Docker容器管理平台的架构实践收藏 | 第一次有人把“分布式事务”讲的这么简单明了
我收藏的内容
点赞
收藏

51CTO技术栈公众号