微服务网关的总结和实践

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 微服务网关的总结和实践

本文主要介绍微服务中网关的作用,并比较了几种主流网关的区别,重点介绍了网关gateway。

一、背景介绍

微服务架构中,一个系统会被拆封成多个微服务,每个微服务可以单独对外提供服务,如果需要统一的对外服务入口则需要网关来实现,网关记录业务微服务的服务名和地址,每次调用可以正确的映射到正确的真实地址上。总的来说网关的作用有:

  1. 路由转发:外部接口对微服务的调用转发到对应的真实地址上。
  2. 鉴权认证:网关作为系统的入口,可以在进入系统前进行鉴权和认证。
  3. 流控:对于进入的流量进行控制,如果流量过大可以进行限流。
  4. 监控:针对进入的流量进行监控和告警,也可以设置黑白名单等。

常见的网关对比

  1. Zuul 1.0 : Netflix开源的网关,使用Java开发,基于Servlet架构构建,便于二次开发。因为基于Servlet内部延迟严重,并发场景不友好,一个线程只能处理一次连接请求。
  2. Zuul 2.0 : 采用Netty实现异步非阻塞编程模型,一个CPU一个线程,能够处理所有的请求和响应,请求响应的生命周期通过事件和回调进行处理,减少线程数量,开销较小。相比于zuul 1.0,zuul 2.0实现的异步非阻塞的特性,在性能上有较大提升。
  3. Gateway:是springcloud的全新API网关项目,旨在替换zuul的网关服务,基于spring framework5.0+springboot 2.0+webFlux开发,其也实现了异步非阻塞的特性,有较高的性能,其有丰富的过滤器类型,可以根据自身需求来自定义过滤器。
  4. Nginx : 使用Nginx的反向代理和负载均衡实现对API服务器的负载均衡以及高可用,一般放在整个系统的前端,进行静态资源的负载均衡。
  5. Kong : 基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,性能高效且稳定,支持多个可用插件(限流、鉴权)等,开箱即可用,只支持HTTP协议,且二次开发扩展难,缺乏更易用的管理和配置方式

二、Gateway介绍

1.基本概念

  1. Route(路由):路由是构建网关的基本模块,它是由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
  2. Predicate(断言):开发人员可以匹配HTTP请求中的所有内容(例如请求头或者请求参数),如果请求和断言相匹配则进行路由。
  3. Filter(过滤器):指的是spring框架中GatewayFiletr实例,使用过滤器,可以在请求被路由前或者后对请求进行修改。

2.主要流程

流程说明:

  1. Gateway ClientSpring Cloud Gateway 发送请求。
  2. 请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文。
  3. 然后网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
  4. RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用。
  5. 如果过断言成功,由 FilteringWebHandler 创建过滤器链并调用。
  6. 通过特定于请求的 Fliter 链运行请求,Filter 被虚线分隔的原因是Filter可以在发送代理请求之前(pre)和之后(post)运行逻辑。
  7. 执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后,将运行“post”过滤器逻辑。
  8. 处理完毕之后将 Response 返回到 Gateway 客户端。

3.过滤器

todo

4.核心思想

用户发送的请求到达Gateway后,根据请求的匹配条件来匹配真正地址,这个匹配条件可以是URL也可以是服务名,这个匹配条件即是断言(Predicate),匹配后的请求会经过一系列的过滤,这个就是过滤器起作用的时候。

三、代码实践

利用Gateway作为微服务网关,需要注册中心进行服务注册,在本次实践中,我们选用nacos作为注册中心。

1.配置pom文件

<!--Gateway网关-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- Maven整个生命周期内排除内置容器,排除内置容器导出成war包可以让外部容器运行spring-boot项目-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

pom文件主要引入spring-cloud-starter-gateway网关和spring-cloud-starter-loadbalancer负债均衡,其中可能存在以下问题:

(1)由于spring-cloud-starter-gateway采用的是响应式的WebFlux web容器,这和spring-boot-starter-web默认的web容器会冲突,所以需要排除。一般的报错信息如下:

Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.

(2)引入负债均衡spring-cloud-starter-loadbalancer需要配排除nacos中的spring-cloud-starter-netflix-ribbon,这两者会包冲突,到时无法使用服务名来进行路由转发。

2.配置文件

server:
  port: 9010
spring:
  application:
    name: test-gateway
  cloud:
    nacos:
      discovery:
        server-addr: x.x.x.x:8848
        enabled: true
    gateway:
      routes: # 网关路由配置
        - id: my-test # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://my-test # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/my-test/** # 这个是按照路径匹配,只要以/user/开头就符合要求

配置文件中主要在s p r i n g . g a t e w a y . g a t e w a y 中,其中 {spring.gateway.gateway}中,其中spring.gateway.gateway中,其中{routes.uri}表示需要转发到的URL或者服务名。

3.过滤器

