SpringCloud系列之网关(Gateway)应用篇

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

SpringCloud系列之网关(Gateway)应用篇

@

目录
前言
项目版本
网关访问
鉴权配置
限流配置
前言
由于项目采用了微服务架构,业务功能都在相应各自的模块中,每个业务模块都是以独立的项目运行着,对外提供各自的服务接口,如没有类似网关之类组件的话,相应的鉴权,限流等功能实现起来不能够进行统一的配置和管理,有了网关后一切都是如此的优雅。刚好新项目中采用了SpringCloud Gateway组件作为网关,就记录下项目中常用的配置吧。

项目版本
spring-boot-version:2.2.5.RELEASE
spring-cloud.version:Hoxton.SR3

网关访问
示例项目还是延续SpringCloud系列原先的示例代码,引入网关仅仅只需新增spring-cloud-gateway项目即可。
核心pom.xml(详细信息查看示例源码,在文章末尾)


org.springframework.cloud

<artifactId>spring-cloud-starter-gateway</artifactId>
AI 代码解读


bootstrap.yml

server:
port: 9005
spring:
application:

name: springcloud-gateway-service
AI 代码解读

cloud:

config:
  discovery:
    enabled: true
    service-id: config-server
  profile: dev
  label: master
gateway:
  enabled: true  #开启网关
  discovery:
    locator:
      enabled: true #开启自动路由,以服务id建立路由,服务id默认大写
      lower-case-service-id: true #服务id设置为小写
AI 代码解读

eureka:
client:

service-url:
  defaultZone: http://localhost:9003/eureka/
AI 代码解读

ApiGatewayApplication.java

@EnableDiscoveryClient
@SpringBootApplication
public class ApiGatewayApplication {

public static void main(String[] args) {
    SpringApplication.run(ApiGatewayApplication.class, args);
}
AI 代码解读

}
访问原先spring-cloud-system-server模块对外提供的接口
http://localhost:9004/web/system/getEnvName

通过网关进行访问
http://localhost:9005/system-server/web/system/getEnvName

请求能正常返回,那就说明网关组件已集成进来了,是不是很简单呢,一行配置项就搞定了,便于展现这边采用properties配置方式说明

spring.cloud.gateway.discovery.locator.enabled=true
到此网关的基础配置应用已完成,通过网关访问的请求路径格式如下
http://网关地址:网关端口/各自服务id/各自服务对外提供的URL访问

鉴权配置
这边将spring-cloud-system-server模块引入spring security安全认证组件,上代码。
pom.xml

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
AI 代码解读


application.properties

spring.security.user.name=test
spring.security.user.password=123456
服务模块调整完后,重新启动该模块,访问对外请求接口,出现认证登录界面说明配置成功。
http://localhost:9004/web/system/getEnvName

输入上述配置项中配置的用户名和密码后,接口请求返回正常。

请求网关地址,访问服务接口按下回车键时会跳转至服务项目认证页面,如下
http://localhost:9005/system-server/web/system/getEnvName

接下来对网关模块进行相应调整
bootstrap.yml

spring:
application:

name: springcloud-gateway-service
AI 代码解读

security:

user:
  name: test
  password: 123456
AI 代码解读

新增安全认证过滤类
SecurityBasicAuthorizationFilter.java

@Component
public class SecurityBasicAuthorizationFilter implements GlobalFilter, Ordered {

@Value("${spring.security.user.name}")
private String username;
@Value("${spring.security.user.password}")
private String password;

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    String auth = username.concat(":").concat(password);
    String encodedAuth = new sun.misc.BASE64Encoder().encode(auth.getBytes(Charset.forName("US-ASCII")));
    String authHeader = "Basic " +encodedAuth;
    //headers中增加授权信息
    ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().header("Authorization", authHeader).build();
    ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build();
    return chain.filter(build);
}
/**
 * 优先级
 * 数字越大优先级越低
 * @return
 */
public int getOrder() {
    return -1;
}
AI 代码解读

}
重启网关项目,重新访问服务地址,返回正常数据。这边说明下在测试时最好新开一个无痕窗口或者清理浏览器缓存后再进行测试,不然因会话缓存会导致安全认证没有生效的假象。
http://localhost:9005/system-server/web/system/getEnvName

