SpringCloud Gateway在转发请求时的两种负载均衡的方式

文章讲述了如何在基于k8s和springcloud的分布式环境中,使用springcloudgateway作为网关进行服务暴露和负载均衡配置。通过nacos或eureka实现服务注册发现,通过gateway的配置文件设置路由规则,利用StripPrefix过滤器处理请求路径。同时提到了使用k8s的service进行负载均衡的选项,需要注意service端口的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近在搭建基于k8s和springcloud的分布式开发集群。需要用到springcloud gateway来做网关。在配置网关服务的时候,遇到了点小坑,记录下。

我们的需求是,将集群里的服务统一通过gateway对外暴露端口,并在gateway里做相应的处理,如打印日志,设置请求头,接口验签,限流降级等。

业务服务在内网通过ingress暴露url,提供集群外访问,地址如:http://${user-ingress-url}/user-service/api/v1/xxxx

对外网通过gateway暴露接口,地址如:https//${gateway-url}/gw/user-service/api/v1/xxxx

接下来需要做的事情是,通过配置gateway的配置文件application.yaml,通过服务注册发现组件和k8s的service来分别实现请求转发的负载均衡能力。

使用服务注册发现组件,如nacos或者eureka

不管是用nacos还是eureka做服务注册发现,在gateway侧的配置都是一样的,下面以nacos举例。假设有个服务user-service注册在了nacos上:
 

 那么,对应gateway的application.yaml配置如下:
 

spring:
  cloud:
    gateway:
      # 设置与服务注册发现组件结合,这样可以采用服务名的路由策略
      discovery:
        locator:
          enabled: true
      # 配置路由规则
      routes:
        # 采用自定义路由 ID(有固定用法,不同的 id 有不同的功能,详见:https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters)
        - id: user-service
          # 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在 Nacos 上的服务名
          uri: lb://user-service
          predicates:
            - Path=/user-service/**
          filters:
            # StripPrefix是url过滤器,1表示请求转发给后端业务服务时,去掉上面Path里从左往右的第1个路径,即user-service
            - StripPrefix=1

使用k8s自带的service

由于业务服务是基于k8s托管的,所以天然支持负载均衡,可以在gateway中调用业务服务对应的service地址即可。配置如下:

spring:
  cloud:
    gateway:
      # 配置路由规则
      routes:
        # 采用自定义路由 ID(有固定用法,不同的 id 有不同的功能,详见:https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters)
        - id: user-service
          # 采用k8s的service,user-service即为业务服务通过service暴露的url,端口是80
          uri: http://user-service
          predicates:
            - Path=/user-service/**
          filters:
            # StripPrefix是url过滤器,1表示请求转发给后端业务服务时,去掉上面Path里从左往右的第1个路径,即user-service
            - StripPrefix=1

注意: 使用k8s自带service提供负载均衡时,业务服务的service端口最好保持在80,保证gateway能顺利将请求转发到业务服务上,这里貌似不支持service:port的形式(需要进一步研究源码看下)

### Spring Cloud Gateway 请求转发负载均衡的实现方式 Spring Cloud Gateway 是一个基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 的 API 网关。它提供了路由、过滤和负载均衡等功能,能够高效地处理 HTTP 请求并将其转发到目标服务[^1]。 #### 1. 请求转发的实现 当客户端向 Spring Cloud Gateway 发送请求,网关会根据预定义的路由规则匹配请求,并将请求转发到指定的目标服务。具体流程如下: - 客户端发送请求Spring Cloud Gateway。 - Gateway Handler Mapping 检查请求是否匹配某个路由规则。 - 如果匹配成功,则请求会被发送到 Gateway Web Handler。 - Gateway Web Handler 将请求通过特定的过滤器链进行处理后,最终将请求转发至目标服务[^4]。 #### 2. 负载均衡的实现 Spring Cloud Gateway 内置了对负载均衡的支持,主要通过以下两种方式实现: - **集成注册中心**:Spring Cloud Gateway 可以与服务注册中心(如 Nacos、Eureka 等)集成。当网关接收到请求,它会从注册中心获取目标服务的所有可用实例,并使用内置的负载均衡策略选择其中一个实例进行转发[^3]。 - **引入 spring-cloud-starter-loadbalancer**:为了支持更灵活的负载均衡策略,可以引入 `spring-cloud-starter-loadbalancer` 依赖。该依赖提供了一个基于反应式编程模型的负载均衡器,能够在不依赖特定客户端(如 RestTemplate 或 WebClient)的情况下完成负载均衡[^2]。 以下是配置 Spring Cloud Gateway 实现负载均衡的一个简单示例: ```yaml spring: cloud: gateway: routes: - id: service_route uri: lb://service-name predicates: - Path=/service/** ``` 在上述配置中,`lb://service-name` 表示使用负载均衡方式访问名为 `service-name` 的服务。网关会自动从服务注册中心获取所有可用实例,并选择其中一个进行请求转发。 #### 3. 自定义负载均衡策略 如果默认的负载均衡策略无法满足需求,可以通过扩展 `LoadBalancerClient` 接口或自定义 `ReactorLoadBalancer` 来实现个性化的负载均衡逻辑。例如,可以根据地理位置、权重或其他业务指标来选择目标实例[^1]。 ### 示例代码 以下是一个简单的 Spring Cloud Gateway 配置代码,展示了如何结合 Nacos 注册中心实现负载均衡: ```java @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } } @Configuration public class GatewayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("service_route", r -> r.path("/service/**") .uri("lb://service-name")) .build(); } } ``` 在上面的代码中,`uri("lb://service-name")` 表示使用负载均衡方式访问 `service-name` 服务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值