@Slf4j
@Component
public class MyFilter implements Ordered, GlobalFilter {
    /**
     * @param exchange 可以拿到对应的request和response
     * @param chain 过滤器链
     * @return 是否放行
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String name = exchange.getRequest().getQueryParams().get("name").get(0);
        log.info("用户:{} 开始进入系统", name);
        if (!StringUtils.isEmpty(name)) {
            if (name.equals("noName")) {
                log.info("用户没有访问权限");
                exchange.getResponse().setStatusCode(HttpStatus.PROXY_AUTHENTICATION_REQUIRED);
                return exchange.getResponse().setComplete();
            }
        }
        return chain.filter(exchange);
    }
    /**
     * 设定过滤器的优先级,值越小则优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

如果需要在Gateway中实现过滤器,可以实现GlobalFilter接口,以上Filter是用来进行鉴权的,如果进入网关的请求没有权限就会被拦截。


TODO

  • 把过滤器的类别和作用写的更具体。

参考资料

  1. 这篇SpringCloud GateWay 详解,你用的到:https://juejin.cn/post/7107911617601339423#heading-1
  2. Spring Cloud Gateway:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter (官方文档)
  3. 14.服务网关Zuul和Gateway:https://www.cnblogs.com/wmd-l/p/16324387.html
  4. Spring Cloud Gateway过滤器配置:https://juejin.cn/post/7138740852720926733#heading-26


相关实践学习
使用CloudLens观测ALB下的网站访问情况
通过本实验,您可搭建网站,并使用ALB进行负载均衡,同时使用CloudLens for ALB一键采集ALB日志,进行ALB 7层日志分析、秒级监控指标分析、基于AIOps的自动异常巡检等操作。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
8天前
|
消息中间件 API 数据库
构建微服务架构的后端实践
【7月更文挑战第7天】本文将深入探讨微服务架构在后端开发中的应用,从微服务的理论基础出发,逐步引导读者了解如何在实际项目中设计、部署和维护一套高效的微服务系统。我们将通过一个虚构的电商平台案例,展示微服务架构的搭建过程,包括服务拆分、数据库设计、通信机制选择、容错与服务治理等关键步骤,旨在为后端开发者提供一份实战指南。
83 4
|
7天前
|
监控 安全 API
探索微服务架构中的API网关模式
【7月更文挑战第8天】在微服务架构的海洋中,API网关扮演着至关重要的灯塔角色。本文将深入探讨API网关的核心概念、设计原则以及它在现代分布式系统中的关键作用。我们将从API网关的定义和功能出发,逐步剖析其如何优化微服务之间的通信,保障服务安全,实现流量控制与监控,以及促进服务的快速迭代。通过案例分析,我们还将揭示API网关在实际部署中可能面临的挑战及应对策略。文章旨在为后端开发者和架构师提供一套完整的API网关解决方案,帮助他们构建更加高效、稳定且安全的微服务环境。
|
4天前
|
运维 Kubernetes 监控
深入解析微服务架构的演进与实践
本文旨在探究微服务架构从诞生到成熟的发展历程,分析其背后的技术推动力和业务需求,并结合具体案例,揭示实施微服务过程中的挑战与解决策略。通过对微服务架构与传统单体架构的对比,阐明微服务如何优化现代应用开发流程,提高系统的可扩展性、可维护性和敏捷性。
14 0
|
2天前
|
监控 负载均衡 安全
探索微服务架构中的API网关模式
【7月更文挑战第13天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务间的通信和客户端请求。本文将深入剖析API网关的核心作用、设计考量以及实现策略,为构建高效、可靠的分布式系统提供实践指南。
18 10
|
3天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 06 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
5天前
|
负载均衡 监控 安全
探索微服务架构中的API网关模式
【7月更文挑战第10天】在微服务的大潮中,API网关作为系统的单一入口点,承载着请求转发、负载均衡、认证授权等关键任务。本文深入探讨了API网关的设计原则、实现方式以及在微服务架构中的作用和挑战,旨在为后端开发者提供一套实用的API网关构建指南。
10 1
|
7天前
|
负载均衡 监控 安全
探索微服务架构中的API网关模式
【7月更文挑战第8天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。本文将深入探讨API网关的核心价值、设计原则以及实现策略,旨在为开发者提供构建高效、可靠API网关的实用指南。
|
11天前
|
负载均衡 安全 前端开发
深入理解微服务架构中的API网关
【7月更文挑战第4天】本文旨在探讨微服务架构中的关键组件——API网关,分析其作用、设计原则及实现方式。通过对比不同场景下的应用实例,揭示API网关在微服务生态系统中的重要性和实现细节。
21 2
|
12天前
|
运维 监控 Devops
深入理解微服务架构:从理论到实践
随着数字化转型的加速,微服务架构已成为现代软件开发的重要趋势。本文将通过数据导向和科学严谨的分析方法,探讨微服务架构的核心概念、优势与挑战,并结合逻辑严密的案例研究,揭示如何在实际项目中有效实施微服务。我们将引用权威研究和统计数据,深入解读微服务对企业技术栈的影响,同时提供一套完整的微服务实施策略,旨在帮助读者构建更加灵活、可维护的软件系统。
|
11天前
|
负载均衡 监控 安全
微服务架构中的API网关模式解析
【7月更文挑战第4天】在微服务架构中,API网关不仅是一个技术组件,它是连接客户端与微服务之间的桥梁,负责请求的路由、负载均衡、认证、限流等关键功能。本文将深入探讨API网关的设计原则、实现方式及其在微服务架构中的作用和挑战,帮助读者理解如何构建高效、可靠的API网关。