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

说点大实话丨知名技术博主 Kirito 测评云原生网关

作者:徐靖峰

关注了阿里云云原生公众号,经常能看到 MSE-Higress 相关的推文,恰逢这次阿里云产品举办了一个 MSE-Higress 云原生网关的测评活动,借此机会体验了一把云原生网关的功能。

购买流程体验

图片

购买网关时,页面明确提示费用没有包含公网和私网 SLB 的费用,这里需要注意,评测时会产生额外费用,同时也建议 MSE-Higress 购买页给出具体的定价,参考 ACK 购买时的体验。

路由管理体验

通过购买页购买后,等了不多久实例便创建完成了,速度还是很快的,这个体验不错。第一个测评内容先体验下网关最主要的功能路由转发的能力,给 MSE-Higress 配置路由 & 服务,访问 httpbin.org 这个公网的服务,熟悉 HTTP 接口测试的同学一定也不会对 httpbin 感到陌生,它内置很多 endpoint,支持丰富的 HTTP 测试场景。

MSE-Higress 的产品设计和领域模型和我之前接触过的一些开源 API 网关差异不大,所以上手还是很快的,首先创建 httpbin 服务:

图片

接着再创建路由,我准备通过 ${网关ip}/httpbin/get 转发至 httpbin.org/get 的方式来进行路由测试。

图片

匹配方式支持前缀匹配、精确匹配、正则匹配三种,基本覆盖了网关路由场景的常见诉求。另外还需要注意的一点是,路由路径一定要配置成 /httpbin/ 而不能是 /httpbin,否则在待会配置路径重写时,会出现问题,我一开始也是因为不了解 MSE-Higress 的设计,错配成了 /httpbin,导致路由不通。

参考文档:《配置重写策略》 [ 1]

下一步,关联好刚刚创建的服务。

图片

最后在路由的策略配置中,配置重写策略,使得网关在请求 upstream service 时,去掉用于路由匹配的 /httpbin 前缀。

图片

MSE-Higress 提供了一个调试的界面,可以很方便地对路由进行调试,就在我信心满满准备完成第一个测试时,竟然调试报错了:

图片

步骤并不复杂,稍微花了点时间搜索了一下注意事项,定位到了问题,原来配置服务时是有提示的:“DNS 域名配置,如 www.aliyun.com,公网域名需要在 VPC 内配置公网 NAT 网关,内网域名暂不支持”,于是给 MSE-Higress 所在的 VPC 配置了 NAT 网关,最终调用成功。

➜ ~ curl 101.xx.166.xx/httpbin/get
{"args": {},"headers": {"Accept": "*/*","Host": "101.xx.166.xx","Original-Host": "101.xx.166.xx","Req-Start-Time": "1691746441214","User-Agent": "curl/7.64.1","X-Amzn-Trace-Id": "Root=1-64d60089-5f09b9560522afd56f11b4e0","X-Envoy-Attempt-Count": "1","X-Envoy-External-Address": "140.xx.11.xx","X-Envoy-Original-Path": "/httpbin/get"},"origin": "140.xx.11.xx, 121.xx.116.xx","url": "http://101.xx.166.xx/get"
}

期间还有一个小插曲,反复保存服务,会触发一个前端的 bug,保存按钮一直在转圈,测评期间稳定复现:

图片

路由策略-限流功能体验

刚刚在测评路由功能时,已经使用到了 MSE-Higress 的一个策略:重写策略,MSE-Higress 共支持 6 种路由策略,分别是:限流、重写、Header 设置、跨域、超时、重试,第二个测评我计划给到另外一个网关场景中常用的功能 – 限流。

创建限流策略时发现界面有组件嵌入的痕迹,跟其他策略的配置交互体验有一定差异,盲猜是不是前端嵌入了什么已有的界面。产品支持按照 QPS 进行限流,为了方便测评,设置为 1,更容易触发限流。

图片

通过行为管理,可以跳转到应用高可用服务 AHAS 的管理界面,看起来是内部集成了应用高可用服务 AHAS,复用了它的限流能力,专业的事情交给专业的产品来做。

图片

