【Gateway】网关服务快速上手

news/2025/1/15 12:20:41/

微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性服务端实现的微服务接口通常都带有一定的权限校验机制,由于使用了微服务,原本一个应用的的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,我们需要修改多个应用,加重了开发人员的负担。

针对以上问题,一个常用的解决方案就是使用API网关

1. 什么是API网关

API网关(简称网关)也是一个服务,通常是后端服务的唯一入口.它的定义类似设计模式中的Facade模式(门面模式,也称外观模式).它就类似整个微服务架构的门面,所有的外部客户端访问,都需要经过它来进行调度和过滤.

网关的核心功能

  • 权限控制: 作为微服务的入口,对用户进行权限校验,如果校验失败则进行拦截
  • 动态路由:一切请求先经过网关,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务
  • 负载均衡: 当路由的目标服务有多个时,还需要做负载均衡
  • 限流: 请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大
类似前台的⼯作
1. 权限控制: ⾝份验证
2. 动态路由: 根据外来客⼾的需求, 把客⼾带到指定的部⻔去处理
3. 负载均衡: ⼀个部⻔有很多⼈时, 前台会帮客⼾选择具体某个⼈处理
4. 限流: 公司到访客⼾较多时, 进⾏流量限制, ⽐如告知明天再来

2. 常见的网关实现

业界常⽤的⽹关⽅式有很多, 技术⽅案也较成熟, 其中不乏很多开源产品, ⽐如Nginx, Kong, Zuul,
Spring Cloud Gateway等. 下⾯介绍两种常⻅的⽹关⽅案.
Zuul
Zuul 是 Netflix 公司开源的一个API网关组件,是Spring Cloud Netflix 子项目的核心组件之它可以和 Eureka、Ribbon、Hystrix等组件配合使用.在Spring Cloud Finchley正式版之前, Spring Cloud推荐的网关是Netflix提供的Zuul(此处指Zuul 1.X)然而Netflix在2018年宣布一部分组件进入维护状态,不再进行新特性的开发,这部分组件中就包含Zuul.

Spring Cloud Gateway

Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,基于Spring+SpringBoot等技术开发,目的是为了替换掉Zuu!.旨在为微服务架构提供一种简单而有效的途径来转发请求,并为他们提供横切关注点,比如: 安全性,监控/指标和弹性。
在性能方面,根据官方提供的测试报告,Spring Cloud Gateway的RPS(每秒请求数)是Zuul的1.6倍.测试报告参考: https://github.com/spencergibb/spring-cloud-gateway-bench

3. Spring cloud gateway

3.1 快速上手

3.1.1 创建网关项目

API⽹关也是⼀个服务.

3.1.2 引入依赖

<!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--负载均衡--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

3.1.3 编写启动类

java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class , args);}
}

 3.1.4 添加Gateway的路由配置

server:port: 10030 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:discovery:server-addr: nacosIp:端口gateway:routes: # 网关路由配置- id: product-service # 路由ID, 自定义, 唯一即可uri: lb://product-service # 目标服务地址predicates: # 路由条件- Path=/product/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**

3.1.5 测试

启动网关服务。

1. 通过网关服务访问product-service,http://127.0.0.1:10040/product/1001

