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

Spring Cloud Gateway详细介绍以及实现动态路由

一. 简介

Spring Cloud Gateway
This project provides a libraries for building an API Gateway on top of Spring WebFlux or Spring WebMVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.

该项目提供了一个用于在 Spring WebFlux 或 Spring WebMVC 之上构建 API 网关的库。 Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API 并为其提供横切关注点,例如:安全性、监控/指标和弹性。

其中核心的路由功能 我们可能需要动态更新 例如说 某个服务的名称改变后 需要动态调整它路由

二. gateway的路由使用

gateway 路由的使用也比较简单

  • java配置类方式
    @SpringBootApplication
    public class GatewayApplication {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/get").uri("http://httpbin.org")).route("host_route", r -> r.host("*.myhost.org").uri("http://httpbin.org")).route("rewrite_route", r -> r.host("*.rewrite.org").filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}")).uri("http://httpbin.org")).route("hystrix_route", r -> r.host("*.hystrix.org").filters(f -> f.hystrix(c -> c.setName("slowcmd"))).uri("http://httpbin.org")).route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org").filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback"))).uri("http://httpbin.org")).route("limit_route", r -> r.host("*.limited.org").and().path("/anything/**").filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter()))).uri("http://httpbin.org")).build();}
    }
    
  • yaml配置文件方式
    如下配置标识 匹配 cookie 的 mycookie 属性 如果属性值 正则匹配mycookievalue的话则进行转发到 https://example.org
    spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- name: Cookieargs:name: mycookieregexp: mycookievalue
    
    我们可以通过使用 路由断言工厂和 gateway filter 工厂 来作为规则 来进行路由命中判断

三. Route Predicate Factories

gateway自带的断言类 也有很多种,我们可以通过简单地方式就进行 使用

Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础设施的一部分进行匹配。 Spring Cloud Gateway 包含许多内置的路由断言工厂。 所有这些断言都匹配 HTTP 请求的不同属性。 您可以将多个路由断言工厂与逻辑 and 语句组合起来。

The After Route Predicate Factory

After 路由断言工厂采用一个参数,即日期时间(这是一种 java ZonedDateTime)。 此谓词匹配指定日期时间之后发生的请求。 以下示例配置后路由谓词:

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

The Before Route Predicate Factory

Before 路由断言工厂采用一个参数,即日期时间(这是一种 java ZonedDateTime)。 此谓词匹配在指定日期时间之前发生的请求。 以下示例配置 before 路由谓词:

spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

The Between Route Predicate Factory

Between 路由断言工厂采用两个参数:datetime1 和 datetime2,它们是 java ZonedDateTime 对象。 此谓词匹配在 datetime1 之后和 datetime2 之前发生的请求。 datetime2 参数必须位于 datetime1 之后。 以下示例配置了 Between 路由谓词:

spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

The Cookie Route Predicate Factory

Cookie 路由谓词工厂采用两个参数:cookie 名称和正则表达式(这是一个 Java 正则表达式)。 此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。 以下示例配置 cookie 路由谓词工厂:

spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p

此路由匹配具有名为“chocolate”的 cookie 的请求,该 cookie 的值与 ch.p 正则表达式匹配。

The Header Route Predicate Factory

Header 路由断言工厂采用两个参数,即 header 和 regexp(这是一个 Java 正则表达式)。 此谓词与具有给定名称且其值与正则表达式匹配的标头匹配。 以下示例配置标头路由断言:

spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+

如上路由将会撇皮请求具有名为 X-Request-Id 的标头且其值与 \d+ 正则表达式匹配(即,它具有一位或多位数字的值),则此路由匹配。

The Host Route Predicate Factory

匹配host的断言

spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org

The Path Route Predicate Factory

匹配路径的路由断言

spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}

如果请求路径为/red/1 或/red/1/ 或/red/blue 或/blue/green,则此路由匹配。

