服务网关和zuul

一个角色来充当request的请求入口,处理非业务功能的场所(防刷,协议监控)

要素:

  1. 稳定性,高可用
  2. 性能、并发性
  3. 安全性
  4. 扩展性

常用的网关方案

  1. Nginx+Lua(性能极高,事件驱动型,优化设计,扩展性,耦合低)
  2. Kong
  3. Tyk

    1. 全RestFul Api
    2. go开发
    3. 性能高
  4. Spring Cloud Zuul

    1. netflix 开发
    2. java技术栈
    3. 一代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;}
}

权限校验

  1. /order/create 只能买家访问
  2. /order/finish 只能卖家
  3. /product/list 都可以访问

区分买家和卖家(返回的时候设置)

  • 买家:

    • cookie设置 openid=abc
  • 卖家:

    • cookie 设置token=uuid ,redis 设置 key=uuid,value=xyz

实现方式

  1. Zuul:在前置过滤器中实现相关的逻辑
  2. 分布式Session Vs OAuth2

跨域解决

  1. 在被调用的类或者方法上加@CrossOrigin注解

    1. 允许cookie跨域
  2. 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相关推荐

  1. Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案

    Zuul spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL解决方案 参考文章: (1)Zuul spring clo ...

  2. Spring Cloud Zuul中使用Swagger汇总API接口文档

    有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...

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

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

  4. 关于Spring Cloud Zuul网管上传文件乱码问题

    Spring Cloud Zuul现在对于上传文件有两种处理方式,一种是用spring mvc,另一种是zuulServlet.spring mvc对文件处理不是很好,会导致乱码问题,zuulServ ...

  5. Spring Cloud Zuul The 'Access-Control-Allow-Origin' header contains multiple values

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 发布Spring Cloud Zuul的时候,前端遇到如下错误:  The 'Access-Control-Al ...

  6. Spring Cloud Zuul支持–配置超时

    Spring Cloud为Netflix Zuul提供了支持 -Netflix Zuul是用于创建具有路由和过滤功能的边缘服务的工具包. 在Spring Cloud站点上非常全面地记录了Zuul代理支 ...

  7. Spring Cloud Zuul的fallback优化

    如何在Zuul中使用fallback功能 我们在项目中使用Spring cloud zuul的时候,有一种这样的需求,就是当我们的zuul进行路由分发时,如果后端服务没有启动,或者调用超时,这时候我们 ...

  8. Spring Cloud Zuul重试机制探秘

    简介 本文章对应spring cloud的版本为(Dalston.SR4),具体内容如下: 开启Zuul功能 通过源码了解Zuul的一次转发 怎么开启zuul的重试机制 Edgware.RC1版本的优 ...

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

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

最新文章

  1. 3D原子映射有助于研究生命的起源
  2. button/input链接方式全攻略 [转]
  3. python十种日期格式_Python 日期格式相关
  4. git学习资料整理(知乎搜集的)
  5. can-utils源码解析cansend
  6. SpringMvc项目加载顺序及上下文小结
  7. idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
  8. 什么是云存储网关CSG
  9. PRML笔记:模式识别与机器学习
  10. python模拟登录人人
  11. linux下目录的基本命令
  12. 邮件里直接显示图片_利用邮件合并带图片功能批量制作准考证、工作证、成绩通知单等...
  13. 网络框架分析-全是套路
  14. 我们比任何时候都更接近梦想
  15. GDSOI2019退役祭
  16. 微信公众号的二次开发(一 订阅号没有获取网页授权的解决方法)
  17. css3 - 图标元素动画效果3 - 图标整体在Y轴上移
  18. 准考证打印电脑记录怎么删除
  19. 【日常】FIFA世界杯和历史事件
  20. N1 小钢炮docker安装迅雷方法

热门文章

  1. 新人新气象,给自己加油!
  2. 常微分方程I ODE的例子1 弹簧的振动、RLC电路与单摆
  3. 统计决策理论2 条件分布上
  4. 认识mongodb文档的动态模式
  5. ns2的第一个tcl脚本
  6. 3.软件开发的本质和基本手段
  7. UGUI 中Dropdown控件的使用经验
  8. 使用 VS2013 Update 4 编译 Notepad++ 6.8.1
  9. 团队角色测试(结果分析已公布)
  10. ASP.NET 快乐建站系列–2. Rad Controls 简介