spring getway的配置

news2024/11/18 1:33:03

1. 创建工程 getway-server

2. 添加 pom 依赖:

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

3. 添加启动类

4. 添加配置文件:

#端口
server:
  port: 8080

#服务名称
spring:
  application:
    name: getway-service
  cloud:
    gateway:
      routes:
       - id: product-service
         uri: lb://product-service     #根据服务名称从注册中心拉取服务请求路径
         predicates:
         - Path=/product/**

id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默
认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
 

5. 启动 getway 服务报错如下:

这个错误是因为 getway 内部是通过 netty + webflux 实现,webflux 实现和 springmvc 冲突

解决办法:将父工程配置的如下依赖添加到需要的工程中:

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

对应在 product 和 order 服务中添加依赖,再次启动 getway 服务就成功了。

访问 http://localhost:8080/product/1

重写转发路径

在 SpringCloud Gateway 中,路由转发是直接将匹配的路由 path 直接拼接到映射路径(URI)之后,那
么在微服务开发中往往没有那么便利。这里就可以通过 RewritePath 机制来进行路径重写。
(1) 案例改造
修改 application.yml ,将匹配路径改为 /product-service/**

重新启动网关,我们在浏览器访问 http://127.0.0.1:8080/product-service/product/1,会抛出 404。这
是由于路由转发规则默认转发到商品微服务( http://127.0.0.1:9002/productservice/product/1 )路径上,而商品微服务又没有 product-service 对应的映射配置。
(2) 添加 RewritePath 重写转发路径
修改 application.yml ,添加重写规则

#服务名称
spring:
  application:
    name: getway-service
  cloud:
    gateway:
      routes:
      - id: product-service
#        uri: http://127.0.0.1:9001
        uri: lb://product-service     #根据服务名称从注册中心拉取服务请求路径
        predicates:
#          - Path=/product/**
        - Path=/product-service/**
        filters:
        - RewritePath=/product-service/(?<segment>.*), /$\{segment}
    #根据服务名称配置路由转发
    discovery:
      locator:
        enabled: true   #开启服务名称自动转发
        lower-case-service-id: true   #名称小写形式

通过 RewritePath 配置重写转发的 url,将 /product-service/(?.*),重写为 {segment},然后转发到订单
微服务。比如在网页上请求 http://localhost:8080/product-service/product,此时会将请求转发到 htt
p://127.0.0.1:9002/product/1

                                                                            网关限流 

1.pom 文件添加如下依赖:

<!--redis的依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!--监控依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency> 

2.修改配置文件
server:
  port: 8080 #端口
spring:
  application:
    name: gateway-service #服务名称
  redis:
    host: localhost
    pool: 6379
    database: 0
  cloud: #配置SpringCloudGateway的路由
    gateway:
      routes:
      - id: order-service
        uri: lb://order-service
        predicates:
        - Path=/order-service/**
        filters:
        - RewritePath=/order-service/(?<segment>.*), /$\{segment}
      - id: product-service
        uri: lb://product-service
        predicates:
        - Path=/product-service/**
        filters:
        - name: RequestRateLimiter
          args:
#            # 使用SpEL从容器中获取对象
            key-resolver: '#{@pathKeyResolver}'
#            # 令牌桶每秒填充平均速率
            redis-rate-limiter.replenishRate: 1
#            # 令牌桶的上限
            redis-rate-limiter.burstCapacity: 3
        - RewritePath=/product-service/(?<segment>.*), /$\{segment}

3. 新建 KeyResolverConfiguration 类

@Configuration
public class KeyResolverConfiguration {

    /**
     * 请求路径的限流规则
     * @return
     */
    @Bean
    public KeyResolver pathKeyResolver() {
        return new KeyResolver(){
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getPath().toString());
            }
        };
    }
}

访问 http://localhost:8080/product-service/product/1

如果连续刷新请求就会出现如下界面

通过 reids 的 MONITOR 可以监听 redis 的执行过程。这时候 Redis 中会有对应的数据

大括号中就是我们的限流 Key, 这边是 IP,本地的就是 localhost
timestamp: 存储的是当前时间的秒数,也就是 System.currentTimeMillis() / 1000 或者
Instant.now().getEpochSecond()
tokens: 存储的是当前这秒钟的对应的可用的令牌数量
 

