乐趣区

Spring-Cloud-服务网关Zuul

服务网关的要素

  • 稳定性
  • 安全性
  • 性能,并发性
  • 扩展性
    Spring Cloud Zuul

     - 路由 + 过滤器
     - 核心是一系列的过滤器
     

Zuul 路由配置

management:
    security:
        enabled: false // 权限设置
zuul: 
    routes:
        # myProduct:    // 这个名称可以随便填
        #     path: /myProduct/**
        #     serviceId: product
        #     sensitiveHeader: // 敏感头过滤
        # 简洁写法
        product: /myProduct/**
    ignored-patterns: 
        - /**/product/listForOrder // 不对外部访问(- 代表 set 集合)
 查看所有的路由规则:localhost:port/application/routes
{
    /myProduct/**: "product",
    /config/**: "config",
    /product/**: "product",
}
   

Zuul 配置的动态注入 (也可以写入启动类中)

@Compoent
public class ZuulConfig{@ConfigurationProperties("zuul")
    @RefreshScope
    public ZuulProperties zuulProperties(){return new ZuulProperties();
    }
}

典型应用场景

前置过滤器

 - 限流
 - 鉴权
 - 参数校验调整 

后置过滤器

- 统计
- 日志

要想实现 Filter,需要以下几个步骤:

1、继承 ZuulFilter 类,为了验证 Filter 的特性,我们这里创建 3 个 Filter

根据用户名来过滤

package com.chhliu.springcloud.zuul;  
  
import javax.servlet.http.HttpServletRequest;  
  
import com.netflix.zuul.ZuulFilter;  
import com.netflix.zuul.context.RequestContext;  
  
public class AccessUserNameFilter extends ZuulFilter {  
    @Override  
    public Object run() {RequestContext ctx = RequestContext.getCurrentContext();  
        HttpServletRequest request = ctx.getRequest();  
  
        System.out.println(String.format("%s AccessUserNameFilter request to %s", request.getMethod(), request.getRequestURL().toString()));  
  
        String username = request.getParameter("username");// 获取请求的参数  
        if(null != username && username.equals("chhliu")) {// 如果请求的参数不为空,且值为 chhliu 时,则通过  
            ctx.setSendZuulResponse(true);// 对该请求进行路由  
            ctx.setResponseStatusCode(200);  
            ctx.set("isSuccess", true);// 设值,让下一个 Filter 看到上一个 Filter 的状态  
            return null;  
        }else{ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由  
            ctx.setResponseStatusCode(401);// 返回错误码  
            ctx.setResponseBody("{\"result\":\"username is not correct!\"}");// 返回错误内容  
            ctx.set("isSuccess", false);  
            return null;  
        }  
    }  
  
    @Override  
    public boolean shouldFilter() {return true;// 是否执行该过滤器,此处为 true,说明需要过滤}  
  
    @Override  
    public int filterOrder() {return 0;// 优先级为 0,数字越大,优先级越低}  
  
    @Override  
    public String filterType() {return "pre";// 前置过滤器}  
} 

参考:https://www.cnblogs.com/a8457…

退出移动版