通过一个 shell 脚本进行限流测试:

#!/bin/bash
for i in {1..5}
do
curl 101.xx.166.xx/httpbin/get &
done
wait

验证限流成功。

sentinel rate limited
{"args": {},"headers": {"Accept": "*/*","Host": "101.xx.166.xx","Original-Host": "101.xx.166.xx","Req-Start-Time": "1691747565429","User-Agent": "curl/7.64.1","X-Amzn-Trace-Id": "Root=1-64d604ed-6dc526617e735d4f0f083e86","X-Envoy-Attempt-Count": "1","X-Envoy-External-Address": "140.xx.11.xx","X-Envoy-Original-Path": "/httpbin/get"},"origin": "140.xx.11.xx, 121.xx.116.163","url": "http://101.xx.166.xx/get"
}
sentinel rate limited
sentinel rate limited
sentinel rate limited

问题记录:限流监控的页面不太稳定,间断出现控制台请求报错,需要优化。

图片

EDAS 微服务集成体验

MSE-Higress 对微服务能力的集成是其亮点之一,除 HTTP 协议族外,还支持 Dubbo 和 gRPC 协议。EDAS 常用于进行微服务应用的托管,MSE-Higress 也对 EDAS 进行了适配,这个测评 case 的内容便是,在 EDAS 中部署一个同时集成了 SpringCloud Alibaba (用于测试 HTTP 协议)和 Dubbo (用于测试 Dubbo 协议)的微服务应用,使用 MSE-Higress 对该应用进行接口代理。

EDAS 应用部署

准备一个 Dubbo 服务:

package moe.cnkirito.sca.provider;import java.util.List;
import java.util.Map;public interface IHelloService {String sayHello(String str);String sayHello();String sayHello(List<String> name);String sayHello(List<String> name, Integer age);String sayHello(List<People> name, String first);String sayHello(People name);String sayHello(Map<String, Integer> map);String sayHello(Integer age);}

准备一个 RestController:

@RestController
public class DemoController {@AutowiredDemoService demoService;@RequestMapping(value = "/echo", method = RequestMethod.GET)public String echo() {return "Hello MSE-Higress";}}

配置应用信息并连接 EDAS 注册中心:

spring:application:name: sc-dubbo-mixed-appcloud:nacos:discovery:server-addr: edas-registry:8848 # EDAS会自行替换该连接串dubbo:application:id: sc-dubbo-mixed-appname: sc-dubbo-mixed-appprotocol:id: dubboport: 20880registry:id: nacosaddress: nacos://edas-registry:8848 # EDAS会自行替换该连接串

部署到 EDAS 中,在 EDAS 应用管理的服务列表菜单,确认该应用启动完毕。

图片

MSE-Higress 创建来源

MSE-Higress 为了更好地支持微服务的服务发现,抽象出了“来源”这一领域模型,对应微服务架构中的注册中心。

图片

MSE-Higress 的来源支持容器服务、MSE Nacos、MSE Zookeeper、EDAS 注册中心、SAE 注册中心这几种类型,选择 EDAS 注册中心,便能关联到 sc-dubbo-mixed-app 应用部署的微服务空间。

MSE-Higress 创建服务

图片

MSE-Higress 的管控可以直接访问 EDAS 注册中心,获取到了 sc-dubbo-mixed-app 和 providers:moe.cnkirito.sca.provider.IHelloService:1.0.0:default 这两个服务。

图片

检查服务的协议,正确识别到是 Dubbo 协议。

图片

这里不免让我产生了一些疑问,在导入服务时,MSE-Higress 并没有机会让我指定服务的协议类型,在协议详情中却正确识别到了服务的协议,猜测是判断了服务的命名格式,因为 Dubbo 类型服务注册到 Nacos 中格式形如 providers:xx:xx:xx,产品上采用了约定大于配置的设计。

MSE-Higress 创建路由

SpringCloud 服务提供的是标准的 HTTP 协议,上面的路由管理测评已经覆盖,不再次测评,重点看下 HTTP2Dubbo 是如何配置路由的。这部分内容没有办法望交互生义,还是得对着文档一步步来:《配置从HTTP到Dubbo协议转换》 [ 2]