根据参数限流   

1. 在 KeyResolverConfiguration 类中添加如下代码

/**
 * 请求参数限流
 * @return
 */
@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
            exchange.getRequest().getQueryParams().getFirst("userId")
            //exchange.getRequest().getHeaders().getFirst("X-Forwarded-For") 基于请求ip的限流
    );
}

2. 修改配置文件:

访问同上,如果访问频率过高也是出现同样的效果

访问地址: http://localhost:8080/product-service/product/1?userId=1

需要带上参数。

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

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

相关文章

【安全防御】IPsec VPN

1.什么是数据认证&#xff0c;有什么用&#xff0c;有哪些实现的技术手段&#xff1f; 在计算机和网络安全领域中&#xff0c;数据认证是指验证数据在传输和存储过程中的完整性、真实性和合法性的过程。数据在传输和存储过程中容易受到数据篡改、损坏或未经授权的访问和修改的…

用Keras单层网络预测银行客户流失率

用Keras单层网络预测银行客户流失率 描述 已知一批客户数据&#xff0c;来预测某个银行的客户是否流失。通过学习历史数据&#xff0c;如果机器能判断出哪些客户很有可能在未来两年内结束在银行的业务&#xff08;这当然是银行所不希望看到的&#xff09;&#xff0c;那么银行…

基于vue+laravel技术框架开发的:PHP不良事件上报系统源码

医院安全&#xff08;不良&#xff09;事件上报系统源码&#xff0c;PHP不良事件上报系统源码 系统定义&#xff1a; 规范医院安全&#xff08;不良&#xff09;事件的主动报告&#xff0c;增强风险防范意识&#xff0c;及时发现医院不良事件和安全隐患&#xff0c;将获取的医…

成都建博会:家居行业数字营销金点子 句句戳心坎,先收藏

四月&#xff0c;不仅是人间最美天&#xff0c;也是第二季度的开始。随着气温上升&#xff0c;行业进入了活跃期。对于西南地区的家居行业从业者来说&#xff0c;来一趟一年一度的成都建博会&#xff0c;总能获得无尽的灵感&#xff0c;对后续更加充满期待。而与同行的交流&…

美国主机常见的安全漏洞与防范方法详解

在今天的数字时代&#xff0c;保护计算机系统和数据安全至关重要。不幸的是&#xff0c;网络安全问题在过去几年中已经成为全球性的问题。攻击者利用各种漏洞和技巧来入侵系统&#xff0c;以窃取敏感信息、加密数据或者破坏系统。在本文中&#xff0c;我们将探讨美国主机常见的…

HTML5 语义元素

文章目录 HTML5 语义元素什么是语义元素?浏览器支持HTML5中新的语义元素HTML5 \<section> 元素HTML5 \<article> 元素HTML5 \<nav> 元素HTML5 \<aside> 元素HTML5 \<header> 元素HTML5 \<footer> 元素HTML5 \<figure> 和 \<figc…

Git Commit message 编写规范

介绍 在 Git 中&#xff0c;每次提交代码&#xff0c;都要写 Commit message&#xff08;提交说明&#xff09;&#xff0c;否则就不允许提交。这个操作将通过 git commit 完成。 git commit -m "hello world"上面代码的-m参数&#xff0c;就是用来指定 commit mes…

你怎么知道我什么都不会

文章目录 查询的存储过程增删改的存储过程返回拼音缩写自动填充拼音缩写的触发器销售完整销售业务存储过程 实现查询销售记录及销售明细退货业务实现营业员对当天销售的扎帐处理存储过程 阿巴阿巴高可用 阿玛阿玛碰运气 文心一言 耶耶耶耶耶 查询的存储过程 创建货品信息查…

kafka--python

文章目录 1、kafka是什么2、docker上部署kafka3、在kafka容器内部署python&#xff0c;并跑通生产者-消费者简单代码4、最新接口4.1、kafka_config.py4.2、kafka_interface.py4.3、run.py4、测试 1、kafka是什么 Producer&#xff1a;即生产者&#xff0c;消息的产生者&#xf…

