API Gateway封装内部系统架构,提供API供客户端使用。涵盖功能点,如受权,监控,负载均衡,缓存,请求分片和管理,静态响应处理,请求聚合等。java
很好的封装了内部应用结构,交互更简单,减小了客户端和服务端通讯次数。git
须要是一个高可用的组件,必需要开发,部署和管理,可能成为开发瓶颈。API Gateway的更新必须越轻量级越好。github
传统架构:spring
引入eureka:缓存
最终:安全
经过Ribbon进行负载均衡;springboot
经过继承ZuulFilter实现请求过滤;架构
package com.springbootdemo.eureka.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; /** * Created by Administrator on 2017/4/18. * * 安全过滤器,验证请求中是否有accessToken参数 */ public class AccessFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(AccessFilter.class); /** * 表明不一样的过滤类型: * pre:请求以前调用; * routing:在路由请求时调用; * post:在routing和error过滤器以后被调用; * error:在处理错误是调用; * @return */ @Override public String filterType() { return "pre"; } /** * 经过int值定义过滤器执行顺序; * @return */ @Override public int filterOrder() { return 0; } /** * 返回boolean类型判断过滤器是否执行; * @return */ @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString())); Object accessToken = request.getParameter("accessToken"); if(accessToken == null) { log.warn("access token is empty"); ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); return null; } log.info("access token ok"); return null; } }
ZUUL代码负载均衡