Spring Cloud版本的若依(4)--Spring Cloud Gateway

本文介绍了Spring Cloud Gateway作为API网关的作用,用于解决微服务架构中的客户端复杂性、跨域、认证等问题。Spring Cloud Gateway作为中间层,负责监控、认证和减少客户端与微服务的交互。文中详细阐述了在若依框架中配置Gateway的过程,包括路由、验证码、限流、降级等设置,并提到了相关的配置类和过滤器处理。

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

Spring Cloud Gateway 是 Spring Cloud Finchley 版推出来的新组件,用来代替服务网关:Zuul。
API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

客户端会多次请求不同的微服务,增加了客户端的复杂性。
存在跨域请求,在一定场景下处理相对复杂。
认证复杂,每个服务都需要独立认证。
难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性,典型的架构图如图所示
在这里插入图片描述使用 API 网关后的优点如下:

  • 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
  • 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
  • 减少了客户端与各个微服务之间的交互次数。

pom.xml

<?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>
        <artifactId>cloud-zero</artifactId>
        <groupId>com.wind</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-zero-gateway</artifactId>

    <dependencies>
        <!--gateway 网关依赖,内置webflux 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--eureka 客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>

GatewayApp

package com.wind.cloud.zero.gateway;

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

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

application.yml
主要包括认证路径和API服务路径的路由,验证码处理,限流配置,降级配置

server: 
  port: 9527
 
spring: 
  application:
    name: ruoyi-gateway
  devtools:
    restart:
      enabled: true
  profiles:
    active: dev
  cloud:
    config:
      fail-fast: true
      name: ${spring.application.name}
      profile: ${spring.profiles.active}
      discovery:
        enabled: true
        service-id: ruoyi-config
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        # 认证中心
        - id: ruoyi-auth
          uri: lb://ruoyi-auth
          predicates:
            - Path=/auth/**
          filters:
            # 验证码处理
            - CacheRequest
            - ImgCodeFilter
            - StripPrefix=1
            # 限流配置
            - name: RequestRateLimiter
              args:
                key-resolver: '#{@remoteAddrKeyResolver}'
                #允许用户每秒处理多少个请求
                redis-rate-limiter.replenishRate: 2
                #令牌桶的容量,允许在一秒钟内完成的最大请求
                redis-rate-limiter.burstCapacity: 20
              # 降级配置
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: 'forward:/fallback'

        #system 模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            # 限流配置
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                key-resolver: '#{@remoteAddrKeyResolver}'
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
              # 降级配置
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: 'forward:/fallback'

eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
       defaultZone: http://eureka7001.com:7001/eureka
       #defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/      
  instance:
    instance-id:  ${spring.application.name}:${server.port}
    prefer-ip-address: true     #访问路径可以显示IP地址  

若依相关gateway类
com.ruoyi.gateway.config.CaptchaConfig 和
com.ruoyi.gateway.config.KaptchaTextCreator 处理验证码配置和生成
com.ruoyi.gateway.config.RateLimiterConfiguration 根据ip地址限流
com.ruoyi.gateway.config.RouterFunctionConfiguration 将fallback,code 请求转向对应handler
com.ruoyi.gateway.config.SwaggerProvider 配置SwaggerProvider,获取Api-doc,即SwaggerResources。

com.ruoyi.gateway.fiflt.AuthFilter 设置不需要auth 路径,用请求的token从redis 获得 userID
com.ruoyi.gateway.fiflt.ImgCodeFilter 处理校验码检查请求

com.ruoyi.gateway.handler.HystrixFallbackHandler
降级处理
com.ruoyi.gateway.handler.ImgCodeHandler
生成验证码图像
com.ruoyi.gateway.handler.SwaggerHandler
因为Gateway里没有配置SwaggerConfig,而运行Swagger-ui又需要依赖一些接口,所以自己建立相应的swagger-resource端点。这时启动Gateway,访问gateway-ip:gateway-port/swagger-ui.html时,即可正常使用swagger。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值