限流配置
SpringCloud Gateway自带限流功能,但是基于redis,这边简单演示下,项目中没有使用而是使用了阿里开源的sentinel,后续将介绍下集成sentinel组件。
pom.xml

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
AI 代码解读


bootstrap.yml

spring:
cloud:

gateway:
  enabled: true  #开启网关
  discovery:
    locator:
      enabled: true #开启自动路由,以服务id建立路由,服务id默认大写
      lower-case-service-id: true #服务id设置为小写
  routes:
    - id: baidu_route
      uri: https://www.baidu.com/
      predicates:
      - Path=/baidu/**
      filters:
        - name: RequestRateLimiter
          args:
            key-resolver: "#{@apiKeyResolver}"
            redis-rate-limiter.replenishRate: 1 #允许每秒处理多少个请求
            redis-rate-limiter.burstCapacity: 5 #允许在一秒钟内完成的最大请求数
AI 代码解读

redis:

host: 192.168.28.142
pool: 6379
password: password
database: 1              
AI 代码解读

RequestRateLimiterConfig.java

@Configuration
public class RequestRateLimiterConfig {

@Bean
@Primary
public KeyResolver apiKeyResolver() {
    //URL限流,超出限流返回429状态
    return exchange -> Mono.just(exchange.getRequest().getPath().toString());
}
AI 代码解读

}
重新启动网关项目,访问如下请求地址,会请求跳转至百度首页,目前配置项配置为1s内请求数5次,超过5次就会触发限流,返回429状态码,多次刷新就会出现如下页面
http://localhost:9005/baidu/test

通过monitor命令实时查看redis信息

本次网关项目目录结构

同系列文章
1-SpringCloud系列之配置中心(Config)使用说明
2-SpringCloud系列之服务注册发现(Eureka)应用篇
示例源码

原文地址https://www.cnblogs.com/chinaWu/p/12731796.html

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
47
分享
相关文章
帮你整理好了,AI 网关的 8 个常见应用场景
通过 SLS 还可以汇总 Actiontrail 事件、云产品可观测日志、LLM 网关明细日志、详细对话明细日志、Prompt Trace 和推理实时调用明细等数据汇总,从而建设完整统一的可观测方案。
|
1月前
|
工业物联网关应用:PLC数据通过智能网关上传阿里云实战
本文介绍如何使用智能网关将工厂PLC数据传输至阿里云平台,适合中小企业远程监控设备状态。硬件准备包括三菱FX3U PLC、4G智能网关和24V电源。接线步骤涵盖PLC编程口与网关连接、运行状态检测及天线电源接入。配置过程涉及通讯参数、阿里云对接和数据点映射。PLC程序关键点包括数据上传触发和温度值处理。阿里云平台操作包含实时数据查看、数据可视化和规则引擎设置。最后提供常见故障排查表和安全建议,确保系统稳定运行。
125 1
应用网关的演进历程和分类
唯一不变的是变化,在现代复杂的商业环境中,企业的业务形态与规模往往处于不断变化和扩大之中。这种动态发展对企业的信息系统提出了更高的要求,特别是在软件架构方面。为了应对不断变化的市场需求和业务扩展,软件架构必须进行相应的演进和优化。网关作为互联网流量的入口,其形态也在跟随软件架构持续演进迭代中。我们下面就聊一聊网关的演进历程以及在时下火热的 AI 浪潮下,网关又会迸发怎样新的形态。
514 59
每一个大模型应用都需要一个 AI 网关|场景和能力
本次分享的主题是每一个大模型应用都需要一个 AI 网关|场景和能力。由 API 网关产品经理张裕(子丑)进行分享。主要分为三个部分: 1. 企业应用 AI 场景面临的挑战 2. AI 网关的产品方案 3. AI 网关的场景演示
402 1
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
160 0
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
如何使用 Spring Cloud 实现网关
如何使用 Spring Cloud 实现网关
109 3
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
338 5
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
503 1

热门文章

最新文章