当前位置: 首页 > news >正文

springcloud+nacos+gateway案例

一、先搭建好springcloud+nacos项目

地址:https://javazhong.blog.csdn.net/article/details/128899999

二、spring cloud gateway简述

Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上,目标是提供一个简洁、高效的API网关,同时也可以快速的拼装上Spring Cloud全家桶的API网关。

Spring Cloud Gateway的通信框架使用的是Netty

2.1 spring cloud gateway特征

  • 基于Spring Framework 5, Project Reactor, Spring Boot 2.0构建

  • 能够自由设置任何请求属性的路由

  • 路由可以自由设置断言(Predicates)和过滤器(Filter)

  • 可集成熔断器

  • 流量限速

  • 路径重写(rewrite)

三、spring cloud gateway网关作用

3.1 访问示意图

3.2 解释

增加了API网关以后(gateway),在API网关层可以把后端的多个服务进行整合,然后提供一个唯一的业务接口,客户端只需要调用这个接口就可以完成数据的获取和展示。而且,官网不只是做请求转发和服务整合。有了统一的网关入口以后,它还可以提供统一鉴权、限流、日志、熔断,以及统一错误码处理,针对后端多种不同协议,还可以进行协议转化

四、spring cloud流程介绍

4.1 spring cloud流程图

4.2 流程介绍

  1. 客户端发送请求给gateway

  1. 请求首先被HttpWebHandlerAdapter进行提取组装成网关上下文,

  1. 然后网关的上下文会传递到DispatcherHandler进行请求处理(DispatcherHandler是所有请求的处理分发器)

  1. DispatcherHandler负责将所有的请求分发给对应的处理器

  1. 比如分发给RoutePredicateHandlerMapping(路由断言处理映射器),路由断言映射器主要作用是进行路由查找,以及找到路由以后返回给对应的FilterWebHandler

  1. FilterWebHandler主要负责组装Filter链,并调用Filter执行一系列的Filter操作

  1. 然后再把请求转到后端对应的代理服务处理

  1. 处理完毕之后将Response返回到Gateway客户端

4.3 核心介绍

4.3.1 Filter过滤器

使用过滤器,可以在请求被路由之前或者之后对请求进行修改

过滤器按照请求和响应可以分为两种:Pre类型Post类型

Pre类型:在请求转发到微服务之前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出、协议转换等操作

Post类型:微服务处理完请求后,返回响应给网关,网关可以再次进行处理,例如可以修改响应内容、响应头、日志输出、流量监控等

按照过滤器Filter作用范围划分

GlobaFilter:全局过滤器,应用在所有路由上的过滤器

GatewayFilter:局部过滤器,应用在单个路由或一组路由上的过滤器

4.3.2 Route(路由)

构建网关的基础模块,由ID,目标URL,过滤器等组成

4.3.3 Predicate(断言)

开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言则进行路由

4.4 核心思想

路由转发+执行过滤器链

当用户发送请求达到Gateway之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个过程的转发前后,进行一些细粒度控制,其中Predicate(断言)是我们的匹配条件,Filter是一个拦截器,有了这两点,再加上URL,就可以实现一个具体的路由。

五、源码实现

按照上一篇springcloud+nacos项目,创建一个gateway模块

https://javazhong.blog.csdn.net/article/details/128899999

5.1 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><artifactId>obwt-cloud</artifactId><groupId>com.obwt</groupId><version>0.0.1-SNAPSHOT</version></parent><groupId>com.gateway</groupId><artifactId>gateway-cloud</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-cloud</name><description>gateway-cloud</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>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--mysql-connector-java--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--bootstrap 启动器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId></dependency><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- SpringCloud Loadbalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- SpringCloud Alibaba Sentinel Gateway -->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>-->
<!--        </dependency>--></dependencies><build></build></project>

5.2 bootstrap代码

server:port: 8005
spring:main:web-application-type: reactive #用于显示请求特定类型的Web应用程序标志,如果未设置,就会根据路径自行检测application:name: gateway-cloud-serviceprofiles:active: devcloud:nacos:discovery:server-addr: 192.168.139.128:8848group: LOCAL_GROUPservice: ${spring.application.name}config:file-extension: yamlgroup: LOCAL_GROUPserver-addr: 192.168.139.128:8848#网关配置gateway:routes:- id: baiduuri: http://www.baidu.compredicates: #当请求的路径包含url=baidu的时候,指向http://www.baidu.com- Query=url,baidu - id: userInfo #这个id只要保证唯一就好uri: lb://bms-cloud-service  #负载均衡 lb 是负载均衡的缩写,在注册中心找叫做bms-cloud-service服务predicates: #设置路由断言- Path=/user/** #设置路由断言,当请求包含了/user开头的接口时进行转发,比如/user/Info的时候,这条路由会生效,会去找bms-cloud-service服务上的/user/info接口- id: copeInfo #这个id只要保证唯一就好uri: http://localhost:8001 #这种方式是直接定死的静态路由,当请求localhost:8005/test的时候会转发给localhost:8001/testpredicates:- Path=/test- id: testBms #这个id只要保证唯一就好uri: lb://bms-cloud-servicepredicates:- Path=/api/test/**filters:#将跳转路径中包含的"api"替换成空,在请求的时候必须带上api,但是在对应的服务(bms-cloud-service)转接口的时候不需要有api- RewritePath=/api/(?<segment>.*),/$\{segment}- id: bms #这个id只要保证唯一就好uri: lb://bms-cloud-servicepredicates:- Path=/bms/**

