Spring Cloud Gateway 服务网关的部署与使用详细讲解

作者:张维鹏 时间:2022-04-09 01:20:00 

一、为什么需要服务网关:

1、什么是服务网关:

        传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。那有了网关之后,能够起到怎样的改善呢?

        网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处在于:

  • (1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;

  • (2)降低函数间的耦合度。 一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性

  • (3)解放开发人员把精力专注于业务逻辑的实现。由网关统一实现服务路由(灰度与ABTest)、负载均衡、访问控制、流控熔断降级等非业务相关功能,而不需要每个服务 API 实现时都去考虑

        但是 API 网关也存在不足之处,在微服务这种去中心化的架构中,网关又成了一个中心点或瓶颈点,它增加了一个我们必须开发、部署和维护的高可用组件。正是由于这个原因,在网关设计时必须考虑即使 API 网关宕机也不要影响到服务的调用和运行,所以需要对网关的响应结果有数据缓存能力,通过返回缓存数据或默认数据屏蔽后端服务的失败。

        在服务的调用方式上面,网关也有一定的要求,API 网关最好是支持 I/O 异步、同步非阻塞的,如果服务是同步阻塞调用,可以理解为微服务模块之间是没有彻底解耦的,即如果A依赖B提供的API,如果B提供的服务不可用将直接影响到A不可用,除非同步服务调用在API网关层或客户端做了相应的缓存。因此为了彻底解耦,在微服务调用上更建议选择异步方式进行。而对于 API 网关需要通过底层多个细粒度的 API 组合的场景,推荐采用响应式编程模型进行而不是传统的异步回调方法组合代码,其原因除了采用回调方式导致的代码混乱外,还有就是对于 API 组合本身可能存在并行或先后调用,对于采用回调方式往往很难控制。

2、服务网关的基本功能:

Spring Cloud Gateway 服务网关的部署与使用详细讲解

3、流量网关与服务网关的区别:

Spring Cloud Gateway 服务网关的部署与使用详细讲解

        流量网关和服务网关在系统整体架构中所处的位置如上图所示,流量网关(如Nignx)是指提供全局性的、与后端业务应用无关的策略,例如 HTTPS证书卸载、Web防火墙、全局流量监控等。而微服务网关(如Spring Cloud Gateway)是指与业务紧耦合的、提供单个业务域级别的策略,如服务治理、身份认证等。也就是说,流量网关负责南北向流量调度及安全防护,微服务网关负责东西向流量调度及服务治理。

二、服务网关的部署:

1、主流网关的对比与选型:

Spring Cloud Gateway 服务网关的部署与使用详细讲解

 (1)Kong 网关:Kong 的性能非常好,非常适合做流量网关,但是对于复杂系统不建议业务网关用 Kong,主要是工程性方面的考虑

(2)Zuul1.x 网关:Zuul 1.0 的落地经验丰富,但是性能差、基于同步阻塞IO,适合中小架构,不适合并发流量高的场景,因为容易产生线程耗尽,导致请求被拒绝的情况

(3)gateway 网关:功能强大丰富,性能好,官方基准测试 RPS (每秒请求数)是Zuul的1.6倍,能与 SpringCloud 生态很好兼容,单从流式编程+支持异步上也足以让开发者选择它了。

(4)Zuul 2.x:性能与 gateway 差不多,基于非阻塞的,支持长连接,但 SpringCloud 没有集成 zuul2 的计划,并且 Netflix 相关组件都宣布进入维护期,前景未知。

        综上,gateway 网关更加适合 SpringCloud 项目,而从发展趋势上看,gateway 替代 zuul 也是必然的。

2、Spring Cloud Gateway 网关的搭建:

(1)声明依赖版本号:

<properties>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>

<!-- 只声明依赖,不引入依赖 -->
<dependencyManagement>
<dependencies>
<!-- 声明springBoot版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明springCloud版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 声明 springCloud Alibaba 版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

(2)添加依赖:

<!-- 引入gateway网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
       <exclusion>
<groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       </exclusion>
   </exclusions>
</dependency>

注意:一定要排除掉 spring-boot-starter-web 依赖,否则启动报错

(3)配置项目名与端口:

server:
 port: 9023
 servlet:
   context-path: /${spring.application.name}
spring:
 application:
   name: gateway

来源:https://blog.csdn.net/a745233700/article/details/122917167

标签:Spring,Cloud,Gateway,服务网关
0
投稿

猜你喜欢

  • C# WinForm开发中使用XML配置文件实例

    2022-09-07 23:04:03
  • Java递归寻路实现,你真的理解了吗

    2022-09-17 02:24:34
  • SpringBoot基于SpringSecurity表单登录和权限验证的示例

    2022-05-05 13:28:49
  • Java日常练习题,每天进步一点点(32)

    2022-04-29 07:12:53
  • springboot做代理分发服务+代理鉴权的实现过程

    2021-06-28 03:22:14
  • synchronized背后的monitor锁实现详解

    2023-07-31 08:14:10
  • Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件

    2022-06-25 19:04:23
  • android打开本地图像的方法

    2022-10-26 08:01:42
  • java实现LRU缓存淘汰算法的方法

    2022-10-09 00:09:05
  • JPA save()方法将字段更新为null的解决方案

    2023-10-28 22:29:28
  • java实现的各种排序算法代码示例

    2023-01-29 03:48:27
  • Java编程实现生成给定范围内不重复随机数的方法小结

    2022-03-21 22:45:13
  • c#自定义Attribute获取接口实现示例代码

    2022-09-02 05:05:26
  • MyBatis-Plus 集成动态多数据源的实现示例

    2023-06-26 17:56:35
  • Java的JDBC中Statement与CallableStatement对象实例

    2022-11-14 17:22:08
  • Activiti开发环境的配置

    2021-07-31 21:57:51
  • Spring注解配置实现过程详解

    2022-04-06 11:12:52
  • Java如何读取jar包中的resource资源文件

    2022-10-12 22:51:43
  • java、android可用的rtp封包解包h264案例

    2021-11-27 01:53:18
  • 解析C++中的for循环以及基于范围的for语句使用

    2023-11-16 09:59:58
  • asp之家 软件编程 m.aspxhome.com