• 微服务-微服务API网关Spring-clould-gateway实战


    1. 需求背景

            在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?
    如果根据每个微服务的地址发起调用,存在如下问题:
            1.客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比价高
            2.认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证
            3.存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)
            4.难以重构,随着项目的迭代,可能需要重新划分微服务
    为了解决上面的问题,微服务引入了 API 网关 的概念, API 网关为微服务架构的系统提供简单、有效且 统一的 API 路由管理,作为系统的统一入口 ,提供内部服务的路由中转,给客户端提供统一的服务,可 以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流 量控制、监控日志等。

    2. 什么是Spring Cloud Gateway

            Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。

            Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。

    官网文档:Spring Cloud Gateway

    1.2 核心概念

    • 路由(route)

    路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。

    • 断言(predicates)

    Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的URL和配置的路由匹配。

    • 过滤器(Filter)

    SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。

    1.2 工作原理

            Spring Cloud Gateway 的工作原理跟 Zuul 的差不多,最大的区别就是 Gateway 的 Filter 只有 pre 和 post 两种。

    客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。

    过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器逻辑先执行,然后执行代理请求;代理请求完成后,执行 post 过滤器逻辑。

    3. Spring Cloud Gateway实战

    3.1 微服务快速接入Spring Cloud Gateway

    1) 引入依赖
    1. <!-- gateway网关 -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-gateway</artifactId>
    5. </dependency>
    6. <!-- nacos服务注册与发现 -->
    7. <dependency>
    8. <groupId>com.alibaba.cloud</groupId>
    9. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.springframework.cloud</groupId>
    13. <artifactId>spring-cloud-loadbalancer</artifactId>
    14. </dependency>

    注意:gateway会和spring-webmvc的依赖冲突,需要排除spring-webmvc

    2) 编写yml配置文件
    1. spring:
    2. application:
    3. name: mall-gateway
    4. #配置nacos注册中心地址
    5. cloud:
    6. nacos:
    7. discovery:
    8. server-addr: 127.0.0.1:8848
    9. gateway:
    10. #设置路由:路由id、路由到微服务的uri、断言
    11. routes:
    12. - id: order_route #路由ID,全局唯一,建议配置服务名
    13. uri: lb://mall
  • 相关阅读:
    在2023年使用Unity2021从Built-in升级到Urp可行么
    嵌入式Linux 开发经验:内核驱动静态编译与模块编译
    高并发研究
    二叉树的最近公共祖先
    想找手续费低的期货公司开户不难
    Java中三种方法重复使用同一输入流
    生信步骤|转录组mRNA数据的有参组装
    git常见命令和操作
    代码重构不是笑谈
    部署Jenkins服务或者SVN服务。提交操作步骤及截图
  • 原文地址:https://blog.csdn.net/weixin_43874650/article/details/136245052