配置如下:

图片

MSE-Higress 路由调试

测试 Dubbo 路由:

图片

测试 SpringCloud 路由:

图片

EDAS 微服务集成总结

该测评介绍了由 EDAS 托管的 SpringCloud 和 Dubbo 应用,可以很方便地被 MSE-Higress 集成,由 MSE-Higress 充当网关代理,将微服务暴露到集群外被访问,虽然这次测评没有涉及,但理论上还可以借助于 MSE-Higress 提供的限流、鉴权、安全防护,来为微服务体系保驾护航,有一定的想象空间。

同时记录下该测评进行时,个人觉得可以优化的地方。

改进建议1:服务模型的优化

上文有所提及,服务在 MSE-Higress 中的存在感很弱,在我看来服务应该和路由一样,具备很强的定制属性,包括:

  • 协议类型
  • 服务发现层的唯一标识
  • 通信层的唯一标识
  • 负载均衡方式
  • 健康检查配置

目前,MSE-Higress 创建服务时,仅支持指定“服务发现层的唯一标识”,其他属性不支持在创建时指定,协议类型和负载均衡方式允许在服务详情页中进行修改,健康检查允许在服务列表页进行修改。

对于“通信层的唯一标识”稍作解释,以 Dubbo 为例,providers:moe.cnkirito.sca.provider.IHelloService:1.0.0:default 是其在 Nacos namespace 中的唯一定位符,用于服务发现,而服务名 moe.cnkirito.sca.provider.IHelloService,版本 1.0.0,分组 default 则是其在通信层的唯一标识,也应当是服务的属性,但是在 MSE-Higress 中,则是服务绑定路由时的配置,有点归属于路由模型的感觉,这点设计欠妥。

改进建议2:Dubbo 协议转换的优化

上述的测评过程中,介绍了一个 Dubbo 协议转换的配置过程,既然已经识别到了是 Dubbo 服务的格式,可以自动解析出 Dubbo 服务的三元组进行填充。

图片

另外,方法映射的设计让我产生了一些疑惑,不清楚是技术原因导致,还是产品设计有意为之,因为在我的认知中,方法级别可以在请求中动态指定,试想一个应用有 n 个服务,一个服务有 m 个接口,完全暴露需要配置 n x m 次。从技术侧考虑,Dubbo 提供的泛化调用可以支持动态指定方法,无需配置参数列表类型。保持这个设计,能够想到的好处是可以允许部分接口暴露,这又回到了那个永恒的话题:安全和易用性的 trade off。

再参考 MSE-Higress 对 gRPC 协议转换的支持,则是另外一个形态:,请求路径为:{包名}.{服务名}/{方法名},而 gRPC 本身则没有在 MSE-Higress 中以一个服务类型体现在产品设计中。MSE-Higress 有能力支持 Dubbo 和 gRPC 类型的协议转换,但是在产品设计上,还有统一优化的空间。

MSE-Higress 对于 gRPC 的支持可以参考:《基于云原生网关实现gRPC服务的路由转发》 [ 3]

改进建议3:EDAS 注册中心类型支持优化

图片

EDAS 微服务空间背后有两种形态,一种是共享型注册中心的形态,另一种是绑定 MSE Nacos 实例的形态,上述演示时,主要测试了第一种形态,对于第二种形态,MSE-Higress 的支持有些兼容性问题,具体表现为: EDAS 微服务空间绑定的 MSE Nacos 位于 vpc-a 中,MSE-Higress 位于 vpc-b 中,创建来源能够成功,但导入服务时,页面报错:

图片

这背后应该是在支持 EDAS 注册中心时,未考虑其绑定的 MSE Nacos 位于其他 vpc 导致。建议在导入来源时对该 case 进行判断。

插件市场体验

插件体系功能较多,个人精力有限,我只挑选了个别插件进行了使用,表现均符合预期。我挑选了 APISIX 的插件支持情况与 MSE 进行了对比,由于 APISIX 是一款开源产品,我有意筛选的都是一些相对通用的能力,这样才具备比较价值。

图片