PICO一方打造:VR音游《闪韵灵境》体验

​《闪韵灵境》本周正式上线&#xff0c;作为PICO一方工作室的首款作品&#xff0c;不少玩家对此寄予厚望。即便是作为一个轻轻度VR音游的用户&#xff0c;经过简短体验&#xff0c;我也发现了闪韵灵境和目前热门的Beat Saber之间的一些差异点。以下是我在简短体验后的一些看法…

Java选择排序、二分查找

一、选择排序 1.选择排序的思想 每轮选择当前的位置&#xff0c;开始找后面的较小值与该位置进行交换。 第一轮&#xff1a;选择当前位置&#xff0c;开始找后面的较小值与该位置进行交换。 5与1交换后&#xff0c;1就在当前位置&#xff0c;因此&#xff0c;1与后面的所有值…

看板与 Scrum:有什么区别?

看板和Scrum是项目管理方法论&#xff0c;以小增量完成项目任务并强调持续改进。但是他们用来实现这些目标的过程是不同的。看板以可视化任务和连续流程为中心&#xff0c;而Scrum更多是关于为每个交付周期实施时间表和分配设定角色。 在看板和Scrum之间做出选择并不总是必要…

【事故】记一次意外把公司项目放到GitHub并被fork,如何使用DMCA下架政策保障隐私

前言 &#x1f34a;缘由 在一个月黑风高的夜晚&#xff0c;正准备休息的我突然接到之前外包老总的亲切问候。一顿输出才知道三年前为了搭建流程化部署&#xff0c;将公司的测试代码放到github上后忘记删除。现在被甲方的代码扫描机制扫到&#xff0c;并且检查到代码已经被其他…

大数据环境生态搭建

文章目录 大数据环境生态搭建一、通用操作1、更改三台节点的主机名2、关闭三台机器 linux 的安全模式3、关闭三台机器的防火墙4、设置三台机器的免密的登录 二、安装 JDK1.8 大数据环境生态搭建 一、通用操作 1、更改三台节点的主机名 输入命令&#xff1a; hostnamectl set…

打通Web2与Web3 欧科云链用数据建桥

在刚刚过去的香港Web3嘉年华系列活动中&#xff0c;欧科云链以链上数据服务商的特别身份带来了新的行业视角&#xff0c;该集团旗下研究院高级研究员蒋照生观察&#xff0c;Web3涵盖的“数据革命”不仅局限于区块链领域&#xff0c;Web2行业同样有需求。 借助区块链数据的透明…

共话开源 - openKylin出席 FOSSASIA Summit 2023 开源盛会!

4月14日&#xff0c;openKylin社区受邀参加FOSSASIA Summit 2023开源盛会&#xff0c;给来自全球的技术开发者带来openKylin社区在RISC-V软硬件生态建设方面的经验与成果介绍&#xff0c;向大家展示中国开源社区的潜力&#xff0c;并同国际技术社区共研RISC-V未来之势。 FOSSA…

Oracle函数记录

一、各个函数介绍 1.OVER(PARTITION BY… ORDER BY…)--开窗函数 1.开窗函数用于为行定义一个窗口&#xff08;这里的窗口是指运算将要操作的行的集合&#xff09;&#xff0c;它对一组 值进行操作&#xff0c;不需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一…

苹果MT4手机软件怎么下载?下载后怎么使用?

比较了解外汇交易的投资者都知道&#xff1a;自2022年9月24日起&#xff0c;在Apple的App Store应用商店里面苹果MT4手机软件已经显示是不可下载的&#xff0c;究其原因就是苹果MT4手机软件被官方下架了&#xff01;看到这里先不要紧张&#xff0c;因为于2023年3月7日上午&…

100种思维模型之大脑系统思维模型-52

上世纪60年代&#xff0c;美国神经学家保罗 D 麦克莱恩&#xff08;Paul D. MacLean&#xff09;首次提出“三脑一体”假说&#xff0c;他认为人的大脑是蜥蜴-松鼠-猴子合体的隐喻&#xff0c;代表了进化发展不同阶段的遗传。 复旦大学管理学院的项保华教授对此有一个精彩的总结…

代码随想录_回溯_leetcode77 216 17

leetcode 77. 组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; …