API Gateway说明
API Gateway封装内部系统架构,提供API供客户端使用。涵盖功能点,如授权,监控,负载均衡,缓存,请求分片和管理,静态响应处理,请求聚合等。
优点
很好的封装了内部应用结构,交互更简单,减少了客户端和服务端通信次数。
缺点
需要是一个高可用的组件,必须要开发,部署和管理,可能成为开发瓶颈。API Gateway的更新必须越轻量级越好。
开发高效API Gateway
- 性能和可扩展性:创建一个支持同步,非阻塞IO的API Gateway很有意义。
- API Gateway需要支持多种通信方式。
演变
传统架构:
引入eureka:
最终:
ZUUL
-
通过Ribbon进行负载均衡;
-
通过继承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; }}