Spring Cloud -Zuul
服务网关和zuul
一个角色来充当request的请求入口,处理非业务功能的场所(防刷,协议监控)
要素:
- 稳定性,高可用
- 性能、并发性
- 安全性
- 扩展性
常用的网关方案
- Nginx+Lua(性能极高,事件驱动型,优化设计,扩展性,耦合低)
- Kong
Tyk
- 全RestFul Api
- go开发
- 性能高
Spring Cloud Zuul
- netflix 开发
- java技术栈
- 一代zuul不能和nginx比性能
项目改造应该合理利用原有的优势
特点:
路由+过滤器=Zuul
核心是一系列的过滤器
四种过滤器
- 前置
- 路由
- 后置
- error
使用
导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
开启注解@EnableZuulProxy
@EnableEurekaClient
@EnableZuulProxy
yml
spring:application:name: zuulcloud:config:discovery:service-id: CONFIGenabled: trueprofile: dev
server:port: 8085
eureka:client:service-url:defaultZone: http://localhost:8761/eureka
zuul:routes:
# /myProduct/product/list -> /product/list
# aaa:
# path: /myProduct/**
# serviceId: PRODUCT
#简洁写法product: /myProduct/**
# 排除某些路由 set的写法ignored-patterns:- /**/myProduct/product/list#用来查看配置
management:security:enabled: false
{{zuul}}/application/routes
查看配置
cookie和动态路由
Cookie
默认是不开启cookie的
全局开启
zuul:sensitive-headers:
开启方式:
zuul:routes:
# /myProduct/product/list -> /product/list
# aaa:
# path: /myProduct/**
# serviceId: PRODUCT
#简洁写法product: /myProduct/**sensitive-headers:
动态路由(cloud config +cloud bus)
@Component
public class ZuulConfig {@Autowired@ConfigurationProperties("zuul")public ZuulProperties zuulProperties() {return new ZuulProperties();}
}
特点
- 路由+过滤器=Zuul
- 核心是一系列的过滤器
典型应用场景
前置
- 鉴权
- 过滤
后置
- 统计
- 日志
Zuul的高可用
多个节点注册到Eureka Server上
Nginx 和Zuul"混搭"
前置和后置过滤器
前置过滤
package com.zzjson.apigateway.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/*** <p>****************************************************************************</p>* <p><b>Copyright © 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description : com.zzjson.apigateway.filter</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/
@Component
public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return PRE_DECORATION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {//不通过requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;}
}
order 的值越小,优先级越高
后置过滤
package com.zzjson.apigateway.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletResponse;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SEND_RESPONSE_FILTER_ORDER;/*** <p>****************************************************************************</p>* <p><b>Copyright © 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description : com.zzjson.apigateway.filter</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/
@Component
public class AddResponseFilter extends ZuulFilter {@Overridepublic String filterType() {return POST_TYPE;}@Overridepublic int filterOrder() {return SEND_RESPONSE_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletResponse response = requestContext.getResponse();response.setHeader("surprise", "xx");return null;}
}
限流
限流保护,防止网络攻击
时机:请求被转发之前调用
令牌桶限流
package com.zzjson.apigateway.filter;import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import com.zzjson.apigateway.exception.RateLimiterException;
import org.springframework.stereotype.Component;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;/*** <p>****************************************************************************</p>* <p><b>Copyright © 2010-2018 rollBall team All Rights Reserved<b></p>* <ul style="margin:15px;">* <li>Description :限流拦截器</li>* <li>Version : 1.0.0</li>* <li>Creation : 2018年10月19日</li>* <li>@author : zzy0_0</li>* </ul>* <p>****************************************************************************</p>*/
@Component
public class RateLimiterFilter extends ZuulFilter {private static final RateLimiter rateLimiter = RateLimiter.create(1);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return SERVLET_DETECTION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {//没有取到令牌if (!rateLimiter.tryAcquire()) {throw new RateLimiterException();}return null;}
}
权限校验
- /order/create 只能买家访问
- /order/finish 只能卖家
- /product/list 都可以访问
区分买家和卖家(返回的时候设置)
买家:
- cookie设置 openid=abc
卖家:
- cookie 设置token=uuid ,redis 设置 key=uuid,value=xyz
实现方式
- Zuul:在前置过滤器中实现相关的逻辑
- 分布式Session Vs OAuth2
跨域解决
在被调用的类或者方法上加
@CrossOrigin
注解- 允许cookie跨域
Zuul里面增加CrosFilter过滤器
@Configuration public class CrosConfig {@Beanpublic CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();final CorsConfiguration config = new CorsConfiguration();//是否支持cookie跨域config.setAllowCredentials(true);//是否支持原始域 http://www.baidu.comconfig.setAllowedOrigins(Collections.singletonList("*"));config.setAllowedHeaders(Collections.singletonList("*"));config.setAllowedMethods(Collections.singletonList("*"));//设置缓存时间config.setMaxAge(300L);source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}}
代码地址: https://gitee.com/zzy0_0/api-gateway
Spring Cloud -Zuul相关推荐
- Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案
Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案 参考文章: (1)Zuul spring clo ...
- Spring Cloud Zuul中使用Swagger汇总API接口文档
有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- 关于Spring Cloud Zuul网管上传文件乱码问题
Spring Cloud Zuul现在对于上传文件有两种处理方式,一种是用spring mvc,另一种是zuulServlet.spring mvc对文件处理不是很好,会导致乱码问题,zuulServ ...
- Spring Cloud Zuul The 'Access-Control-Allow-Origin' header contains multiple values
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 发布Spring Cloud Zuul的时候,前端遇到如下错误: The 'Access-Control-Al ...
- Spring Cloud Zuul支持–配置超时
Spring Cloud为Netflix Zuul提供了支持 -Netflix Zuul是用于创建具有路由和过滤功能的边缘服务的工具包. 在Spring Cloud站点上非常全面地记录了Zuul代理支 ...
- Spring Cloud Zuul的fallback优化
如何在Zuul中使用fallback功能 我们在项目中使用Spring cloud zuul的时候,有一种这样的需求,就是当我们的zuul进行路由分发时,如果后端服务没有启动,或者调用超时,这时候我们 ...
- Spring Cloud Zuul重试机制探秘
简介 本文章对应spring cloud的版本为(Dalston.SR4),具体内容如下: 开启Zuul功能 通过源码了解Zuul的一次转发 怎么开启zuul的重试机制 Edgware.RC1版本的优 ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
最新文章
- 3D原子映射有助于研究生命的起源
- button/input链接方式全攻略 [转]
- python十种日期格式_Python 日期格式相关
- git学习资料整理(知乎搜集的)
- can-utils源码解析cansend
- SpringMvc项目加载顺序及上下文小结
- idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
- 什么是云存储网关CSG
- PRML笔记:模式识别与机器学习
- python模拟登录人人
- linux下目录的基本命令
- 邮件里直接显示图片_利用邮件合并带图片功能批量制作准考证、工作证、成绩通知单等...
- 网络框架分析-全是套路
- 我们比任何时候都更接近梦想
- GDSOI2019退役祭
- 微信公众号的二次开发(一 订阅号没有获取网页授权的解决方法)
- css3 - 图标元素动画效果3 - 图标整体在Y轴上移
- 准考证打印电脑记录怎么删除
- 【日常】FIFA世界杯和历史事件
- N1 小钢炮docker安装迅雷方法