除了表格展示的插件之外,两款网关产品还支持很多其他插件,可以发现基本上常见的网关场景所需要的插件,MSE-Higress 都是支持的。与 APISIX 的设计不同,MSE-Higress 并没有将所有功能都堆到插件这一概念上,例如 Mock 和重定向由路由配置控制,跨域和限流通过路由策略控制,也有相当多的功能通过插件提供,在这一点上,我比较认可 MSE-Higress 的设计,这样可以减少网关使用者的理解成本。

但同时,在策略配置灵活度上,MSE-Higress 的设计仍有优化空间,以限流为例,由于其被抽象到了路由策略这一模型中,而该模型没有支持配置到消费者级别,这就让 MSE-Higress 失去了消费者级别限流的能力。

在商业化集成上,由于 MSE-Higress 是阿里云官方提供的一款网关产品,还额外提供了诸如:waf 安全防护、edas 鉴权插件、IDaaS 认证鉴权等集成,在公共云组装式开发的模式下,可以更好地跟已有的云产品联动,这是相比开源网关提供的插件能力最大的优势。

EDAS x MSE-Higress 金丝雀发布体验

MSE-Higress 在配置路由时,允许关联到多个服务,借助于这个特性,可以完成很多灰度的实践,这个测评将验证 MSE-Higress 和 EDAS 配合完成金丝雀发布的场景。

金丝雀的意义是先引流一小部分流量到新版本服务,大部分流量仍然保持在旧版本。

仍然使用之前的 sc-dubbo-mixed-app 应用,但需要稍作改造,为 SpringCloud 和 Dubbo 服务引入版本的概念,参考《管理服务版本》 [ 4] 一节,可知在 Nacos 服务发现场景下,MSE-Higress 是通过节点标签来进行路由的,以下是我的改造。

EDAS 部署 V1 版本

SpringCloud 服务引入版本:

spring:application:name: sc-dubbo-mixed-appcloud:nacos:discovery:server-addr: edas-registry:8848 # EDAS会自行替换该连接串  metadata: x-version: v1
@RestController
public class DemoController {@AutowiredDemoService demoService;@RequestMapping(value = "/echo", method = RequestMethod.GET)public String echo() {return "Hello MSE-Higress V1";}
}

Dubbo 服务引入版本:

@DubboService(group = "default", version = "1.0.0",parameters = {"x-version:v1"})
public class IHelloServiceImpl implements IHelloService {@Overridepublic String sayHello() {return "Hello MSE-Higress V1";}
}

在 EDAS 上部署以上版本,并扩容成 2 个副本,此时两个副本内容一致。

EDAS 分批部署 V2 版本

SpringCloud 服务新版本:

@DubboService(group = "default", version = "1.0.0",parameters = {"x-version:v1"})
public class IHelloServiceImpl implements IHelloService {@Overridepublic String sayHello() {return "Hello MSE-Higress V1";}
}
@RestController
public class DemoController {@AutowiredDemoService demoService;@RequestMapping(value = "/echo", method = RequestMethod.GET)public String echo() {return "Hello MSE-Higress V2";}
}

Dubbo 服务新版本:

@DubboService(group = "default", version = "1.0.0",parameters = {"x-version:v2"})
public class IHelloServiceImpl implements IHelloService {@Overridepublic String sayHello() {return "Hello MSE-Higress V2";}}

在 EDAS 进行分批发布:

图片

这里解释下,为什么不使用 EDAS 的金丝雀发布,因为 EDAS 金丝雀发布主要是用于微服务之间的调用,而不是入口流量,而此次测评的恰恰是 MSE-Higress 对 EDAS 应用进行的调用,在这个 case 中,EDAS 需要做的是分批发布,保证后端同时有 v1 和 v2 两个版本即可。

这样就完成了金丝雀发布的准备工作,同时存在了 v1 和 v2 两个版本的应用,剩下的就是对 MSE-Higress 进行配置,让其按照特定比例对这两个版本进行引流(试想一下,如果没有金丝雀发布,由于 v1 和 v2 都是一台机器,那流量比例应该是 1:1)。

MSE-Higress 配置服务版本和标签路由