RemoteAddr 、XForwardedRemoteAddr 等 断言 都与之类似

The Weight Route Predicate Factory

Weight 路由谓词工厂有两个参数:组和权重(一个 int)。 权重按每组计算。 以下示例配置权重路由断言:

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

该路由会将约 80% 的流量转发到 Weighthigh.org,将约 20% 的流量转发到 Weightlow.org

四. GatewayFilter Factories

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。 路由过滤器的范围仅限于特定路由。 Spring Cloud Gateway 包含许多内置的 GatewayFilter Factory。
这个类似于过滤器,例如说 打印请求日志,权限校验等 也作为路由的条件判断的一种 例如说修改路径 或者重写请求路径 等

RewritePath GatewayFilter Factory

RewritePath GatewayFilter 工厂采用路径正则表达式参数和替换参数。 这使用 Java 正则表达式来灵活地重写请求路径。 以下清单配置了 RewritePath GatewayFilter:

spring:cloud:gateway:routes:- id: rewritepath_routeuri: https://example.orgpredicates:- Path=/red/**filters:- RewritePath=/red/?(?<segment>.*), /$\{segment}

对于 /red/blue 的请求路径,这会在发出下游请求之前将路径设置为 /blue。 请注意,由于 YAML 规范,$ 应替换为 $\。

StripPrefix GatewayFilter Factory

StripPrefix GatewayFilter 工厂采用一个参数,parts。 parts 参数指示在向下游发送请求之前要从请求中剥离的路径中的部分数量。 以下清单配置了 StripPrefix GatewayFilter:

spring:cloud:gateway:routes:- id: nameRooturi: https://nameservicepredicates:- Path=/name/**filters:- StripPrefix=2

当通过网关向 /name/blue/red 发出请求时,对 nameservice 发出的请求类似于 nameservice/red。

==

五. Global Filters

GlobalFilter 接口与 GatewayFilter 具有相同的签名。 这些是有条件地应用于所有路由的特殊过滤器。

组合全局过滤器和网关过滤器排序

当请求与路由匹配时,过滤 Web 处理程序会将 GlobalFilter 的所有实例和 GatewayFilter 的所有特定于路由的实例添加到过滤器链中。 这个组合的过滤器链由 org.springframework.core.Ordered 接口排序,您可以通过实现 getOrder() 方法来设置。

六. 动态路由

路由规则主要存放于配置文件 或者 配置类中 配置类中的方式需要对源码有所了解,这里我们直接使用最简单的配置文件方式
我们使用nacos作为注册中心和配置中心
同时使用spring-cloud-alibabba的依赖来集成nacos

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置路由配置文件示例


spring:cloud:gateway:routes:- id: activityRoute                       uri: lb://activity-service      predicates:- Path=/activity-service/**       filters:- StripPrefix=1

uri: lb://activity-service
这是目标服务的地址,lb表示使用负载均衡的方式获取服务实例。activity-service是在服务注册中心注册的服务名称。