5.3 controller测试代码

bms-cloud-service服务上对应的controller层测试代码

测试的时候要启动gateway-cloud-service模块和bms-cloud-service模块,但是入口就是gateway模块

@RestController
public class TestController {@GetMapping("/api/test")public String test() {return "bms的api的test";}@GetMapping("/api/test/22")public String test22() {return "bms的api的test22";}@GetMapping("/test")public String test1() {return "bms的test1";}@GetMapping("/test/test2")public String testTest() {return "bms的test2";}@GetMapping("/userInfo")public String userInfo() {return "bms的userInfo";}@GetMapping("/userInfo/user")public String userInfoUser() {return "bms的userInfo2";}@GetMapping("/user/userInfo")public String user() {return "bms的userInfo3";}@GetMapping("/user/userInfo2")public String user2() {return "bms的userInfo4";}
}

六、配置拓展

 - id: bms #这个id只要保证唯一就好uri: lb://bms-cloud-service

断言

实例

说明

Path

- Path=/api/bms/**

请求路径于/api/bms/**匹配时,该请求才能转发到bms-cloud-service服务上,比如localhost:8005/api/bms/user,那么会自动去寻找bms-cloud-service服务上的/api/bms/user接口

Before

- Before=2023-01-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒之前请求,才会转发到bms-cloud-service服务上

After

- After=2023-01-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒之后请求,才会转发到bms-cloud-service服务上

Between

- Between=2023-01-01T08:29:59.100+08:00[Asia/Shanghai],

2023-02-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒至在2023年02月01日08是29分59.100秒之间请求,才会转发到bms-cloud-service服务上

Cookie

- Cookie=name,bmsservice.cc

携带Cookie且Cookie内容为name=bmsservice.cc的请求,才会转发到bms-cloud-service服务上

Header

- Header=X-Request-ld,\d+

请求头上携带属性X-request-ld,且属性值为整数的请求,才会转发到bms-cloud-service服务上

Method

- Method=GET

只有GET请求才会被转发到bms-cloud-service服务上

相关文章:

springcloud+nacos+gateway案例

一、先搭建好springcloudnacos项目地址:https://javazhong.blog.csdn.net/article/details/128899999二、spring cloud gateway简述Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上&#xff0c;目标是提供一个简洁、高效的API网关&a…...

实习这么久,你知道Maven是如何从代码仓库中找到需要的依赖吗?

目录 碎碎念 Maven是如何找到代码仓库里需要的依赖的&#xff1f; 如何根据坐标在本地仓库中寻找所需要的依赖&#xff1f; 如何根据坐标在远程仓库中寻找所需要的依赖&#xff1f; Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项&#xff0c;请详细解释其原理…...

低代码/零代码的快速开发框架

目前国内主流的低代码开发平台有&#xff1a;宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势&#xff0c;定位也不同&#xff0c;用户可以根据自己需求选择。 一、阿里云宜搭 宜搭是阿里巴巴集团在20…...

C# 中常见的设计模式

设计模式是一套被广泛应用于软件设计的最佳实践&#xff0c;它们可以帮助开发者解决特定的问题&#xff0c;提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式&#xff0c;并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式&#xff0c…...

promethues/servicemonitor

目录 1.promethues 能保证源源不断地采集/metrics 信息吗&#xff1f;每次都是最新的吗 2.部署servicemonitor 的作用是什么&#xff1f; 3.pod 部署采集数据直接上报promthues &#xff0c;不通过servicemonitor 可以吗&#xff1f; 4.你说的"此外&#xff0c;如果部署…...

postman使用简介

1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件&#xff0c;支持几乎所有类型的HTTP请求 2、下载及安装 官方文档&#xff1a;https://www.getpostman.com/docs/v6/ chrome插件&#xff1a;chrome浏览器应用商店直接搜索添加即可&#xff08;需墙&…...

@DS注解在事务中实现数据源的切换@DS在事务中失效【已解决】

在Springboot的application.yml中的配置&#xff1a; spring:datasource:url: jdbc:mysql://localhost:3306/test2?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootdynamic:primar…...

Java I/O之文件系统

一、全文概览 在学习文件系统之前&#xff0c;需要了解下Java在I/O上的发展史&#xff1a;在Java7之前&#xff0c;打开和读取文件需要编写特别笨拙的代码&#xff0c;涉及到很多的InputStream、OutputStream等组合起来使用&#xff0c;每次在使用时或许都需要查一下文档才能记…...

Mysql元数据获取方法(information_schema绕过方法)

前提&#xff1a;如果waf或其它过滤了information_schema关键字&#xff0c;那我们该如何获取元数据呢&#xff1f;能够代替information_schema的有&#xff1a;sys.schema_auto_increment_columnssys.schema_table_statistics_with_bufferx$schema_table_statistics_with_buff…...

Eclipse快捷键

* 1.补全代码的声明&#xff1a;alt /* 2.快速修复: ctrl 1 * 3.批量导包&#xff1a;ctrl shift o* 4.使用单行注释&#xff1a;ctrl /* 5.使用多行注释&#xff1a; ctrl shift / * 6.取消多行注释&#xff1a;ctrl shift \* 7.复制指定行的代码&#xff1a;ctrl a…...

java ssm自习室选座预约系统开发springmvc

人工管理显然已无法应对时代的变化&#xff0c;而自习室选座预约系统开发能很好地解决这一问题&#xff0c;既能提高人力物力&#xff0c;又能提高预约选座的知名度&#xff0c;取代人工管理是必然趋势。 本自习室选座预约系统开发以SSM作为框架&#xff0c;JSP技术&#xff0c…...

分享我从功能测试转型到测试开发的真实故事

由于这段时间我面试了很多家公司&#xff0c;也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助&#xff0c;也希望能帮助到正在找工作的你。 找工作 我们总是草率地进入一个自己不了解的公司工作&#xf…...

TypeScript快速入门———(二)TypeScript常用类型

文章目录概述1 类型注解2 常用基础类型概述3.原始类型4 数组类型5 类型别名6.函数类型7 对象类型8 接口9 元组10 类型推论11 类型断言12 字面量类型13 枚举14 any 类型15 typeof概述 TypeScript 是 JS 的超集&#xff0c;TS 提供了 JS 的所有功能&#xff0c;并且额外的增加了…...

Mac M1 使用Centos8➕VMware Fusion进行静态网络配置

大部分的流程网络上面都有当我们已经下载好mac m1版的Centos8链接: https://pan.baidu.com/s/1UTl4Lo-_c17s-PDj3dA6kA 提取码: 7xh2 和VMware Fusionhttps://www.vmware.com/cn/products/fusion.html之后就可以进行安装了在导入过后 记得将硬盘和内存都设置好了 记得在关机状态…...

RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码

文章来源&#xff1a;NeurIPS 文章类别&#xff1a;IE(Information Extraction) RadGraph主要基于dygie&#xff0c;主要文件为inference.py。 inference.py&#xff1a; 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…...

13. OPenGL与QT界面元素交互控制图形渲染

1. 说明&#xff1a; 前面文章中讲到的 OPenGL 渲染都是在页面加载完成即立刻渲染的&#xff0c;如果向控制图形渲染的时间&#xff0c;可以在QT界面中添加一些元素来进行控制。此时需要用到OPenGL当中的makeCurrent(),update(),doneCurrent()函数。 效果展示&#xff1a; ope…...

高通平台开发系列讲解(USB篇)libuvc详解

文章目录 一、什么是UVC二、UVC拓扑结构三、libuvc的预览时序图沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍libuvc。 一、什么是UVC UVC,全称为:USB video(device) class。 UVC是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标…...

ICC2:set_route_opt_target_endpoints

route_opt阶段通过指定endpoint/driver pin list的方式执行incremental优化。 set_route_opt_target_endpoints [-setup_endpoints file] [-setup_endpoints_collection pin_list] [-hold_endpoints file] [-hold_endpoints_collection pin_list] [-ldrc_objects fil…...

5、小程序面试题

1, 小程序页面有哪些生命周期函数onLoad: 页面加载onReady: 页面初次渲染完成onShow: 页面显示onHide: 页面隐藏onUnload: 页面卸载2, 一页小程序页面有哪些文件组成,分别有什么作用.wxml: 使用微信框架设计的一套组件构建页面结构.wxss: 用于设置页面样式, 和css基本一致.js :…...

Java特殊操作流

6 特殊操作流 6.1 标注输入输出流 System类中有两个静态的成员变量&#xff1a; public static final InputStream in&#xff1a;标准输入流&#xff0c;通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&#xff1a;标准输…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...