url符合yml文件中配置的 /product/**规则,路由转发到product-service: http://product-service/product/1001

通过网关服务的日志,可以观察到,网关服务从Nacos获取服务列表

2024-09-12T17:32:13.372+08:00  INFO 3356 --- [t.remote.worker] com.alibaba.nacos.common.remote.client   : [9f9c4461-ebf3-41cd-b9ee-17605253a90b] Notify connected event to listeners.
2024-09-12T17:32:13.372+08:00  INFO 3356 --- [t.remote.worker] com.alibaba.nacos.client.naming          : Grpc connection connect
2024-09-12T17:32:13.372+08:00  INFO 3356 --- [           main] com.alibaba.nacos.common.remote.client   : [9f9c4461-ebf3-41cd-b9ee-17605253a90b] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$ConnectResetRequestHandler
2024-09-12T17:32:13.374+08:00  INFO 3356 --- [           main] com.alibaba.nacos.common.remote.client   : [9f9c4461-ebf3-41cd-b9ee-17605253a90b] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$$Lambda$845/0x000002623b5a34f8
2024-09-12T17:32:13.376+08:00  INFO 3356 --- [           main] com.alibaba.nacos.client.naming          : [REGISTER-SERVICE] fcc2c221-085b-4864-bff4-f1f18f734cb0 registering service gateway with instance Instance{instanceId='null', ip='192.168.5.1', port=10040, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='DEFAULT', serviceName='null', metadata={IPv6=[2001:0:2851:b9f0:24d7:f521:fe3d:44e3], preserved.register.source=SPRING_CLOUD}}
2024-09-12T17:32:13.421+08:00  INFO 3356 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP gateway 192.168.5.1:10040 register finished
2024-09-12T17:32:13.498+08:00  INFO 3356 --- [           main] com.guan.gateway.GatewayApplication      : Started GatewayApplication in 8.144 seconds (process running for 9.467)
2024-09-12T17:41:02.993+08:00  INFO 3356 --- [oundedElastic-1] com.alibaba.nacos.client.naming          : [SUBSCRIBE-SERVICE] service:product-service, group:DEFAULT_GROUP, clusters: 
2024-09-12T17:41:03.079+08:00  INFO 3356 --- [oundedElastic-1] com.alibaba.nacos.client.naming          : init new ips(1) service: DEFAULT_GROUP@@product-service -> [{"instanceId":"192.168.5.1#9090#BJ#DEFAULT_GROUP@@product-service","ip":"192.168.5.1","port":9090,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"BJ","serviceName":"DEFAULT_GROUP@@product-service","metadata":{"preserved.register.source":"SPRING_CLOUD","IPv6":"[2001:0:2851:b9f0:24ce:ef45:fe3d:44e3]"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2024-09-12T17:41:03.090+08:00  INFO 3356 --- [oundedElastic-1] com.alibaba.nacos.client.naming          : current ips:(1) service: DEFAULT_GROUP@@product-service -> [{"instanceId":"192.168.5.1#9090#BJ#DEFAULT_GROUP@@product-service","ip":"192.168.5.1","port":9090,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"BJ","serviceName":"DEFAULT_GROUP@@product-service","metadata":{"preserved.register.source":"SPRING_CLOUD","IPv6":"[2001:0:2851:b9f0:24ce:ef45:fe3d:44e3]"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2024-09-12T17:41:03.615+08:00  INFO 3356 --- [.42.168.168-161] com.alibaba.nacos.common.remote.client   : [9f9c4461-ebf3-41cd-b9ee-17605253a90b] Receive server push request, request = NotifySubscriberRequest, requestId = 3
2024-09-12T17:41:03.616+08:00  INFO 3356 --- [.42.168.168-161] com.alibaba.nacos.common.remote.client   : [9f9c4461-ebf3-41cd-b9ee-17605253a90b] Ack server push request, request = NotifySubscriberRequest, requestId = 3

2. 通过网关访问order-service

http://127.0.0.1:10040/order/1

url符合yml文件中配置的 /order/**规则,路由转发到product-service: http://product-order/product/1


http://www.ppmy.cn/news/1526030.html

相关文章

数据脱敏 (Jackson + Hutool 工具包)

一、简介 系统使用 Jackson 序列化策略&#xff0c;对标注了 Sensitive 注解的属性进行脱敏处理 基于Hutool 脱敏案列&#xff1a; Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) JacksonAnnotationsInside// 表示只对有此注解的字段进行序列化 JsonSeriali…

【超详细】Plaxis软件简介、 Plaxis Python API环境搭建、自动化建模、Python全自动实现、典型岩土工程案例实践应用

查看原文>>>【案例教程】PLAXIS软件丨自动化建模、典型岩土工程案例解析、模型应用、数据分析、图表制作 目录 第一部分&#xff1a;Plaxis软件简介及 Plaxis Python API环境搭建 第二部分&#xff1a;Plaxis自动化建模-基础案例 第三部分&#xff1a;进阶案例-Pyt…

neo4j docker 运行4.35 community 版本失败

运行脚本 sudo docker run -d \ --name container_name \ -p 27474:7474 \ -p 27687:7687 \ -v /home/neo4j/data:/data \ -v /home/neo4j/logs:/logs \ -v /home/neo4j/conf:/var/lib/neo4j/conf \ -v /home/neo4j/import:/var/lib/neo4j/import \ -v /home/lighthouse/tcmkg…

redis常见的数据类型?

参考&#xff1a;一文读懂Redis五种数据类型及应用场景 - 知乎 (zhihu.com) String 类型 String 类型&#xff1a;Redis 最基本的数据类型&#xff0c;它是二进制安全的&#xff0c;意味着你可以用它来存储任何类型的数据&#xff0c;如图片、序列化对象等。使用场景&#xff…

智慧交通基于yolov8的行人车辆检测计数系统python源码+onnx模型+精美GUI界面

【算法介绍】 智慧交通中&#xff0c;基于YOLOv8的行人车辆检测计数系统是一项高效、准确的技术解决方案。该系统利用YOLOv8这一先进的目标检测算法&#xff0c;结合深度学习技术&#xff0c;能够实时检测并准确计数道路上的行人和车辆。YOLOv8在保证检测速度的同时&#xff0…

SprinBoot+Vue爱老助老服务平台的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

oracle 表的外键

表的外键 3.5.1表之间的三种关系 在数据库设计中&#xff0c;工作中经常会分析商业逻辑中的表的设计。在设计表的关系之前&#xff0c;需要先了解关系型数据库特点。关系数据库有如下特点&#xff1a; 关系型数据库采用了关系模型来组织数据的数据库。 关系型数据库的最大特点…

C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?

前文讲完了在C#中线程怎么创建&#xff0c;怎么删除&#xff0c;怎么启动&#xff0c;怎么阻止。 现在来看看线程本身的属性。 当前线程 首先要获得当前线程&#xff0c;才能获取线程信息&#xff0c;此属性用于获取当前运行的线程。此属性可用于获取代码当前执行所在的线程…