为什么需要网关过滤器?
微服务架构体系中,通常一个业务系统会有很多的微服务,
比如:OrderService、ProductService、UserService...,
为了让调用更简单,一般会在这些服务前端再封装一层,
类似下面这样:
前面这一层俗称为“网关层”,其存在意义在于,将"1对N"问题 转换成了"1对1”问题(路由),
同时在请求到达真正的微服务之前,可以做一些预处理(过滤),
比如:登录验证,日志打印...
Filter 的生命周期
Filter 的生命周期有 4 个,分别是
“PRE(前置过滤器)”:该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等;
“ROUTING(路由选择)”:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service;
“POST(后置过滤器)” :该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。
“ERROR(错误过滤器)”:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。
整个生命周期可以用下图来表示
"coustom"是自定义过滤器。
搭建过滤器
1.创建个网关微服务。zuul-server-20001(2001是端口号方便看)
2.在prm.xml导入zuul依赖包
<!--zuuljar包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
3.在配置类中添加注解 @EnableZuulProxy;
@EnableZuulProxy这个注解是开启网关
@SpringBootApplication //加上网关注解 @RestController @EnableZuulProxy public class ZuulServerApplication { @RequestMapping("/") public String show(){ return "你好网关"; } public static void main(String[] args) { SpringApplication.run(ZuulServerApplication.class, args); } }
4.在yml里添加配置,注意网关也要指定注册中心地址。
#自定义路由映射zuul: routes: #你微服务的名字:/随便来个别名/你的微服务api orders-server1: /order/** orders-server: /order/** user-server: /user/** prefix: "/" #禁止所有服务使用服务名访问 ignored-services: "*"
启动网关服务,就行了。
如果要自定义过滤器在网关微服务中建个类继承zuulfilter
/** * 这是网关的自定义过滤器 */ @Component public class LoginZuulFilter extends ZuulFilter { @Override public String filterType() { //这个过滤器设置为前置过滤器 return "pre"; } @Override public int filterOrder() { return 1; } /** * 次方法返回true,就执行下面的run方法 * @return */ @Override public boolean shouldFilter() { //获取请求上下文 RequestContext context = RequestContext.getCurrentContext(); //获取当前请求对象 HttpServletRequest request = context.getRequest(); //获取请求路径 String requestURI = request.getRequestURI(); //判断是否含有login路径,有就return turn if(requestURI.toUpperCase().contains("LOGIN")){ return false; } return true; } /** * 在run方法中添加业务逻辑 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { //获取请求上下文 RequestContext context = RequestContext.getCurrentContext(); //获取当前请求对象 HttpServletRequest request = context.getRequest(); //获取当前响应对象 HttpServletResponse response = context.getResponse(); //获取头信息 String tokin = request.getHeader("x-tokin"); //判断tokin是否存在 if(tokin==null){ HashMap<Object, Object> map = new HashMap<>(); map.put("booter",false); map.put("massage","亲登录"); String s = JSON.toJSONString(map); try { response.getWriter().write(s); } catch (IOException e) { e.printStackTrace(); } //阻止放行 context.setSendZuulResponse(false); } return null; }
配了就行了。重启服务。
原文地址:https://www.cnblogs.com/bigbigxiao/p/12122052.html