这段路由规则含义如下:
当请求路径匹配 /activity-service/** 时,该请求会被路由到 activity-service 服务实例。
在路由请求之前,会从请求路径中去除 /activity-service 前缀,然后将剩余路径发送给服务实例。

上述就实现了gateway的路由转发功能
接下来就是动态刷新了

好消息是 当我们集成spring cloud alibaba-nacos组件时 默认开启了自动刷新
官方文档地址: https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/spring-cloud-alibaba-examples/nacos-example/readme.md#more-configuration-items
在这里插入图片描述
所以当我们动态改变路由的配置的时 也会触发到nacos的配置更新 ,然后 springcloud gateway 会加载到变更后的路由配置 即完成了动态刷新功能

七. 优化点

根据第6六部分内容,我们已经实现了路由的动态刷新功能,但是一般生产环境上会有很多配置,我们为了避免影响到线上其他的配置 最好将配置区分开来,推荐作法,我们新建一个文件例如 gateway-service-routes.yaml 然后 在主配置中引用 从而实现配置的分离
springboot 中引入nacos配置

注意当nacos server开启鉴权后,导入config时没有加账号密码 则配置加载不到,报错信息非常不明显,因此很容易造成 gateway加载路由规则失败

spring:cloud:nacos:# nacos-server地址serverAddr: 127.0.0.1:8848# nacos-server开启了鉴权后需要账号密码 username: 'nacos'# nacos-server开启了鉴权后需要账号密码 password: 'nacos'config:import:#导入gateway的路由配置 并开启刷新 - nacos:gateway-service-routes.yaml?refresh=true&group=DEFAULT_GROUP

八. 坑点

当开启locator.enabled 配置时

# Flag that enables DiscoveryClient gateway integration.
spring.cloud.gateway.discovery.locator.enabled=true

gateway会默认生成基于注册的服务名的路由规则
这时候我们在自定义路由 匹配的路径 和 默认生成的路由 路径那么就会到我们自定义的路由失效

源码参见: org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator

@Bean
@ConditionalOnProperty(name = "spring.cloud.gateway.discovery.locator.enabled")
public DiscoveryClientRouteDefinitionLocator   			    discoveryClientRouteDefinitionLocator(ReactiveDiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
}

最终在DiscoveryClientRouteDefinitionLocator 类中 创建了路由规则
源码参见: org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator#getRouteDefinitions

@Override
public Flux<RouteDefinition> getRouteDefinitions() {SpelExpressionParser parser = new SpelExpressionParser();Expression includeExpr = parser.parseExpression(properties.getIncludeExpression());Expression urlExpr = parser.parseExpression(properties.getUrlExpression());Predicate<ServiceInstance> includePredicate;if (properties.getIncludeExpression() == null || "true".equalsIgnoreCase(properties.getIncludeExpression())) {includePredicate = instance -> true;}else {includePredicate = instance -> {Boolean include = includeExpr.getValue(evalCtxt, instance, Boolean.class);if (include == null) {return false;}return include;};}return serviceInstances.filter(instances -> !instances.isEmpty()).flatMap(Flux::fromIterable).filter(includePredicate).collectMap(ServiceInstance::getServiceId)// remove duplicates.flatMapMany(map -> Flux.fromIterable(map.values())).map(instance -> {RouteDefinition routeDefinition = buildRouteDefinition(urlExpr, instance);final ServiceInstance instanceForEval = new DelegatingServiceInstance(instance, properties);for (PredicateDefinition original : this.properties.getPredicates()) {PredicateDefinition predicate = new PredicateDefinition();predicate.setName(original.getName());for (Map.Entry<String, String> entry : original.getArgs().entrySet()) {String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry);predicate.addArg(entry.getKey(), value);}routeDefinition.getPredicates().add(predicate);}for (FilterDefinition original : this.properties.getFilters()) {FilterDefinition filter = new FilterDefinition();filter.setName(original.getName());for (Map.Entry<String, String> entry : original.getArgs().entrySet()) {String value = getValueFromExpr(evalCtxt, parser, instanceForEval, entry);filter.addArg(entry.getKey(), value);}routeDefinition.getFilters().add(filter);}return routeDefinition;});
}

在 Spring Cloud Gateway 中,如果存在多个路由规则的断言路径相同,但是转发的 URL 不同,那么 Gateway 将根据路由定义的顺序来选择第一个匹配的路由规则。

具体来说,Spring Cloud Gateway 在匹配路由规则时,会按照路由定义的顺序进行匹配,一旦匹配到第一个符合条件的路由规则,就会停止匹配,并使用该路由规则进行请求转发。

那这个时候 想让我们的自定义的路由生效 只要两种方式

  • 修改配置 让默认的路由规则不生效 (慎用)
  • 修改order 让我们自定义的 路由优先级最大 就会先匹配到我们的路由了
    示例如下
spring:cloud:gateway:discovery:locator:# 默认会生成基于服务名称的路由规则enabled: trueroutes:- id: activity                       uri: lb://activity-service2    predicates:- Path=/activity-service/**       filters:- StripPrefix=1order: -1

activity-service 是我们的服务,因为开启了配置 默认会生成一条 路径为/activity-service/** 然后转发到lb://activity-service的路由 这我们做了迁移需要将其转发lb://activity-service2 上 故新增了此条路由 ,然后增加order属性 值为-1 我们此条路由才会生效。

spring cloud gateway 官方配置说明文档: https://docs.spring.io/spring-cloud-gateway/reference/appendix.html

the end !!!
good day

相关文章:

Spring Cloud Gateway详细介绍以及实现动态路由

一. 简介 Spring Cloud Gateway This project provides a libraries for building an API Gateway on top of Spring WebFlux or Spring WebMVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to …...

transformer上手(6)—— 微调预训练模型

1 加载数据集 以同义句判断任务为例&#xff08;每次输入两个句子&#xff0c;判断它们是否为同义句&#xff09;&#xff0c;构建我们的第一个 Transformers 模型。我们选择蚂蚁金融语义相似度数据集 AFQMC 作为语料&#xff0c;它提供了官方的数据划分&#xff0c;训练集 / …...

web前端框架设计第四课-条件判断与列表渲染

web前端框架设计第四课-条件判断与列表渲染 一.预习笔记 1.条件判断 1-1&#xff1a;v-if指令&#xff1a;根据表达式的值来判断是否输出DOM元素 1-2&#xff1a;template中使用v-if 1-3&#xff1a;v-else 1-4&#xff1a;v-else-if 1-5&#xff1a;v-show&#xff08;不支…...

计算机网络:数据链路层 - CSMA/CD协议

计算机网络&#xff1a;数据链路层 - CSMA/CD协议 媒体接入控制CSMA/CD协议截断二进制指数退避算法帧长与帧间间隔信道利用率 媒体接入控制 如图所示&#xff0c;这是一根同轴电缆&#xff0c;有多台主机连接到这根同轴电缆上&#xff0c;他们共享这根传输媒体&#xff0c;形成…...

力扣LeetCode138. 复制带随机指针的链表 两种解法(C语言实现)

目录 题目链接 题目分析 题目定位&#xff1a; 解题思路 解题思路1&#xff08;粗暴但是复杂度高&#xff09; 解题思路2&#xff08;巧妙并且复杂度低&#xff09; 题目链接 138. 复制带随机指针的链表https://leetcode-cn.com/problems/copy-list-with-random-pointer/ …...

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…...

论文速读:Do Generated Data Always Help Contrastive Learning?

在对比学习领域&#xff0c;最近很多研究利用高质量生成模型来提升对比学习 给定一个未标记的数据集&#xff0c;在其上训练一个生成模型来生成大量的合成样本&#xff0c;然后在真实数据和生成数据的组合上执行对比学习这种使用生成数据的最简单方式被称为“数据膨胀”这与数据…...

华为欧拉系统(openEuler-22.03)安装深信服EasyConnect软件(图文详解)

欧拉镜像下载安装 iso镜像官网下载地址 选择最小化安装&#xff0c;标准模式 换华为镜像源 更换华为镜像站&#xff0c;加速下载&#xff1a; sed -i "s#http://repo.openeuler.org#https://mirrors.huaweicloud.com/openeuler#g" /etc/yum.repos.d/openEuler.r…...

git commit --amend用法

一、git commit --amend 修改提交信息&#xff1a;您可以使用 git commit --amend 命令来修改最新提交的提交信息。执行该命令后&#xff0c;Git 将会打开文本编辑器&#xff08;通常是的默认文本编辑器&#xff09;&#xff0c;以便编辑提交信息。完成编辑后保存并关闭编辑器…...

分布式系统:缓存与数据库一致性问题

前言 缓存设计是应用系统设计中重要的一环&#xff0c;是通过空间换取时间的一种策略&#xff0c;达到高性能访问数据的目的&#xff1b;但是缓存的数据并不是时刻存在内存中&#xff0c;当数据发生变化时&#xff0c;如何与数据库中的数据保持一致&#xff0c;以满足业务系统…...

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized &#xff1a; 2.18 综合应用-1 反射的高级应用 DAO开发中&#xff0c;实体类对应DAO的实现类中有很多方法的代码具有高度相似性&#xff0c;为了提供代码的复用性,降低…...

mysql dump导出导入数据

前言 mysqldump是MySQL数据库中一个非常有用的命令行工具&#xff0c;用于备份和还原数据库。它可以将整个数据库或者特定的表导出为一个SQL文件&#xff0c;以便在需要时进行恢复或迁移。 使用mysqldump可以执行以下操作&#xff1a; 备份数据库&#xff1a;可以使用mysqld…...

刷题记录3

# 10 字符个数统计 描述 编写一个函数&#xff0c;计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 &#xff0c;包括 0 和 127 )&#xff0c;换行表示结束符&#xff0c;不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次 例如&#xff0c;对…...

Decorator 装饰

意图 动态的给一个对象添加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类更加灵活 结构 其中&#xff1a; Component定义一个对象接口&#xff0c;可以给这些对象动态的添加职责。ConcreteComponent定义一个对象&#xff0c;可以给这个对象添加一些职…...

SpringMVC:搭建第一个web项目并配置视图解析器

&#x1f449;需求&#xff1a;用spring mvc框架搭建web项目&#xff0c;通过配置视图解析器达到jsp页面不得直接访问&#xff0c;实现基本的输出“hello world”功能。&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb; 1 创建web项目 1…...

一文了解HTTPS的加密原理

HTTPS是一种安全的网络通信协议&#xff0c;用于在互联网上提供端到端的加密通信&#xff0c;确保数据在客户端&#xff08;如Web浏览器&#xff09;与服务器之间传输时的机密性、完整性和身份验证。HTTPS的加密原理主要基于SSL/TLS协议&#xff0c;以下详细阐述其工作过程&…...

Ubuntu系统空间整理

查看文件大小命令 查看文件以及文件夹大小 ls -hl #查看文件大小&#xff0c;-h 表示Human-Readable ll -h #查看文件夹的大小 #du命令查看文件或文件夹的磁盘使用空间&#xff0c;–max-depth 用于指定深入目录的层数。#查看当前目录已经使用总大小及当前目录下一级文件或…...

PHP Storm 2024.1使用

本文讲的是phpstorm 2024.1最新版本激活使用教程&#xff0c;本教程适用于windows操作系统。 1.先去idea官网下载phpstorm包&#xff0c;我这里以2023.2最新版本为例 官网地址&#xff1a;https://www.jetbrains.com/zh-cn/phpstorm/ 2.下载下来后安装&#xff0c;点下一步 …...

王东岳-知鱼之乐【边读边记】1

2024-04-15 21:00 终于打算开始读这本书了&#xff0c;作者王东岳&#xff0c;第一次听到这个名字&#xff0c;是因为传说王东岳是李善友的师父&#xff0c;我是先从混沌学院知道的李善友&#xff0c;因为李善友还是有东西的&#xff0c;所以我对王东岳起步也是非常尊敬的。所以…...

迁移docker部署的GitLab

目录 1. 背景2. 参考3. 环境4. 过程4.1 查看原docker启动命令4.2 打包挂载目录传至新宿主机并创建对应目录4.3 保存镜像并传至新宿主机下4.4 新宿主机启动GitLab容器 5 故障5.1 容器不断重启5.2 权限拒绝5.3 容器内错误日志 6 重启容器服务正常7 总结 1. 背景 最近接到一个任务…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...