API网关服务:Spring Cloud Zuul

在这里插入图片描述

门面(facade)模式
门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。
门面模式提供一个高层次的接口,使得子系统更易于使用。

API Gateway的优势
1.给每个客户端一个特定的API,减少了客户端与服务端的连接,简化了客户端代码。
2.可以实现web协议和非web协议之间的转换

Zuul的优势
1.它作为系统的统一入口,屏蔽了系统内部各个微服务的细节。
2.与服务治理框架结合,实现服务实例维护以及负载均衡的路由转发。
3.实现接口权限校验与微服务业务逻辑的解耦。(如SpringSecurity只要在Zuul中使用)
4.通过服务网关过滤器,在各个生命周期中去校验请求的内容,保证了微服务的无状态性,让服务本身更关注业务逻辑处理。(如身份验证、自定义路由状态等)

Zuul请求过滤
Zuul可以通过定义过滤器来实现对请求的拦截与过滤。
通过继承ZuulFilter抽象类并实现它定义的4个抽象函数:
1.filterType():过滤器的类型,它决定过滤器在请求的那个生命周期执行。 pre、routing、post、error(绝大数是pre)
2.filterOrder():过滤器的执行顺序,它决定这个过滤器执行的优先级。 数值越小优先级越高
3.shouldFilter():判断该过滤器是否需要被执行,可以指定过滤器的有效范围。
4.run():过滤器的具体逻辑。

/**
* Zuul过滤器 实现对请求进行编码格式过滤
*/
public class CharacterEncodingFilter extends ZuulFilter {
    private static Logger logger= LoggerFactory.getLogger(CharacterEncodingFilter.class);
    @Override public String filterType() {
        return "pre";
    }
    @Override public int filterOrder() {
        return 0;
    }
    @Override public boolean shouldFilter() {
        return true;
    }
    @Override public Object run() {
        RequestContext ctx=RequestContext.getCurrentContext();
        HttpServletRequest request=ctx.getRequest();


        try {
            request.setCharacterEncoding("UTF-8");
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

Zuul路由
路由:即实现请求转发、合成和协议转换。
zuul本身带有hystirx和ribbon模块的依赖,所以Zuul天生拥有线程隔离和熔断器的自我保护功能,以及对服务调用的客户端负载均衡能力。

单实例配置

zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
zuul.routes..user-url.url=http://localhost:8000

多实例配置

zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
zuul.routes..user-url.serviceId=springcloud-eureka-client-user
ribbon.eureka.enable=false
springcloud-eureka-client-user.ribbon.listOfServers=http://localhost:8000,http://localhost:8001

服务路由配置

  • 可以保证API网关的健壮性和稳定
  • 实现Ribbon的客户端负载均衡功能
    zuul.routes.user-url.path=/user/**   #url存在这个 路由到指定客户端    
    zuul.routes..user-url.service-id=springcloud-eureka-client-user

动态路由
API网关服务是外部访问统一的入口,任何关闭和重启该组件都会导致对外服务停止,所以它必须具备动态更新内部逻辑的能力
比如动态修改路由规则和添加或者删除过滤器。
方式:
通过SpringCloudConfig连接的Git仓库存储和管理,从而实现动态刷新路由规则的功能。

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