在服务详情中,可以添加服务版本,这里 MSE-Higress 的体验做的很好,由于关联了注册中心,可以自动获取到对应的标签名和标签值,能够实时计算出对应的节点数量,不用担心配错了。

图片

需要修改路由关联服务的方式,从单服务改成标签路由,并配置 v1 和 v2 版本流量比例为 80:20。

图片

走到这一步,我发现标签路由怎么都选不到 Dubbo 服务,才注意到上方有提示“多服务和标签路由功能不支持添加Dubbo服务”!也就是说我之前的 Dubbo 服务打标签的准备工作都白费了,但我还是将测评过程记录了下来。

流量比例测试

通过调试 /sc-dubbo-mixed-app/echo 10 次,观察返回值:

Hello MSE-HigressHello MSE-HigressHello MSE-HigressHello MSE-Higress V2Hello MSE-HigressHello MSE-HigressHello MSE-HigressHello MSE-Higress V2Hello MSE-HigressHello MSE-Higress

符合预期。

测试总结

通过上述的例子,可以发现 MSE-Higress 和 EDAS 应用在 Nacos 服务发现场景下实现金丝雀发布还是很简单的,但从中也看出了一些问题,就是产品仅告诉了用户怎么达到金丝雀发布的验证态,没有走完最后一公里,即金丝雀发布验证到什么阶段可以认为发布完毕了,发布完之后,怎么完成 EDAS 的分批发布,怎么修改标签路由,达到一个运行终态。并且,这个流程配置还是很复杂的,要结合到用户的运维系统中,有一定集成工作,至少应该在 EDAS 这样的系统中提供一个基于 MSE-Higress 金丝雀发布入口应用的最佳实践。

体验总结

大概浏览了下 MSE-Ingress 的其他功能,精力有限加上篇幅限制,没法一一罗列,简单总结下。

MSE-Higress 除了文章开头的购买流程外,还支持作为一个 ACK 集群的 Ingress 网关,这得益于其云原生的基因,并且可以对标到 Nginx Ingress,这对于愿意拥抱云原生生态的公司是一个福音,我这次就不单独评测这一功能了。

文档支持上,我本次的测评完全是参考控制台文案及文档完成,可以看的出来,文档体系相对比较完善,一些常见的疑问,也都在文档中高亮了,点赞。需要注意的是一些新功能上线之后,需要对已有的相关文档进行更新,以《从 Spring Cloud Gateway 迁移到云原生网关》 [ 5]  为例,目前已经支持了 EDAS 共享注册中心来源了,对于文档中使用 EDAS 共享注册中心这一 case 而言,就不需要先迁移了,可能会让 SpringCloud Gateway 迁移用户产生误解。

MSE-Higress 可以很好地承担安全网关和流量网关的作用,但对于是否能够很好的承担起微服务网关/业务网关的作用,我觉得有待讨论。因为业务网关很直接的诉求是将企业内部的大量 API 通过网关暴露出来,MSE-Higress 的领域模型是路由/服务这套模型,这就限制于了其对于业务能力的抽象,路由大多数时候还是一个泛接口的作用,往往用于承接一个后端应用模型。从用户形态来看,可能是偏运维侧的用户会关注目前的 MSE-Higress 形态,而不是开发。

