微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

这篇具有很好参考价值的文章主要介绍了微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 服务路由

1.1. Zuul 接收请求:

  1. 在routes路由规则中,根据path去匹配,如果匹配中,就使用对应的路由规则进行请求转发
  2. 如果无法从routes中匹配,则根据path用“/”去截取第一段作为服务名进行请求转发,转发时,默认将第一段截取调
  3. 如果截取的服务名不在注册中心中存在服务,则报错404

1.2. Gateway 接收请求:

  1. 在routes路由规则中,根据断言(predicates)来匹配路由规则,最常用的是Path;在 zuul 中,会提供默认的 url 截取,在 Gateway 这里,需要我们主动使用 StripPrefix 过滤器来完成
  2. 如果从routes路由中,经过断言也无法匹配,则直接返回404

所以这里需要注意,如果在zuul网关有服务使用了路由转发但是没有配置,在gateway这里一定要手动配置上。

2. 过滤器

在使用 Zuul 网关中,常使用 javax.servlet.Filtercom.netflix.zuul.ZuulFilter来完成过滤器的作用。

如果改造为 Spring cloud Gateway,可使用 org.springframework.web.server.WebFilterorg.springframework.cloud.gateway.filter.GlobalFilter来完成替换。

其中 WebFilter 对应 Filter,是对路由转发+web接口调用进行过滤;而网关组件提供的过滤器,如 ZuulFilter 和 GlobaFilter,只针对路由转发进行过滤。

业务逻辑全链路异步非阻塞:
在 Spring cloud Gateway 中使用 WebFilter 和 GlobaFilter 进行过滤,所有业务逻辑和方法调用,都不能是同步阻塞的,一定得保证整个调用链路都是异步非阻塞的,否则执行会报错,因为高版本 WebFlux 中,会检测链路是否为异步非阻塞。

3. 异步非阻塞的中间件

3.1. 服务调用

因为在 Zuul 网关中,微服务的调用一般使用 Spring Cloud Openfeign 完成的,而这个组件底层是使用 HttpClient、OkHttp等 HTTP 组件来完成接口调用,是同步阻塞的;因此,我们需要改造为异步非阻塞,这里我们将使用 Webflux 提供的 WebClient 来完成。将每个微服务的 Openfeign 调用重新封装为对应的 WebClient 客户端,用于支撑异步非阻塞的 HTTP 接口调用。
因为 Spring Cloud Gateway 是基于 Spring Webflux 构造的,因为我们不需要再单独引入 Spring Webflux 依赖。

下面给一个创建 WebClient 实例的代码:
有一个注意点:需要给 WebClient 添加负载均衡的过滤器。

@Autowired
private LoadBalancedExchangeFilterFunction lbFunction;

/**
 * 创建webClient实例
 * @param webClientName 客户端名称
 * @param webClientInstanceProperties 客户端配置
 * @return webClient实例
 */
private WebClient createWebClient(String webClientName, WebClientInstanceProperties webClientInstanceProperties) {

    UnaryOperator<HttpClient> mapper = client -> {
        client.compress(true)
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, webClientInstanceProperties.getConnectTimeout());
        return client;
    };
    ReactorResourceFactory reactorResourceFactory = new ReactorResourceFactory();
    reactorResourceFactory.setLoopResources(LoopResources
            .create(webClientName + "-webclient-http-loop", webClientInstanceProperties.getSelectCount(), webClientInstanceProperties.getWorkerCount(), true));
    reactorResourceFactory.setConnectionProvider(ConnectionProvider.builder(webClientName + "-webclient-http-channel")
            .maxConnections(webClientInstanceProperties.getMaxConnections()).pendingAcquireTimeout(Duration.of(webClientInstanceProperties.getAcquireTimeout(), ChronoUnit.MILLIS)).build());
    return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(reactorResourceFactory, mapper))
            .filter(lbFunction)
            .build();
}

因为我们可能会存在多个服务调用,因此可做成可配置化。
微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点,微服务架构,微服务网关,Zuul To Gateway
微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点,微服务架构,微服务网关,Zuul To Gateway

3.2. 数据库

Zuul 网关,主要使用的数据库中间件有:MySQL、MongoDB 和 Redis。

3.2.1. 异步非阻塞MySQL

MySQL 我们可以使用 Spring Boot 提供的 spring-boot-starter-data-r2dbc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>

调用 MySQL 使用上述组件提供的ReactiveCrudRepository即可。

3.2.2. 异步非阻塞MongoDB

MondoDB 我们可以使用 Spring Boot 提供的 spring-boot-starter-data-mongodb-reactive

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

调用 MongoDB 使用上述组件提供的ReactiveMongoTemplateMongoClient即可

3.2.3. 异步非阻塞Redis

Redis 我们可以使用 Spring Boot 提供的 spring-boot-starter-data-redis-reactive

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

调用 Redis 使用上述组件提供的ReactiveRedisTemplate即可。文章来源地址https://www.toymoban.com/news/detail-727802.html

到了这里,关于微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在

    2024年02月09日
    浏览(57)
  • springboot整合spring cloud gateway搭建网关服务

    spring cloud netflix zuul、spring cloud gateway是最常见的微服务网关,通过网关,我们可以在请求到达后端指定服务之前/后端服务处理完业务响应数据之后对响应进行对请求/响应进行处理。 比如常见的参数校验、接口鉴权等等,在后端服务的拦截器和过滤器能做的事在网关都可以做

    2024年02月07日
    浏览(53)
  • Eureka上集成Spring Cloud 微服务网关 gateway

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay API 网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中

    2024年02月08日
    浏览(47)
  • 【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

    目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关

    2023年04月16日
    浏览(55)
  • Spring Cloud Gateway 服务网关的部署与使用详细介绍

    1、什么是服务网关:         传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工

    2024年02月02日
    浏览(48)
  • Spring Cloud Gateway - 新一代微服务API网关

    如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关? 因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要

    2024年02月16日
    浏览(49)
  • Spring Cloud Gateway:打造可扩展的微服务网关

    🎉欢迎来到架构设计专栏~Spring Cloud Gateway:打造可扩展的微服务网关 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限

    2024年02月08日
    浏览(72)
  • Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

    主要是为了让 k8s 识别到网关项目已经就绪,但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践,因为 Gateway 的设计初衷是专注于路由和过滤,而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以下方式进行(可根据实际需求进行扩

    2024年01月17日
    浏览(49)
  • Spring Cloud Alibaba全家桶(十)——微服务网关Gateway组件

    本文小新为大家带来 微服务网关Gateway组件 相关知识,具体内容包括 微服务网关Gateway组件 (包括: Gateway核心概念 , Gateway工作原理 ), Spring Cloud Gateway环境搭建 , 路由断言工厂(Route Predicate Factories)配置 , 过滤器工厂( Gateway Filter Factories)配置 , 全局过滤器(Glob

    2023年04月08日
    浏览(49)
  • 在Spring Cloud中使用组件Zuul网关,并注册到Eureka中去

    在上一篇中,我们搭建了Spring Cloud的父子模块,并实现了一个Eureka子模块的启动,可以通过浏览器地址去访问Eureka主页了,相信了解过的童鞋应该看到,主页上并未有任何服务去注册,那么我们就在这篇,使用zuul网关作为第一个注册到Eureka注册中心的服务吧。 上一篇博文地

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包