三、Gateway实现负载均衡


Gateway实现负载均衡

通过Gateway实现负载均衡有两种方式,一种是自动的负载均衡,一种是手动的负载均衡。

自动负载均衡

Gateway还提供了和Zuul类似的自动路由规则,具体配置如下:

  1. discovery.locator.enabled= true 这个配置默认为false,但是如果为true,就是开启了通过serviceId转发到具体的服务实例。即:“localhost:9999/ServiceID/demo/**”。

    所以我们修改一下cloud-gateway-service-9999网关服务的application.yml配置,屏蔽掉网关的路由的routes配置

    server:
      port: 9999
    spring:
      application:
        name: cloud-gateway-service
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        gateway:
          discovery:
            locator:
              enabled: true #开启注册中心路由功能
              #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
    #      routes:  # 路由
    #        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
    #          uri: http://localhost:9001/nacos-provider # 匹配提供服务的路由地址
    #          predicates: # 断言
    #            - Path=/demo/** # 断言,路径相匹配进行路由
    

    在这里插入图片描述

  2. 在配置好这些以后,重启服务,我们可以直接通过服务名称来进行访问Nacos中注册的服务和对应的接口,例如:http://localhost:9999/nacos-provider/demo/hello(中间多了一个服务名称:/nacos-provider)

在这里插入图片描述

在这里插入图片描述

  1. Gateway在开启了自动路由之后,自带负载均衡

    首先,我们再创建一个服务demo-9002

在这里插入图片描述

具体配置如下:

pom文件:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>spring-cloud-gateway</artifactId>
        <version>0.0.1-SNAPSHOT</version>
<!--        <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
    </parent>
    <groupId>com.son</groupId>
    <artifactId>demo-9002</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

application.yml配置:

server:
  port: 9002
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
management:
  endpoint:
    web:
      exposure:
        include: '*'

由于此服务也是配合Nacos使用,所以启动器要加上@EnableDiscoveryClient注解:

在这里插入图片描述

新建DemoController文件,里面的hello方法与springcloudalibaba-nacos-9001服务中的DemoController保持一致:

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo") //路由路径
public class DemoController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/hello")
    public String getServerPort(){
        return "Hello! port: "+ serverPort;
    }
}

然后我们将cloud-gateway-service-9999网关服务,以及2个微服务springcloudalibaba-nacos-9001、demo-9002启动起来

接着,我们访问地址:http://localhost:9999/nacos-provider/demo/hello, 可以看到是走的9001服务

在这里插入图片描述

接着,我们刷新页面再次访问,可以看到是走的9002服务,所以Gateway在开启了自动路由之后(discovery.locator.enabled=true)自带负载均衡功能

在这里插入图片描述

手动负载均衡

在以上的配置中,其实是有问题的,问题在于当前的服务名称暴露,并且太过于灵活,那么如果想解决的话,其实我们可以进行手动配置(将uri配置中的http改为lb,lb代表开启负载均衡)。

修改一下cloud-gateway-service-9999网关服务的application.yml配置:

server:
  port: 9999
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider # 匹配提供服务的路由地址 lb://代表开启负载均衡
          predicates: # 断言
            - Path=/demo/** # 断言,路径相匹配进行路由

注意:如果我们配置了discovery.locator.enabled= true,并且配置了路由routes规则之后,会根据predicates断言地址匹配对应的服务,就不会走自动路由配置。

接着,我们重启网关服务cloud-gateway-service-9999,然后访问:http://localhost:9999/demo/hello

在这里插入图片描述

再次访问:

在这里插入图片描述

此时,就实现了手动的负载均衡,服务名称就被隐藏了。

Gateway路由中uri的三种配置方式

上面我们讲到了http方式和lb注册中心服务方式,其实还有一种websocket方式

在gateway中配置uri配置有三种方式,包括:

http方式

gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: http://localhost:9001/nacos-provider
          predicates: # 断言
            - Path=/demo/** # 断言,路径相匹配进行路由

websocket方式

gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: ws://localhost:8888
          predicates: # 断言
            - Path=/demo/** # 断言,路径相匹配进行路由

注册中心服务方式

gateway:
      discovery:
        locator:
          enabled: true #开启注册中心路由功能
          #是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能
      routes:  # 路由
        - id: nacos-provider #路由ID,没有固定要求,但是要保证唯一,建议配合服务名
          uri: lb://nacos-provider
          predicates: # 断言
            - Path=/demo/** # 断言,路径相匹配进行路由
### 网关负载均衡实现方式 在微服务环境中,网关作为入口点负责将外部请求分发至内部各服务实例。为了提高系统的可用性和响应速度,通常会在网关层实施负载均衡机制。 #### 使用 Spring Cloud Gateway 和 Ribbon 实现负载均衡 当采用 `Spring Cloud Gateway` 结合 `Ribbon` 进行负载均衡时,可以通过简单的配置让 API 请求自动分布到多个相同功能的服务节点上去处理。具体来说: - **定义服务名称**:确保目标服务已经在 Eureka Server 上完成注册,并能够被其他组件识别。 - **设置 URI 协议前缀为 lb://**:这意味着每当遇到此类形式的目标地址时,系统就会启用内置的负载均衡逻辑来挑选合适的服务实例执行调用操作[^2]。 ```yaml spring: cloud: gateway: routes: - id: order_route uri: lb://ORDER-SERVICE predicates: - Path=/order/** ``` 这段 YAML 文件片段展示了如何声明一条通往名为 ORDER-SERVICE 的路径规则,其中的关键在于 `uri: lb://ORDER-SERVICE` 表达式的运用,表明此路由下的流量将会经过负载均衡器传递给相应的后端服务实例。 #### 编写自定义负载均衡策略 除了默认提供的几种常见算法外,还可以基于业务需求开发个性化的调度方案。例如,在 User 应用程序内编写特定于应用程序上下文环境下的负载均衡策略,并利用注解将其绑定到 Order 服务上以便观察其行为模式[^1]。 对于更复杂的场景,则可以考虑引入额外的技术栈如 Netflix OSS 中的 Hystrix 断路器等功能模块进一步增强整个体系结构的安全性和稳定性。 #### 支持多种负载均衡算法 支持不同类型的负载均衡算法有助于适应多样性的应用场景。常见的算法包括但不限于轮询、随机选取、最少活跃连接数优先等。这些都可以通过调整配置文件中的参数轻松切换或组合使用[^4]。 ```java @Bean public IRule ribbonRule() { return new RandomRule(); // 更改此处以选择不同的负载均衡策略 } ``` 上述 Java 代码展示了一个简单的方式去改变默认使用的负载均衡规则——这里选择了随机分配的方式代替标准的轮询法。 ### 配置示例 下面给出一个完整的例子说明怎样在一个典型的 Spring Boot 工程里快速搭建起具备基本负载均衡能力的网关服务: 1. 添加依赖项至项目的 build.gradle 或 pom.xml 文件中; 对于 Gradle 用户而言: ```groovy implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' ``` 2. 修改 application.yml (或 .properties),指定必要的属性值; 如前所述,重点是要把待访问资源的位置指明为带有 lb:// 前缀的形式。 3. 启动项目并验证效果。 最后提醒一点,虽然实现了基础的功能,但在生产环境下还需要关注更多细节方面的工作比如健康检查、熔断保护等等措施来保障整体服务质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹峰的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值