罪恶克星 发表于 2024-5-19 13:04:40

在SpringCloud2023中快速集成SpringCloudGateway网关

你好,这里是codetrend专栏“SpringCloud2023实战”。
本文主要简单介绍SpringCloud2023实战中SpringCoudGateway的搭建。
后续的文章将会介绍在微服务中使用熔断Sentinel、鉴权OAuth2、SSO等技能。
前言

网关的选型不多,目前spring支持和维护的项目是 Spring Cloud Gateway。
Spring Cloud Gateway作为一个轻量级、高性能、可定制的网关服务,具有与Spring生态系统的紧密集成、负载平衡、断路器等丰富的功能,适用于构建微服务架构中的网关层,提供统一的访问控制、路由转发和过滤处理等功能。
Gateway 具有以下优点:

[*]高度可定制性:Spring Cloud Gateway采用了一种基于过滤器链的方式来处理请求,可以根据实际需求自定义过滤器,实现对请求的各个环节进行精致化控制和处理。这种可定制性使得开辟职员可以根据具体业务场景快速构建符合需求的网关。
[*]集成简单:Spring Cloud Gateway与Spring生态系统紧密集成,特别是与Spring Boot结合使用时,可以充实使用Spring Boot的自动设置和约定大于设置的特性,简化了网关的设置和部署过程。同时,它也与其他Spring Cloud组件(如Eureka、Ribbon、Hystrix等)无缝集成,提供了美满的微服务管理能力。
[*]轻量高性能:Spring Cloud Gateway基于Reactor和WebFlux框架,采用非阻塞的异步编程模型,相比传统的Servlet容器,具有更好的性能和吞吐量。它还支持响应式编程风格,可以大概处理大量并发请求,并通过异步IO模型提供更低的延迟。
[*]内置负载平衡:Spring Cloud Gateway内置了负载平衡功能,可以根据服务实例的健康状态和负载情况自动进行请求的负载平衡。通过与服务注册中央集成,可以动态地发现和管理服务实例,实现智能路由和负载平衡。
[*]支持断路器:Spring Cloud Gateway集成了Hystrix,可以通过设置断路器模式来保护后端服务免受故障的影响。当后端服务出现故障或超时时,可以快速失败并返回预定义的错误响应,提高系统的稳固性和容错能力。
[*]动态路由:Spring Cloud Gateway支持动态路由设置,可以根据需要动态添加、删除或修改路由规则,而无需重启网关服务。这种动态路由的特性使得系统更具灵活性和可扩展性,可以大概快速顺应业务需求的变化。
前置条件


[*]网关和服务提供者都需要集成注册中央,方便使用负载平衡。
[*]使用JDK17+,这也是SpringBoot3的最低要求。
Gateway如何工作的

https://img2024.cnblogs.com/blog/1684206/202405/1684206-20240509100140130-373392742.png
这张图大概说明了网关如何工作的。
客户端向 Spring Cloud Gateway 发送请求。如果网关处理器映射确定请求匹配某个路由,则将其发送到网关 Web 处理器。该处理器将请求通过特定于请求的过滤器链。
过滤器被分为前后两部分,原因是过滤器可以在署理请求发送之前和之后运行逻辑。
所有前置过滤器逻辑都会被执行。然后发出署理请求。署理请求发出后,将运行后置过滤器逻辑。
Gateway集成

引入pom.xml


[*]引入Gateway主要是引入 spring-cloud-starter-gateway 。
[*]同时需要集成注册中央,以实现服务调用的负载平衡。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
      <groupId>io.rainforest</groupId>
      <artifactId>banana</artifactId>
      <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>banana-gateway</artifactId>
    <description>spring cloud gateway</description>
    <packaging>jar</packaging>


    <dependencies>
      
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
      </dependency>
      
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
      </dependency>
      
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
      </dependency>
      
      <dependency>
            <groupId>io.rainforest</groupId>
            <artifactId>banana-common-core</artifactId>
      </dependency>
      
      <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
      </dependency>
    </dependencies>

    <build>
      <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
      </plugins>
    </build>

</project>修改设置


[*]新增设置文件 application.yml,网关设置主要是 spring.cloud.gateway 下面的设置。
spring.application.name: gateway
spring:
cloud:
    zookeeper:
      connect-string: localhost:2181
    gateway:
      discovery:
      locator:
          enabled: false
          lowerCaseServiceId: true
      routes:
      - id: client1
          uri: lb://client1
          predicates:
            - Path=/client1/**
#          filters:
#            - StripPrefix=0
      - id: client2
          uri: lb://client2
          predicates:
            - Path=/client2/**
          filters:
            - StripPrefix=0
      - id: client3
          uri: lb://client3
          predicates:
            - Path=/client3/**
          filters:
            - StripPrefix=0
server:
port: 10100
servlet:
    context-path: /gateway

[*]spring.cloud.gateway.routes 设置不同的服务路由。
修改启动类


[*]启动类不需要特殊修改。
package io.rainforest.banana.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
        public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
        }
}调用demo

不需要修改代码就可以开箱即用Gateway。此处仅展示如何调用。
实际情况中网关还需要使用它强大的Filter来实现各种功能。
在这里Gateway就相当于一个更加强大的Nginx。只做了路由分发。

[*]通过 localhost:10100/client3/** 可以访问注册中央服务编码为client3的所有接口。
完备源码信息查看可以在gitee或者github上搜索r0ad。
关于作者

来自一线全栈步伐员nine的探索与实践,持续迭代中。
欢迎关注或者点个小红心~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 在SpringCloud2023中快速集成SpringCloudGateway网关