springcloud+nacos+gateway案例

news2024/11/17 10:52:28

一、先搭建好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 Lo
        adbalancer -->
        <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-service
    profiles:
        active: dev
    cloud:
        nacos:
            discovery:
                server-addr: 192.168.139.128:8848
                group: LOCAL_GROUP
                service: ${spring.application.name}
            config:
                file-extension: yaml
                group: LOCAL_GROUP
                server-addr: 192.168.139.128:8848
        #网关配置
        gateway:
            routes:
                 - id: baidu
                  uri: http://www.baidu.com
                  predicates: #当请求的路径包含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/test
                  predicates:
                      - Path=/test
                - id: testBms #这个id只要保证唯一就好
                  uri: lb://bms-cloud-service
                  predicates:
                      - Path=/api/test/**
                  filters:
                     #将跳转路径中包含的"api"替换成空,在请求的时候必须带上api,但是在对应的服务(bms-cloud-service)转接口的时候不需要有api
                      - RewritePath=/api/(?<segment>.*),/$\{segment}
                - id: bms #这个id只要保证唯一就好
                  uri: lb://bms-cloud-service
                  predicates:
                    - 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服务上

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA解析串口协议帧4.0版本,移位寄存器实现,提供仿真文件以及源码

这里写目录标题1、前言2、4.0版本优势3、上板验证4、福利&#xff1a;工程代码的获取1、前言 FPGA解析串口协议帧3.0版本参考链接串口协议帧3.0版本 FPGA解析串口协议帧4.0版本&#xff0c;增加了错误重发功能&#xff0c;提供仿真文件以及源码 之前发布了FPGA解析串口协议帧3…

RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记

区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要&#xff1a; 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差&#xff0c;这些误差可能导致依赖人体检测器的单人姿态估计器&#xff08;SPPE&#xff09;的失败。本文提出了一种新的区域多人姿态估…

二、产品经理——【需求收集】【需求管理】

0. 学习目标 能够理解并描述需求能够收集并管理需求 1. 如何定义需求 1.1. 需求的定义 原始需求&#xff1a;没有经过任何分析&#xff0c;或者没有经过任何额外解读的需求信息 避免日后纠纷&#xff0c;尽量记录一下原始需求&#xff01;先记录下来&#xff0c;后面再进行分…

MySQL数据库(数据库约束)

目录 数据库约束 数据库约束的类型&#xff1a; null约束 &#xff1a; unique约束&#xff08;唯一约束&#xff09;&#xff1a; default约束&#xff08;默认值约束&#xff09;&#xff1a; primary key约束&#xff08;主键约束&#xff09;&#xff1a; for…

Active Directory 04 - Bronze Bit Attack (CVE-2020-17049)

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…

buuctf Basic

buuctf Basic 1.Linux Labs 根据提示我们可以知道需要远程连接linux服务器&#xff0c;这里使用xshell进行如下配置 输入ssh的用户名root&#xff0c;密码123456 连接成功 构造命令 ls …/ 查看文件 查看flag cat …/flag.txt 为flag{8fee8783-1ed5-4b67-90eb-a1d603a0208…

1信号的描述

信号的描述 1.1 连续时间与离散时间信号 一 信号 信号可以描述范围极其广泛的物理现象。信号可以分为确知信号与随机信号&#xff0c;也可以分为连续时间信号与离散时间信号。 确知信号可以表示成一个或几个自变量的函数。 信号的描述 连续时间信号 x(t), x(t1, t2)… 离散时间…

[TPAMI‘21] Heatmap Regression via Randomized Rounding

paper: https://arxiv.org/pdf/2009.00225.pdf code: https://github.com/baoshengyu/H3R 总结&#xff1a;本文提出一套编解码方法&#xff1a; 编码&#xff1a;random-round整数化 激活点响应值表征小数部分&#xff0c;使得GT可以通过编码后的heatmap解码得到&#xff1b…

flowable的变量实操及排坑

主要理解一下知识点 一、名字解释 详情解释传送门 setVariables 和 setVariablesLocal区别? 1.流程变量 在流程执行或者任务执行的过程中&#xff0c;用于设置和获取变量&#xff0c;使用流程变量在流程传递的过程中传递业务参数。 对应的表&#xff1a; act_ru_variable&…

操作系统——4.操作系统的运行机制和体系结构

这篇文章&#xff0c;我们一起来学习一下操作系统的运行机制和体系结构 目录 1.概述 2.运行机制 2.1两种指令 2.2两种处理器状态 ​编辑2.3两种程序 ​编辑2.4 操作系统运行机制小结 3.操作系统内核 ​4.操作系统的体系结构 5.小结 1.概述 首先&#xff0c;我们来看一下…

OpenResty | nginx内部发送请求

文章目录一. http请求的API二. 封装http工具函数三. CJSON工具类四. hash均衡(1) 原理(2) 实现一. http请求的API 关于OpenResty如何安装和编写业务逻辑可以参考这篇文章&#xff1a;点击跳转 nginx提供了内部API用以发送http请求&#xff1a; local resp ngx.location.capt…

听说2年以上的自动化测试都有16k+,4年10k的你还要等待奇迹吗?

个人简介学渣一枚&#xff0c;2017年6月某xx学校毕业。从事自动化测试已经4年&#xff0c;。2018年的时候&#xff0c;由于项目的原因&#xff0c;开始使用Robot Framework测试框架&#xff0c;正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理&#xff0c;…

【Vue】浅谈vue2、vue3响应式原理,vue中数组的响应式,响应式常见问题分析

前言&#xff1a;此处响应式指的是数据响应式变化&#xff0c;而不是页面的响应式布局&#xff0c;页面的响应式布局在我的其他文章中有提到。 一、什么是vue响应式 Vue 最标志性的功能就是其低侵入性的响应式系统。组件状态都是由响应式的 JavaScript 对象组成的。当更改它们…

以太网基础

1.系统概述网卡(Network Interface Card&#xff0c;简称NIC)&#xff0c;也称网络适配器&#xff0c;一个网卡主要包括OSI的最下面的两层&#xff0c;物理层和数据链路层。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等&#xff0c;并…

Ambire 最新消息——2023 年 1 月

大家好&#xff0c;这里是我们在过去几周所做的一切的快速回顾。 发展 整个钱包的交易模拟和余额预测 我们推出了一项真正改变加密钱包 UX 游戏规则的功能&#xff1a;Ambire 现在向用户显示他们的钱包余额将如何更新&#xff0c;甚至在签署交易之前。 这项新功能可以分解为 Am…

PMP证书在哪个行业比较有用?

PMP 各个行业都能用&#xff0c;PMP 的知识体系是通用的&#xff0c;管理层的考试也有借鉴PMP知识的地方。历年考生考的最多的是IT 行业&#xff0c;其他行业也都有分布。PMP认证从国外引进大陆这么多年了&#xff0c;其火热程度依然不减&#xff0c;我个人认为是取决于市场的运…

34、基于51单片机锂电池电压电流容量检测仪表LCD液晶显示 原理图PCB程序设计

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元…

水泥|物流行业停车场电动发卡机读卡器K720的维护及使用注意事项

水泥|物流行业停车场电动发卡机读卡器K720采用工业级设计&#xff0c;表面烤漆处理&#xff0c;具有良好的耐磨耐腐蚀性。适应各种高、低温&#xff0c; 多灰尘等恶劣 环境。其发卡原理为拟人型摩擦式发卡&#xff0c;对各类变形卡有非常好的适应性。预留了活动式票箱安装位&am…

MyBatis 插件 + 注解轻松实现数据脱敏

问题在项目中需要对用户敏感数据进行脱敏处理&#xff0c;例如身份号、手机号等信息进行加密再入库。解决思路就是&#xff1a;一种最简单直接的方式&#xff0c;在所有涉及数据敏感的查询到对插入时进行密码加解密方法二&#xff1a;有方法一到出现对所有重大问题的影响&#…

C++如何实现系统语言切换功能,MessageBox的确认/取消按钮语言显示如何跟程序一致

文章目录前言 一、新建工程二、添加多国语言的资源三、程序语言设置四、语言切换五、字符串处理六、MessageBox的问题七、相关函数和类型参考文章前言 目前很多软件都是要出口到多个国家&#xff0c;多个地区&#xff0c;因此&#xff0c;为软件提供多国语言支持就成为了一个基…