时间:2021-05-19
Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器.
Zuul功能:
Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。
配置属性 zuul.max.host.connections 已经被两个新的配置属性替代, zuul.host.maxTotalConnections (总连接数)和 zuul.host.maxPerRouteConnections,(每个路由连接数) 默认值分别是200和20.
一. 为什么要用到这个
在基于 springcloud 构建的微服务系统中,通常使用网关zuul来进行一些用户验证等过滤的操作,比如 用户在 header 或者 url 参数中存放了 token ,网关层需要 用该 token 查出用户 的 userId ,并存放于 request 中,以便后续微服务可以直接使用而避免再去用 token 查询。
二.基础知识
在 zuul 中最大的用法的除了路由之外,就是过滤器了,自定义过滤器需实现接口 ZuulFilter ,在 run() 方法中,可以用
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest();获取到 request,但是在 request 中只有 getParameter() 而没有 setParameter() 方法,所以直接修改 url 参数不可行,另外在 reqeust 中可以虽然可以使用 setAttribute() ,但是可能由于作用域的不同,在这里设置的 attribute 在后续的微服务中是获取不到的,因此必须考虑另外的方式。
三.具体做法
最后确定的可行的方法是,用
ctx.setRequest(new HttpServletRequestWrapper(request) {})的方式,重新构造上下文中的 request ,代码如下:
import javax.servlet.http.HttpServletRequestWrapper; // 在json参数中添加 userId try { InputStream in = ctx.getRequest().getInputStream(); String body = StreamUtils.copyToString(in, Charset.forName("UTF-8")); System.out.println("body:" + body); JSONObject json = JSONObject.fromObject(body); json.put("userId", userId); String newBody = json.toString(); System.out.println("newBody:" + newBody); final byte[] reqBodyBytes = newBody.getBytes(); ctx.setRequest(new HttpServletRequestWrapper(request){ @Override public ServletInputStream getInputStream() throws IOException { return new ServletInputStreamWrapper(reqBodyBytes); } @Override public int getContentLength() { return reqBodyBytes.length; } @Override public long getContentLengthLong() { return reqBodyBytes.length; } }); } catch (IOException e) { e.printStackTrace(); }思路就是,获取请求的输入流,并重写,即重写json参数。
在后续的微服务的 controller 中,可以用 形似
@RequestBody Map<String,Object> body ======= body.get("userId");这样的方式,去获取在 zuulFilter 传入的 userId
四.一些尝试
在重写 HttpServletRequestWrapper 的时候,我尝试过 重写 getParameterNames() 和 getParameterMap() 方法,希望重写 url 参数,但是并没有生效。
总结
以上所述是小编给大家介绍的springcloud 中 zuul 修改请求参数信息的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
springcloud配置智能路由zuul后转发请求指定的方法后会导致cookie无法获取的问题,主要解决方法是再application配置文件中加入sensi
前言在日常开发中,除了修改请求参数、设置响应header,响应body外,还有一种需求就是url重新,或者是修改url,这里简述一下怎么在zuul修改url。话
SpringCloudGateway服务网关API主流网关有NGINX、ZUUL、SpringCloudGateway、Linkerd等;SpringCloud
1.使用技术 Springboot,SpringCloud,Zuul,Nignx2.目的 使用Zuul搭建微服务高可用的网关3.项目创建3.1创建注册中心(
在SpringCloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离。