服务网关(Service Gateway)是微服务架构中的一个重要组件。它位于客户端和微服务集群之间,起到了请求路由、请求过滤、服务聚合等多种功能。就像是一个小区的大门保安亭,所有进入小区(微服务系统)的人和车辆(请求)都要先经过这个保安亭(服务网关)的检查和引导。
服务网关能够根据请求的内容(如 URL 路径、请求头中的参数等)将客户端请求准确地转发到对应的微服务实例上。例如,在一个电商系统中,对于以 “/products” 开头的请求,服务网关会将其路由到产品服务的微服务实例;而对于以 “/orders” 开头的请求,则会路由到订单服务的微服务实例。
服务网关可以对请求进行验证和过滤,检查请求是否包含合法的认证信息、是否符合安全策略等。比如,只有带有有效用户令牌(Token)的请求才能通过网关访问后端的微服务。还可以进行黑白名单设置,阻止某些 IP 地址或者用户代理(User-Agent)的访问。
服务网关可以将多个微服务的响应组合成一个完整的响应返回给客户端。以一个在线旅游应用为例,当客户端请求一个旅游套餐的详细信息时,服务网关可能需要从酒店服务、航班服务、景点服务等多个微服务获取数据,并将这些数据整合在一起,形成一个完整的旅游套餐信息响应返回给客户端。
服务网关可以在不同的通信协议之间进行转换。比如,客户端可能通过 HTTP 协议发送请求,而服务网关可以将其转换为后端微服务所使用的其他协议(如 gRPC 等)来进行通信,从而实现系统内部不同协议的兼容。
Spring Cloud Gateway 是基于 Spring Boot 2.x 和 Spring WebFlux 构建的服务网关。它提供了一种简单而有效的方式来实现请求路由和过滤。通过配置路由规则,可以轻松地将请求转发到不同的微服务。
Zuul 是 Netflix 开源的一个服务网关组件。它可以嵌入到 Spring Boot 应用中,提供了请求过滤和路由的功能。在 Zuul 中,可以通过编写过滤器来实现请求的前置处理和后置处理。
服务网关为微服务系统提供了一个统一的入口点,使得客户端不需要了解后端微服务的具体位置和细节。这简化了客户端的开发,因为客户端只需要与服务网关进行交互,就像所有的快递都只送到小区的快递驿站(服务网关),居民(客户端)不需要知道每个包裹具体是从哪个仓库(微服务)发出来的。
没有服务网关:
有服务网关:
如上图,客户端只需要知道服务网关的地址就可以调用所有服务,而不需要知道所有具体服务的地址。
通过集中的请求过滤,可以更好地实施安全策略,如身份验证、授权和防止恶意攻击等。例如,在服务网关处可以统一检查用户的权限,避免未授权的用户访问敏感的微服务。
服务网关可以实现缓存功能,对于一些频繁访问且数据变化不大的内容(如系统配置信息、热门商品信息等)进行缓存。当客户端请求这些内容时,直接从缓存中获取,而不需要每次都请求后端微服务,从而提高了系统的整体响应速度。
服务网关作为流量的入口,可以对进出的流量进行监控。通过监控可以及时发现系统的性能瓶颈、异常流量以及潜在的安全威胁。例如,如果突然出现大量来自特定 IP 地址的请求,可能是遭受了 DDoS 攻击;或者如果某个微服务的请求流量长时间处于高位,可能意味着该微服务需要进行性能优化或扩容。
点击下载/查看本教程相关资料或者源代码。