Spring Cloud搭建微服务架构----服务网关

API Gateway说明

API Gateway封装内部系统架构,提供API供客户端使用。涵盖功能点,如受权,监控,负载均衡,缓存,请求分片和管理,静态响应处理,请求聚合等。java

优势

很好的封装了内部应用结构,交互更简单,减小了客户端和服务端通讯次数。git

缺点

须要是一个高可用的组件,必需要开发,部署和管理,可能成为开发瓶颈。API Gateway的更新必须越轻量级越好。github

开发高效API Gateway

  • 性能和可扩展性:建立一个支持同步,非阻塞IO的API Gateway颇有意义。
  • API Gateway须要支持多种通讯方式。

演变

传统架构:spring

输入图片说明

引入eureka:缓存

输入图片说明

最终:安全

输入图片说明

ZUUL

  • 经过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代码负载均衡

相关文章
相关标签/搜索