《springcloud alibaba》 五 gateway网关

news2025/3/1 1:26:11

目录

  • gateway基础版本
    • pom.xml
    • application.yml
    • 启动类
    • 测试
  • gateway集成nacos
    • order-nacos和stock-nacos项目微调
    • cloud-gateway调整
    • 测试
  • gateway集成nacos简写版本
  • 内置断言
  • 自定义断言工厂
    • 规范
  • 全局过滤器
  • gateway流控降级
    • pom.xml
    • application.yml
    • 测试
    • 流控具体配置
      • api流控
    • 降级
      • 代码版本方式一
      • 配置方式二

为什么要用gatewary

一般微服务项目,都是十来个服务器,大家想一下,如果我需要做限流,鉴权、项目调用参数日志等等,总不可能每个服务器都做一遍,这就也是我们要用网关的原因。

  • 注意: 本文请引入父项目依赖
    在这里插入图片描述
    项目下载地址

gateway基础版本

第一步先创建cloud-gateway模块

pom.xml

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
  • 引入gateway是cloud开发的,所以只要在父项目中引入cloud后,这里是不需要指定版本的

application.yml

server:
  port: 8088
spring:
  application:
    name: cloud-gateway

  cloud:
    gateway:
      routes:
        ## 路由唯一id
        - id: order
          ## 需要转发的地址
          uri: http://localhost:8021
          ### 断言用于路由的匹配
          predicates:
            - Path=/order-service/**
          ## 转发去掉第一层路径
          filters:
            - StripPrefix=1

  • 因为只是测试一下转发,所以暂时写死http://localhost:8021,正常应该是服务名,不然,订单服务集群后,这里一直该来该去的
  • 8021是order项目的端口,之前是8001,因为端口冲突,调整成8021

启动类

package com.lcs.springcloud;

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);
    }
}

测试

运行order以及stock项目
在这里插入图片描述

  • 注意调整一下order的端口为8021,不然启动会报端口已存在的错

输入http://localhost:8088/order-service/order/add
在这里插入图片描述

  • 说明网关已初步完成

gateway集成nacos

order-nacos和stock-nacos项目微调

在这里插入图片描述

  • 忘了order和stock项目都没有集成nacos配置,所以,改为用order-nacos,和stock-nacos项目
  • 注意: order-nacos和stock-nacos这两个项目,之前nacos的端口写的8860,现在调整为8848
    在这里插入图片描述
  • 类似于这个图

cloud-gateway调整

server:
  port: 8088
spring:
  application:
    name: cloud-gateway

  cloud:
    #配置nacos
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
    gateway:
      discovery:
        locator:
          # 是否启动自动识别的nacos服务
#          enabled: true
      routes:
        ## 路由唯一id
        - id: order
          ## 需要转发的地址 lb表示使用nacos里面本地负载均衡策略
          uri: lb://order-service
          ### 断言用于路由的匹配
          predicates:
            - Path=/order-service/**
          ## 转发去掉第一层路径
          filters:
            - StripPrefix=1

在这里插入图片描述

  • bak的配置文件,是基础版本的
  • yml是基础nacos版本的

测试

输入http://localhost:8088/order-service/order/add/1访问订单接口

  • 8088 是gateway的端口
  • order-service 是路由
  • /order/add/1 是接口地址
  • 说明集成nacos是成功的

gateway集成nacos简写版本

在gateway集成nacos的代码版本上,只修改yml的配置

server:
  port: 8088
spring:
  application:
    name: cloud-gateway

  cloud:
    #配置nacos
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
    ## gateway配置
    gateway:
      discovery:
        locator:
          ## 是否自动识别nacos服务
          enabled: true

在这里插入图片描述

  • 删除了之前配置的断言、 过滤器等一堆代码,就简单的一行代码,做了很多的事。这就是所谓的约定大约配置,但是不太推荐使用,代码可阅读信比较差
  • 在这里插入图片描述
  • application.bak.yml 基本版本配置
  • application.nacos.yml 跟nacos集成版本配置
  • application.yml 跟nacos集成版本,简写配置

简写后,我们通过gateway怎么访问项目
以前的第一级别路径,变成我们要调用项目的服务名
在这里插入图片描述
在这里插入图片描述

  • 标红就是第一次级别服务名
  • 访问后,能返回结果,说明成功,记得重启gateway项目,如果觉得是不是上一次gateway修改后,是不是没有生效的原因,可以修改order-nacos的服务名来进行测试。

内置断言

当我们通过调用gateway时,匹配成功就路由转发,匹配失败,就404报错

内置断言别人博客地址

自定义断言工厂

idea中按住shift,两次
输入QueryRoute
在这里插入图片描述
在这里插入图片描述
点击抽象类,输入
Ctrl + Alt + B,可以跳转到实现该方法的类
在这里插入图片描述

规范

  1. 必须被spring容器管理
  2. 类名以RoutePredicateFactory结尾
  3. 必须集成AbstractRoutePredicateFactory
  4. 必须声明静态内部类
  5. 结合shortcutFieldOrder来进行绑定
  6. 通过apply方法来判断,true表示成功
  • 这就是静态内部类

全局过滤器

在这里插入图片描述
在这里插入图片描述

  • lb就是使用的负载均衡过滤器
package com.lcs.springcloud.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author wu
 * @version 1.0
 * @date 2024/4/10 15:28
 */
