轻量级的Spring Cloud Gateway实践,实现api和websocket转发

当国内大部分都是粘贴复制一些重型框架时,有没有人会想到,我们自己做一个小项目,几个小的Spring boot的项目时,我们是否还需要按部就班的用我们公司中用到的Nacos,这种冗余且调配复杂的组件呢?

不是本人说什么得罪同行的话。

很多程序员在开发和编码过程中,很少自己去真正的研究一个框架和组件,他们大部分的工作只是在自己接手的项目上缝缝补补罢了。

假如某一天,老板或者有个客户说,【我想要做一个项目,加钱好说,那么你是否能真正的独立完成一个项目框架吗?】

那么我们从API路由开始,尝试做一个轻量级的实践。

1. Spring Cloud Gateway

今天我们来实现Spring Cloud Gateway,我们首先了解一下Spring Cloud Gateway是什么东东:

Spring Cloud Gateway 是 Spring Cloud 生态系统的一部分,提供了简单、有效的方式来路由到API,并为它们提供跨域处理、安全、监控/指标和弹性。

  • Route(路由): 网关的基本构件。它由一个ID、一个目的地URI、一个谓词(Predicate)集合和一个过滤器(Filter)集合定义。如果集合谓词为真,则路由被匹配。

  • Predicate(谓词): 这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这让你可以在HTTP请求中的任何内容上进行匹配,比如header或查询参数。

  • Filter(过滤器): 这些是 GatewayFilter 的实例,已经用特定工厂构建。在这里,你可以在发送下游请求之前或之后修改请求和响应。

添加图片注释,不超过 140 字(可选)

客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配,它将被发送到Gateway Web处理程序。这个处理程序通过一个特定于该请求的过滤器链来运行该请求。过滤器被虚线分割的原因是,过滤器可以在代理请求发送之前和之后运行逻辑。所有的 "pre" (前)过滤器逻辑都被执行。然后发出代理请求。在代理请求发出后,"post" (后)过滤器逻辑被运行。

2.实现

我们来新建简单的Maven一个工程,在pom.xml代码中引入Gateway。


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

我们再简单的写一个main来启动工程看一看。


@Slf4j
@EnableDiscoveryClient
@SpringBootApplication
@PropertySource("classpath:config/application.properties")
public class GateWayServiceApplication {

    /**
     * <b>功能描述:</b>启动<br>
     * <b>修订记录:</b><br>
     */
    public static void main(String[] args) {
        SpringApplication.run(GateWayServiceApplication.class, args);
        log.info("网管服务启动成功");
    }
}

点击启动,结果是启动不起来的,为什么呢?

我们父级pom,都会引入spring-boot-starter-web组件,可是web组件内,基本都是使用tomcat来作为服务发布内置组件,这里我还做了更改,我希望我的整个项目使用undertow。

那么怎么来更改呢?

父级pom,排除Tomcat使用undertow,您也可以不使用unsertow,直接使用tomcat的话,不用exclusions也无需引入undertow。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

那么在Gateway内如何更改呢?

Gateway使用 Spring WebFlux 作为服务,那么我们需要去除undertow或者Tomcat,使用WebFlux.

更改示例如下:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果在父级项目还引入了Eureka,那么我们还需要排除Eureka内的web服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </exclusion>
    </exclusions>
</dependency>

重新启动项目,这下就可以完美启动了。

3. 跨域请求

接下来,我们所有的配置所属都在配置中进行,在我们日常开发中,经常会被跨域请求绞挠的难受,网络充斥着大量的无用cors跨域配置。

那么我们看下如何在Gateway中如何正确的配置跨域。

spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentials=true
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[0]=http://localhost:8080
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[1]=http://localhost:8081
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[2]=http://localhost:63343
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers=*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]=OPTIONS
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[1]=GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[2]=POST
spring.cloud.gateway.globalcors.cors-configurations.[/**].max-age=3600

以上就是跨域配置,只需要在allowed-origins数组内添加需要跨域的链接,即可解决跨域问题。

4. API路由配置转发

#设置路由id
spring.cloud.gateway.routes[0].id=manager-server
#设置路由的uri
spring.cloud.gateway.routes[0].uri=lb://manager-server
#设置路由断言,代理servicerId为manager-server的/gb/路径
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/manager/**

使用routes数组来增加路由API的增减。

5. WebSocket配置转发

#设置路由id
spring.cloud.gateway.routes[2].id=manager-server-socket
#设置路由的uri
spring.cloud.gateway.routes[2].uri=lb:ws://manager-server
#设置路由断言,代理servicerId为manager-server的/exchange/路径
spring.cloud.gateway.routes[2].predicates[0]=Path=/ws/**

这里我们要记住,socket路由转发是配合SockJS的,假如使用普通的websocket似乎有一些困难哦。

SockJS实现可以参考网络内容SockJS+StompJS实现websocket,它也是很好的实现哦。

如上,我们基本实现了API及websocket、跨域等基础问题的解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考报考指南

目录 了解软考 选择报考级别与专业 关注报考时间 完成报名手续 准备考试 参加考试 查询成绩与领取证书 了解软考 官网链接&#xff1a;中国计算机技术职业资格网 软考&#xff0c;即计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;是由国家人…

广州网站建设如何吸引用户眼球

随着互联网技术的发展&#xff0c;现在广州的大多数企业或品牌都会打造高质量的网站&#xff0c;以便更好地宣传&#xff0c;在网站建设过程中&#xff0c;前端网站设计至关重要&#xff0c;主要体现在排版和布局上&#xff0c;高大尚的网站建设并不是将所有模块内容堆放在首页…

中仕公考:教师招聘和事业单位联考的区别

教师招聘考试与事业单位联考作为两种不同的职业资格考试&#xff0c;其在报考条件和考试内容上存在明显的差异&#xff0c;具体内容为大家简要介绍一下&#xff1a; 一、报考条件 1. 教师招聘考试&#xff1a;此类考试的报名通常要求申请者持有相关教师资格证明。对于非师范生…

使用阿里云试用Elasticsearch学习:Search Labs Tutorials 搭建一个flask搜索应用

文档&#xff1a;https://www.elastic.co/search-labs/tutorials/search-tutorial https://github.com/elastic/elasticsearch-labs/tree/main/example-apps/search-tutorial Full-Text Search

酷开系统让用户在方方面面享受科技进步带来的美好体验

电视本身的特性&#xff0c;再有人工智能和全时AI的加持&#xff0c;让搭载了酷开系统的电视有能力成为一个“家庭智慧管控中心”。互联网的存在让大家能更懒地完成事情&#xff0c;满足宅家的愿望&#xff0c;有话说&#xff0c;科技因懒人而进步。打个简单的比方&#xff0c;…

人工智能研究生前置知识—扩展程序库Pandas

人工智能研究生前置知识—扩展程序库Pandas pandas简介 Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。 pandas的官网&#xff1a;https://pandas.…

护眼台灯哪个牌子最好,护眼台灯品牌排行榜分享

​护眼台灯哪个牌子最好&#xff1f;尽管一些家长可能对护眼台灯还不甚了解&#xff0c;下面我将介绍这类台灯的几个显著优势&#xff1a;它们专为减少眼睛疲劳和保护视力而设计&#xff0c;提供稳定且柔和的光线&#xff1b;具备灵活的亮度调节功能&#xff0c;适应不同的阅读…

springCloudAlibaba集成seata实战(分布式事物详解)

一、分布式事务 1. 事务介绍 1.1 基础概念 事务&#xff1a;保证我们多个数据库操作的原子性&#xff0c;多个操作要么都成功要么都不成功 事务ACID原则 A&#xff08;Atomic&#xff09;原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部…

linux之shell命令

shell基础命令 浏览Linux 文件系统 Linux 系统目录结构 /bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &…

论文略读:Benign Oscillation of Stochastic Gradient Descent with Large Learning Rate

iclr 2024 reviewer评分 368 论文从理论上研究了通过随机梯度下降&#xff08;SGD&#xff09;且采用大学习率训练的神经网络&#xff08;NN&#xff09;的泛化特性论文的发现是&#xff0c;由于SGD的大学习率引起的NN权重的振荡&#xff0c;实际上有利于NN的泛化&#xff0c;…

如何用CRMEB Pro版企业微信功能做私域运营

过去3年&#xff0c;线下实体零售发展坎坷&#xff0c;线上经济趁机扩展&#xff0c;出现了社交电商、私域电商等多种电商类型。其中&#xff0c;私域电商备受关注&#xff0c;众多企业纷纷开始尝试&#xff0c;在广大企业商家做私域运营的过程中&#xff0c;企业微信以其强大的…

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第52讲。 病毒繁殖&#xf…

BLE一些概念 (转载)

原文见 https://www.cnblogs.com/wahahahehehe/p/15094324.html 1. 物理信道 低功耗蓝牙的工作频段为2.4GHz&#xff0c;这个唯一一个在所有国家都无需授权的频段。 BLE将2.4GHz频段分为40个RF射频信道&#xff0c;每个信道2M宽度&#xff0c;最低的中心频率为2402MHz&#x…

水库之大坝安全监测系统解决方案

一、系统介绍 水库之大坝安全监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装置、防雷设备&#xff09;、附件&#xff08;电缆、通信线路、电源线路&#xff09;等组成&a…

为什么每个程序员都应经历一次软考?

今天想和大家讨论一个问题&#xff0c;为什么每个程序员都应经历一次软考&#xff1f; 软考是最近几年比较热门的一个国家级考试&#xff0c;但其实80%的人都只是去凑热闹&#xff0c;是去为国家软考办做贡献的。 有因为各种各样的原因直接缺考的&#xff0c;有是为了一些学习以…

java 将 json 数据转为 java 中的对象

一、准备 json 数据 {"name": "mike","age": 17,"gender": 1,"subject": ["math","english"] }二、对应的java对象 package com.demo.controller;import lombok.Data; import java.util.List;Data pu…

若依 ruoyi-vue el-select 多选框 全选 反选 全不选 查询功能

参考文章vueel-select下拉实现&#xff1a;全选、反选、清空功能 如图&#xff0c;优化代码&#xff0c;支持若依字典 import multipleSelect from /components/MultipleSelect/index.vuecomponents: { multipleSelect },<el-row><el-form-item label"分管领域…

ETL中如何运用好MQ消息集成

一、ETL的主要作用 ETL&#xff08;Extract, Transform, Load&#xff09;是数据仓库中的关键环节&#xff0c;其主要作用是将数据从源系统中抽取出来&#xff0c;经过转换和清洗后加载到数据仓库中。具体而言&#xff1a; Extract&#xff08;抽取&#xff09;&#xff1a;从…

python爬虫 - 爬取图片

文章目录 1、爬取图片示例1&#xff1a;使用 .urlretrieve() 函数2、爬取图片示例2 - 使用 open/write 函数3、爬取图片示例33.1 使用 open/write 下载3.2 使用 urlretrieve下载 爬虫的本质&#xff1a;模拟对应的App&#xff0c;浏览器访问对应的地址获取到数据 1、爬取图片示…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…