赞
踩
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
翻译如下:
Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。
SpringCloud主要框架:
上一篇文章已经说了SpringCloud Zuul
中的路由功能
,这篇文章解释下ZuulFilter
过滤器
zuul
的核心就是一系列的filter
先执行Pre filters
,再执行Routing filters
,最后执行Post filters
。在这三个任意一个位置出现错误,都会执行Error filters
springboot
项目,导入依赖xxx
类继承ZuulFilter
ZuulFilter
的四个方法Bean
1.创建一个springboot项目,导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.创建一个类ServiceFilter
继承ZuulFilter
,并实现以下的四个方法
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.exception.ZuulException; /** * 过滤器 */ public class BusinessFilter extends ZuulFilter { /** * 过滤类型:pre,routing,post,error * @return */ @Override public String filterType() { return null; } /** * 过滤顺序 * filterType相同过滤类型中,数值越小,优先级越高(负数也可以,0和-1,-1的优先级高) * @return */ @Override public int filterOrder() { return 0; } /** * 是否过滤,默认为false * true:执行; false:不执行 * @return */ @Override public boolean shouldFilter() { return false; } /** * 业务 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { return null; } }
3.修改BusinessFilter
过滤器
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import javax.servlet.http.HttpServletRequest; /** * 过滤器 */ public class BusinessFilter extends ZuulFilter { /** * 过滤类型:pre,routing,post,error * * @return */ @Override public String filterType() { return "pre"; } /** * 过滤顺序,数值越小,优先级越高(负数也可以,0和-1,-1的优先级高) * * @return */ @Override public int filterOrder() { return 0; } /** * 是否过滤,默认为false * true:执行; false:不执行 * @return */ @Override public boolean shouldFilter() { return true; } /** * 业务 * * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext ct = RequestContext.getCurrentContext(); HttpServletRequest request = ct.getRequest(); String authorization = request.getParameter("authorization"); if (authorization == null || authorization.isEmpty()) { ct.setSendZuulResponse(false);//返回false,不会继续向下执行 ct.setResponseBody(" 非法的请求: token is empty! ");//返回内容 ct.getResponse().setContentType("text/json;charset=utf-8"); } return null; } }
至于为什么ctx.setSendZuulResponse(false)
设置为false
就不执行,原理如下:
ctx.setSendZuulResponse(false)
告诉 Zuul
不需要将当前请求转发到后端的服务。原理体现在 shouldFilter()
方法上,源码在 org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter
中的 shouldFilter()
方法里,代码如下所示。
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
return ctx.getRouteHost() == null && ctx.get("serviceId") != null && ctx.sendZuulResponse();
}
六:测试
启动相关服务,访问
参考链接:
http://c.biancheng.net/view/5417.html
https://blog.csdn.net/qq_38526573/article/details/93209757
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。