如果深入使用 MSE-Higress,可能会有精细化管理 API 接口的诉求,目前 MSE-Higress 的产品设计似乎不能很好地满足这一诉求,具体表现为 MSE-Higress 的路由模型和 API 精细化管理的需求之间的矛盾。MSE-Higress 的路由模型如果配置为泛路由 /order/* 的前缀匹配模式,则会将应用的所有接口暴露出去;如果配置为 /order/createOrder 的精确匹配模式,可以达到精细化管理的诉求,但接口级别常见的需求 API 出入参定义、参数映射、错误码管理,跟路由的模型无法很好的适配。这可能是大多数研发用户使用 MSE-Higress 未来可能面临的问题。

整体而言,我还是很看好 MSE-Higress 这款产品的。 产品界面交互还时髦,大多数操作流程很流畅;产品集成上,从它跟 WAF、EDAS、ACK 等产品的集成来看,可以看出阿里云对它的定位不仅仅是一个网关组件,而是希望能够借助它完成一个产品生态的构建,云原生公众号上 Serverless 挺火的,MSE-Higress 还不支持 Serverless 服务,这点倒是有点意外。同时它还具备 Higress 的开源属性,也解决了一部分选型时被阿里云绑死的顾虑。


参与云原生网关 MSE-Higress 测评赢大奖

2023 年 8 月 10 日-2023 年 9 月 15 日,通过体验 MSE-Higress,围绕三大主题,进行测评创作,有机会赢取 30 元猫超卡、米家台灯 Lite、CHERRY 机械键盘 MX3.0S 等大奖。

评测活动详情:阿里云产品测评赢大奖丨云原生网关 MSE-Higress

相关链接:

[1] 《配置重写策略》

https://help.aliyun.com/zh/mse/user-guide/configure-a-rewrite-policy

[2] 《配置从HTTP到Dubbo协议转换》

https://help.aliyun.com/zh/mse/user-guide/configure-http-to-dubbo-protocol-conversion**

[3] 《基于云原生网关实现 gRPC 服务的路由转发》

https://help.aliyun.com/zh/mse/getting-started/route-the-traffic-of-grpc-applications-based-on-cloud-native-gateways

[4] 《管理服务版本》

https://help.aliyun.com/zh/mse/user-guide/manage-service-versions

[5] 《从 Spring Cloud Gateway 迁移到云原生网关》

https://help.aliyun.com/zh/mse/user-guide/migrate-services-from-spring-cloud-gateway-to-cloud-native-gateways

相关文章:

说点大实话丨知名技术博主 Kirito 测评云原生网关

作者&#xff1a;徐靖峰 关注了阿里云云原生公众号&#xff0c;经常能看到 MSE-Higress 相关的推文&#xff0c;恰逢这次阿里云产品举办了一个 MSE-Higress 云原生网关的测评活动&#xff0c;借此机会体验了一把云原生网关的功能。 购买流程体验 购买网关时&#xff0c;页面明…...

时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现SO-CNN-BiL…...

简述docker的网络模式

Docker 提供了多种网络模式&#xff0c;用于控制容器之间以及容器与主机之间的网络通信。以下是 Docker 的一些常见网络模式 briage模式&#xff1a; docker容器启动时默认就是该模式,在该模式下&#xff0c;docker容器会连接到一个名为docker0的虚拟以太网桥上&#xff0c;通…...

MySql-8.0.34 CentOS 安装命令记录

1、执行以下命令获取 glibc 版本&#xff0c;根据版本下载相应的MySQL安装包。 ldd --version 2、下载MySQL。 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz 3、解压 tar -xzvf mysql-8.0.34-linux-glibc2.17-x86_64.t…...

开发电子木鱼功德+1需要多少钱

冥想木鱼小程序是一种结合了冥想和科技的应用形式&#xff0c;为用户提供了随时随地进行冥想的便捷方式。开发一款高质量的冥想木鱼小程序需要综合考虑技术实现、冥想专业性和用户体验等多个方面。本文将详细介绍冥想木鱼小程序的开发过程&#xff0c;并探讨其中的专业性与思考…...

批处理中扩展解释%~的相关知识和用法,并给出示例和实际运行结果展示

批处理中扩展解释%~的相关知识和用法&#xff0c;并给出示例和实际运行结果展示 在批处理脚本中&#xff0c;%~是一个特殊的前缀&#xff0c;用于对参数和变量进行字符串处理。这个前缀后面可以跟着不同的字符&#xff0c;用于执行不同的操作。下面是一些常见的用法&#xff1a…...

LA@向量组间的表示关系

文章目录 2个向量组间的表示关系向量组的相互表出向量组用另一个向量组表示&#x1f47a;线性表示的系数矩阵矩阵乘法与线性表出列向量组线性表示行向量组线性表示 向量组等价&#x1f47a;向量组等价的性质推论 等价矩阵与向量组等价的关系行等价矩阵的行向量组等价列等价矩阵…...

Mybatis与Spring集成

目录 一.Spring整合Mybatis 1.什么是Spring整合Mybatis 新建一个ssm ​编辑 导入pom依赖 导入generatorConfig.xml 导入Spring-context.xml文件 导入Spring-mybatis.xml文件 自动生成Bookmapper.xml和Bookmapper文件 编写接口类&#xff1a;Bookbiz 编写接口实现类 …...

AMBA总线协议(0)——目录与传送门

一、AMBA总线协议 Arm高级微控制器总线架构&#xff08;Advanced Microcontroller Bus Architecture&#xff0c;AMBA&#xff09;是一种开放式标准片上互联规范&#xff0c;用于连接和管理片上系统&#xff08;System on Chip,Soc&#xff09;中的功能块。 AMBA是一种广泛用于…...

R语言快速生成三线表(1)

R语言的优势在于批量处理&#xff0c;常使用到循环和函数&#xff0c;三线表是科研文章中必备的内容。利用函数实现自动判断数据类型和计算。使用R包&#xff08;table1&#xff09;。 # 创建连续性变量 continuous_var1 <- c(1.2, 2.5, 3.7, 4.8, 5.9) continuous_var2 &l…...

【动手学深度学习】--20.目标检测和边界框

文章目录 目标检测和边界框1.目标检测2.边界框 目标检测和边界框 学习视频&#xff1a;物体检测和数据集【动手学深度学习v2】 官方笔记&#xff1a;目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别…...

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…...

Linux的Man Page知识记录

Man&#xff08;short for manual&#xff09; Page是Unix和Linux操作系统中的一个重要文档&#xff0c;提供命令、函数、系统调用等的详细介绍和使用说明。它是以纯文本的形式出现&#xff0c;通常在终端&#xff08;terminal&#xff09;中使用man命令访问。Man Page按照章节…...

RTSP/Onvif视频服务器EasyNVR安防视频云服务调用接口录像会被自动删除的问题解决方案

EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力&#xff0c;可应用在智慧校园、智慧工厂、智慧水利等…...

几个nlp的小项目(文本分类)

几个nlp的小项目(文本分类) 导入加载数据类、评测类查看数据集精确展示数据测评方法设置参数tokenizer,token化的解释对数据集进行预处理加载预训练模型进行训练设置训练模型的参数一个根据任务名获取,测评方法的函数创建预训练模型开始训练本项目的工作完成了什么任务?导…...

MFC——base编码和json数据

目录 1. JSON是什么 2. base64是什么 Base64是一种编解码算法 1. JSON是什么 JSON 是一种数据格式。采用完全独立于语言的文本格式, 因为易读, 易写, 易解析的特性成为理想的数据交换语言。主要有三种类型的值:简单值(字符串, 数字, 布尔, null), 对象, 数组。 长这样的数…...

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要&#xff1a;本文将通过一个现实例子&#xff0c;详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例&#xff0c;并解释每个数据库的分页查询用法以及优化方法&#xff0c;帮助读者更好地选择适合自…...

Qt跨平台无边框窗口探索记录

一、前言 实现的效果为&#xff1a;通过黑色矩形框预操作&#xff0c;鼠标释放时更新窗口。效果图如下&#xff1a; 1.功能 1.1 已实现功能 8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏 1.2 待开发功能 拖动到…...

概念解析 | 电磁计算的新篇章:智能电磁计算

注1&#xff1a;本文系“概念解析”系列之一&#xff0c;致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是&#xff1a;智能电磁计算。 电磁计算的新篇章&#xff1a;智能电磁计算 随着人工智能的飞速发展&#xff0c;我们正处在一个信息爆炸的时代。各个领域&a…...

SpringBoot-1-Spring Boot实战:快速搭建你的第一个应用,以及了解原理

SpringBoot-1-Spring Boot实战&#xff1a;快速搭建你的第一个应用&#xff0c;以及了解原理 今日内容 SpringBootWeb入门 前言 我们在之前介绍Spring的时候&#xff0c;已经说过Spring官方(Spring官方)提供很多开源项目&#xff0c;点击projects&#xff0c;看到spring家族…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...