赞
踩
服务网关作为分布式系统对外服务的统一入口,设计功能上具有路由转发、熔断限流、安全认证以及监控等功能。本文简要介绍服务网关的基本概念,以及动态路由的实现方式,以加深了解。
网关是客户端访问系统请求及系统响应所要经过的网络关口,网关封装了系统内部功能架构,为每个客户端访问提供不同的接口。网关在功能上主要是进行请求过滤,具体包括请求路由转发、安全认证、流量控制、负载均衡、日志、监控等功能。
在分布式系统尤其是微服务架构中,一个应用系统被拆分为多个服务,但是像路由请求、安全认证、流量控制、日志和监控等功能对每个服务来说都是标准的功能模块。如果没有服务网关,那么每个服务就需要单独实现一套这样的模块,功能重复并且不利于统一管理。另外,多个微服务可能部署在不同的服务器上,传统的直接访问应用服务的方式增加了客户端的复杂度,因此需要一个统一的客户端访问入口进行标准化管理。
服务网关作为客户端请求的统一入口,具备以下功能:
常见的分布式服务网关有以下几种:
在《简单聊聊Nginx实现原理》中对Nginx的功能做了简单的介绍,可以实现反向代理、负载均衡、动静分离等功能。
Kong基于OpenResty实现,OpenResty是基于Nginx的库,它将Nginx进行封装,使用Lua脚本就可以对Nginx进行插件化管理。
Zuul是来自Netflix的基于JVM的路由器和服务器端负载均衡器,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。官方定义如下:
Zuul是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。即Zuul为微服务集群提供代理、过滤和路由等功能。
Zuul会把外部的请求过程分为不同阶段,每个阶段提供一系列的过滤器。这些过滤器实现了以下功能:
Zuul的核心原理是一系列filters,在请求路由合并到用户处理逻辑的过程中,这些过滤器参与验证、加载等过滤处理。zul定义了四种标准过滤器类型,用于请求的典型生命周期。
Spring Cloud Gateway是Spring官方基于Spring5.0,Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单,有效且统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud 生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能,例如:安全,监控、埋点,限流等。
1)Spring Cloud Gateway特性
2)Spring Cloud Gateway核心概念
3)Spring Cloud Gateway核心处理流程
Spring cloud Zuul和Spring Cloud Gateway处理的都是http请求,底层是serverlet服务。不同之处有以下几点:
在实际生产使用中,Zuul 1.x虽然使用的是同步io,但是可以通过参数优化提高性能理论上可以达到极限性能,而springcloud gateway使用的是异步io,不需优化既可以达到接近极限的性能。
相比较静态路由,动态路由的好处是对路由配置的修改、新增或者删除,可以动态生效,不需要重启网关服务。这里主要介绍基于Spring Cloud Gateway的动态路由几种实现方式,包括:
Nacos集成在Spring Cloud中,提供了快速实现动态服务发现、服务配置、服务元数据及流量管理等功能。基于Nacos动态路由是通过Nacos更新修改路由配置,通过接口调用动态更新到本地缓存中。
1)加载配置和监听路由
configInfo = configService.getConfig(NACOS_ROUTE_DATA_ID, NACOS_ROUTE_GROUP, DEFAULT_TIMEOUT);
configService.addListener(dataId, group, new Listener()
2)路由的动态添加和删除
routeDefinitionWriter.delete(Mono.just(id)).subscribe()
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
3)路由信息刷新到本地缓存
publisher.publishEvent(new RefreshRoutesEvent(this));
基于数据库的动态路由实现,是将路由信息写入数据库中,再通过接口读取路由配置信息以及更新路由信息,最后刷新到本地缓存中。
基于本地内存的方式比较简单,Spring Boot已经提供了两个组件Spring Boot Admin和Spring Boot Actuator。通过调用接口更新路由信息,再刷新即可完成路由更新。
o.s.c.g.a.GatewayControllerEndpoint:
{GET /routes/{id}}: route(String)
{GET /routes}: routes()
{GET /routedefinitions}: routesdef()
{GET /globalfilters}: globalfilters()
{GET /routefilters}: routefilers()
{GET /routepredicates}: routepredicates()
{GET /routes/{id}/combinedfilters}: combinedfilters(String)
{DELETE /routes/{id}}: delete(String)
{POST /routes/{id}}: save(String,RouteDefinition)
{POST /refresh}: refresh()
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。