服务网关的要素

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

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

clipboard.png

clipboard.png

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...


阿南
20 声望7 粉丝