@Component
public class LogFilter implements GlobalFilter {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        logger.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }
}

在这里插入图片描述

  • 分别启动这三个项目
    输入http://localhost:8088/order-service/order/add/1
    在这里插入图片描述
    在这里插入图片描述
  • 打印日志成功

#gateway跨域处理
在这里插入图片描述

### 跟nacos集成版本
server:
  port: 8088
spring:
  application:
    name: cloud-gateway

  cloud:
    #配置nacos
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
    gateway:
      discovery:
        locator:
        # 是否启动自动识别的nacos服务
      #          enabled: true
      routes:
        ## 路由唯一id
        - id: order
          ## 需要转发的地址 lb表示使用nacos里面本地负载均衡策略
          uri: lb://order-service
          ### 断言用于路由的匹配
          predicates:
            - Path=/order-service/**
          ## 转发去掉第一层路径
          filters:
            - StripPrefix=1
      globalcors:
        cors-configurations:
          '[/**]':
            allowedMethods: "*"
            allowedHeaders: "*"
            allowedOriginPatterns: "*"
            allowCredentials: true

gateway流控降级

在这里插入图片描述
在这个项目基础上调整

pom.xml

  <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
   </dependency>

   <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
   </dependency>
</project>

application.yml

### 跟nacos集成版本
server:
  port: 8088
spring:
  application:
    name: cloud-gateway

  cloud:
    #配置nacos
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
    gateway:
      discovery:
        locator:
        # 是否启动自动识别的nacos服务
      #          enabled: true
      routes:
        ## 路由唯一id
        - id: order
          ## 需要转发的地址 lb表示使用nacos里面本地负载均衡策略
          uri: lb://order-service
          ### 断言用于路由的匹配
          predicates:
            - Path=/order-service/**
          ## 转发去掉第一层路径
          filters:
            - StripPrefix=1
      globalcors:
        cors-configurations:
          '[/**]':
            allowedMethods: "*"
            allowedHeaders: "*"
            allowedOriginPatterns: "*"
            allowCredentials: true


    sentinel:
      transport:
        dashboard: 127.0.0.1:8080

在这里插入图片描述

  • 增加如上配置,记得启动sentinel服务。端口是8080

测试

输入http://localhost:8088/order-service/order/add/1
在这里插入图片描述
去流控的管理界面输入localhost:8080. 账号和密码都是sentinel。如果不熟悉,请跳转到sentinel篇
在这里插入图片描述

  • 多了一个cloud-gateway服务
    在这里插入图片描述
  • 设置api请求,一秒2次
    再去访问接口
    http://localhost:8088/order-service/order/add/1
    在这里插入图片描述
  • 表示流控成功

流控具体配置

在这里插入图片描述

  • 增加一个匹配固定127.0.0.1的流控
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 只有访问的地址是127.0.0.1的时候,才会流控

在这里插入图片描述

api流控

可以理解会一次对多个接口进行流控处理
在这里插入图片描述
在这里插入图片描述
再去访问order/add接口,效果跟之前一样

降级

在这里插入图片描述

  • 不要通过请求来设置降级,会提示这个报错,通过流控规则去设置,跟sentinel一样,不清楚的,可以查看我历史博客。

代码版本方式一

package com.lcs.springcloud.filter;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;

import javax.annotation.PostConstruct;
import java.util.HashMap;

/**
 * 限流降级方式一
 */
@Configuration
public class GatewayConfig {

    @PostConstruct
    public void init() {
        BlockRequestHandler blockRequestHandler = (serverWebExchange, throwable) -> {
            HashMap<String, Object> map = new HashMap<>();
            map.put("code", HttpStatus.TOO_MANY_REQUESTS.value());
            map.put("msg", "请稍后再试...");
            map.put("success", true);
            //自定义异常处理
            return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(BodyInserters.fromValue(map));
        };

        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
}

  • 正常里面会判断流控、降级、热点 等等
    在这里插入图片描述

配置方式二

