springcloud 网关过滤器Zuul Filter

为什么需要网关过滤器?

  微服务架构体系中,通常一个业务系统会有很多的微服务,

  比如:OrderServiceProductServiceUserService...

  为了让调用更简单,一般会在这些服务前端再封装一层,

  

  类似下面这样:

  

  前面这一层俗称为“网关层”,其存在意义在于,将"1N"问题 转换成了"11”问题(路由),

  同时在请求到达真正的微服务之前,可以做一些预处理(过滤),

  比如:登录验证,日志打印...

 

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; }

配了就行了。重启服务。

猜你喜欢

转载自www.cnblogs.com/bigbigxiao/p/12122052.html