一般稍微复杂一点的微服务集群服务,对认证和鉴权都有统一的要求,子系统的实现可能会因为团队或部门的不同,或者基于现实的客观因素,在技术栈上有所不同。比如子系统A是基于SpringBoot技术栈的java实现的,子系统B是Python技术栈实现的,子系统C也是Java开发的但是提供Dubbo服务。系统也有可能与外部服务集成。这些都是系统的认证、认证、服务间调用、负载均衡带来的挑战。业界普遍的做法是为微服务集群设置一套网关服务。网关的实现方式有很多种,比如Nginx,还有一些开源的网关项目如Kong,Zuul,Spring Cloud Gateway等。在这里,我们不会对每个项目进行比较。我叫Spring Cloud Gateway,比较适合更复杂场景下的网关服务实现。有兴趣的朋友可以自行调用,与其他门户项目进行对比。下面我们通过Spring Cloud Gateway来说一下设计一个网关服务。
系统架构点击放大。
网关接收客户端http(s)请求或后端服务之间的调用请求,并在网关内部使用链处理。每个环节负责某个功能,如认证环节、黑白名单控制、访问日志环节、请求转发环节,其中请求转发需要根据不同的协议实现转发功能。然后统一结果处理和异常处理。
单击放大应用程序架构。
网关服务架构中的功能模块如下
基于上述功能模块需求的总体架构设计如下
点击逻辑架构放大。
采用网关分层设计,将需要自顶向下实现的功能块分布在视图层、服务层和持久层。
层:网关配置管理的用户交互视图,包括路由配置和多协议服务配置。路由是指路由转发规则的配置。基于配置的路由转发主要服务于http(s)和websocket协议服务的转发。服务配置是指非Restful服务的服务接口的配置,比如dubbo服务的producer类和producer类方法,或者gRPC服务接口的protobuf配置。基于rpc协议的dubbo服务的转发通过自定义过滤器实现,SDK依赖通过泛化调用与服务提供者解耦。
服务层:服务层提供了两个功能模块。配置管理接口实现和动态路由转发实现。
除了每条路由都要经过的过滤器这一例外,不同的协议还可以自定义自己的过滤器来实现转发。比如rpc协议服务的转发通过一个自定义过滤器实现dubbo接口的泛化调用,http(s)和websocket协议的转发地址由一个自定义负载均衡过滤器决定。
持久层:网关使用MySql持久化网关的配置数据,路由管理服务接口通过Mybatis框架集成数据库操作。同时,网关使用redis作为分布式缓存。当应用程序启动时,从Redis加载所有路由配置,并加载RouterLocator。当通过路由管理服务接口改变路由规则时,通知网关的其他服务节点通过redis更新RouterLocator对象。
单击放大配置管理逻辑。
路由配置的变化要及时更新到所有的网关服务节点,使得匹配路由配置的请求可以在任何一个网关服务节点通过代理转发,从而提高网关的可用性。我们可以通过API主动通知网关服务节点刷新配置,并监控刷新配置的结果,任何节点刷新失败都会被记录下来,以便问题跟踪。
点击放大。
在将请求转发给代理服务之前,服务发现网关需要通过负载均衡获得代理服务节点信息,负载均衡需要根据服务发现结果查询节点信息。因此,网关需要启动守护线程,每秒主动检测代理服务的健康状态,保存最新的代理服务节点信息。
点击放大。
抽象模型Spring Cloud Gateway实现了基于路由定义的定制请求处理。RouteLocator有一个id、一个目标url、一组断言和一组过滤器定义。我们可以为不同类型的路由转发定义不同的路由定位器。这些路由定位器将共享一些通用过滤器,如身份验证、黑白名单和身份验证。此外,不同的RouteLocator需要定义不同的断言和过滤器。下面是路由、过滤器、断言的抽象。
途径
路由是指网关对请求转发策略的一般定义。当网关启动时,所有定义的路由都将被初始化。网关数据模型必须包含以下数据
肯定
断言是指在执行路由规则时必须满足的条件。断言规则必须包含以下信息
过滤器
过滤器是指路由执行的截止行为。Ops-Gateway必须对每条路由执行以下过滤。
根据上述路由抽象,网关在执行不同协议的请求转发时的流程如下:
Dubbo服务请求
目标是dubbo服务的请求,网关层需要集成zookeeper实现服务发现和负载均衡。请求dubbo服务的rest请求路径断言,当请求包含服务名和方法时,它需要被路由到相应的Dubbo服务。网关只需要添加相应的路由配置,实现对广义调用dubbo服务的过滤,不需要依赖dubbo服务sdk。dubbu业务转发使用的是断言类型,所以dubbu业务转发需要实现广义的调用过滤器。
点击放大。
Http(s)和websocket服务转发
目标http(s)web服务或websocket服务,请求通过请求路径谓词,当断言为真时,继续执行filer链,其中负载均衡过滤器决定将请求路由到指定的服务地址,负载均衡断言需要定制,采用加权轮询方式实现负载均衡。
点击放大。
想了解更多关于网关和服务器的连接方式(主机的网关)的内容,请扫微信
或微信搜索jiemingpan
版权说明:本文版权由作者自行负责,如有侵权请联系本站删除。