 sentinel:
      transport:
        dashboard: 127.0.0.1:8080
      # 限流降级方式二
      scg:
        fallback:
          # 响应模式 response、redirect
          mode: response
          # 响应状态码
          response-status: 444
          # 响应信息
          response-body: "{\"code\":\"429\",\"msg\":\"请求太多了\"}"
  • 记得注释代码版本,方便测试
    在这里插入图片描述
    代码

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

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

相关文章

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

UE_导入内容_Maya静态网格体导出为FBX的常规设置

注意事项&#xff1a;单位设置统一为cm&#xff1b;轴朝向&#xff0c;Maya默认y轴朝上&#xff0c;UE4 z轴向上&#xff1b;变换枢轴&#xff0c;UE4会将导入模型前世界中心作为枢轴中心&#xff0c;要旋转就需要注意了&#xff1b;法线&#xff0c;UE4内材质默认单面显示&…

ubuntu 更改 ssh 默认端口

出于加固安全考虑&#xff0c;一般公司会禁用 ssh 的 22 端口号&#xff0c;因此我们需要改为其他端口。 1、ssh 命令行登录 进入台式机&#xff0c;修改 /etc/ssh/sshd_config 文件中的 Port 配置行&#xff0c;将 22 改为 8022&#xff0c;保存修改后&#xff0c;重启 ssh 服…

MySQL 主从 AUTO_INCREMENT 不一致问题分析

作者&#xff1a;vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象&#xff0c;一旦触发了主从切换&#xff0c;业务的正常插入操作会触发主键冲突的报错提示。 一、问题描述 1.1 问题现象 在 MySQL …

如何选择一款好用的电子名片,作为全员营销工具,又提升企业品牌形象!

移动互联网发展渐趋成熟的今天&#xff0c;企业的营销方式已经发生的很大的转变&#xff0c;传统的营销方式已经无法适应数字化时代的营销节奏&#xff0c;使用数字化营销工具能够帮助企业实现快速传播&#xff0c;精准定位你客户群体。同时&#xff0c;通过对营销数据的分析&a…

2024最新最简单的安卓底部菜单栏教程

2024最新最简单的安卓底部菜单栏教程 大界面跳转 public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);BottomNavigationView b…

SQLite Android 绑定(十八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 应用程序编程 加载共享库 在使用任何与 SQLite 相关的方法或对象之前&#xff0c;本机 SQLite 必…

数字货币:金融创新的未来?

随着科技的进步&#xff0c;数字货币作为一种新型的金融工具正逐渐走进人们的视线。那么&#xff0c;数字货币究竟是什么&#xff1f;它有哪些优势&#xff1f;它是否真的能够引领金融创新的未来&#xff1f;本文将从专业角度出发&#xff0c;深入探讨这些问题。 一、数字货币的…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波——附3个算法源码

效果&#xff1a; MPU6050姿态解算-卡尔曼滤波四元数互补滤波 目录 基础知识详解 欧拉角 加速度计(Accelerometer)与姿态测量 陀螺仪(Gyroscope)与姿态测量 姿态解算算法1-互补滤波 姿态解算算法2-四元数法 姿态解算算法3-卡尔曼滤波 组成 1.预测状态方程 2. 预测协方…

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where i…

Qt6 multimedia开发一个摄像头录像机

Qt 6 附加模块multimedia可用于多媒体的开发&#xff0c;今天使用它可以快速开发一个摄像头录像机。 毕业季用作本科毕业设计软件应该可以的。 支持的功能 无边框窗口&#xff0c;并且支持拖拽&#xff0c;调整窗口大小切换摄像头配置摄像头原格式、分辨率、帧率、画面质量、…

opencv图像处理技术(形态学操作)

形态学&#xff08;Morphology&#xff09;是数学中研究形状、结构和变换的分支&#xff0c;而在图像处理中&#xff0c;形态学主要用于描述和分析图像中的形状和结构。形态学操作通常涉及基本的集合运算&#xff0c;如腐蚀、膨胀、开运算、闭运算等&#xff0c;以及与结构元素…

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

互联网大厂ssp面经之路:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

一个巧用委托解决的问题(C#)

个人觉得是委托应用的一个很好的例子&#xff0c;故做一下分享&#xff0c;希望能帮助到您&#xff0c;内容比较简单&#xff0c;大佬可以跳过。我是做桌面医疗软件开发的&#xff0c;前段时间在做一个需求。在签发检验项目医嘱时&#xff0c;调用第三方接口&#xff0c;然后带…

什么是生成式AI?有哪些特征类型

生成式AI是人类一种人工智能技术&#xff0c;可以生成各种类型的内容&#xff0c;包括文本、图像、音频和合成数据。那么什么是人工智能&#xff1f;人工智能和机器学习之间的区别是什么&#xff1f;有哪些技术特征&#xff1f; 人工智能是一门学科&#xff0c;是计算机科学的一…

漫途水产养殖水质智能监测方案,科技助力养殖业高效生产!

随着水产养殖业的蓬勃发展&#xff0c;水质和饲料等多重因素逐渐成为影响其持续健康发展的关键因素。由于传统养殖模式因监控和调节手段不足&#xff0c;往往造成养殖环境的恶化。需要通过智能化养殖&#xff0c;调控养殖环境&#xff0c;实现养殖的精细化管理模式&#xff0c;…