当前位置: 首页 > 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家族…...

Web服务器基础 http协议

文章目录 1.Web基础1.1MIME1.2 URI 和 URL1.2.1定义1.2.2两者的区别 2.静态资源和动态资源2.1 静态资源2.2 动态资源 3.HTTP协议3.1HTTP协议简介3.2HTTP协议的版本及区别3.2.1http协议版本3.2.2http1.0和1.1的区别 3.3HTTP请求报文3.4HTTP请求访问的过程1、建立连接&#xff1a…...

采用 SVG 实现 web 绘图软件的技术分享

背景 前端技术 使用 svg.js 及全家桶的组件实现 svg 绘图的 web 软件。 MySql8 词语定义 图纸&#xff1a;在页面上绘制的内容整体整体叫做图纸&#xff0c;业务上图纸是具有重要业务意义的概念。 对象&#xff1a;图纸上的业务元素的最小概念。 难点-技术背景 当时遇到…...

Qt --- QTimer

在Qt开发界面的时候&#xff0c;非常多的时候都得使用定时器&#xff0c;定时器具体可以干什么呢&#xff1f;比如&#xff1a;控制时钟、定时改变样式、改变进度等。。。说到这里&#xff0c;经常使用QQ&#xff0c;而不同的时段都会显示不同的背景&#xff0c;我认为如果用Qt…...

计算机终端核心安全配置规范

声明 本文是学习 政务计算机终端核心配置规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 范围 本标准提出了政务计算机终端核心配置的基本概念和要求&#xff0c;规定了核心配置的自动化实现方法&#xff0c;规范了核心配置实施流程。 本标准适…...

【Spring Boot】什么是深度优先遍历与广度优先遍历?用Spring Boot项目举例说明。

深度优先遍历&#xff08;Depth First Search&#xff0c;DFS&#xff09;和广度优先遍历&#xff08;Breadth First Search&#xff0c;BFS&#xff09;是图的遍历算法。其中&#xff0c;深度优先遍历从某个起始点开始&#xff0c;先访问一个节点&#xff0c;然后跳到它的一个…...

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…...

栈和队列OJ题

有效括号问题&#xff1a; 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的…...

36k字从Attention讲解Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…...

网站怎么选择适合的服务器

IDC数据中心大致分为T1、T2、T3、T4 T1&#xff1a;基本机房基础设施&#xff08;可用性99.671%、年平均故障时间28.8小时&#xff09; 1) T1 基本数据中心拥有非冗余容量组件&#xff0c;以及一个单一的非冗余分配路径来为关键环境提供服务。T1 基础设施包括&#xff1a;IT …...

http协议和HTTP编程流程

目录 1、http协议 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;使用的端口 &#xff08;3&#xff09;长连接和短连接 &#xff08;4&#xff09;常见web服务器 2、https&#xff08;443&#xff09; 3、浏览器连接服务器编程 1、http协议 &#xff08;超文…...

【NPM】包的指令

npm 安装的包可以根据其用途和作用进行分类&#xff0c;一般可以分为以下几种类型&#xff1a; 普通依赖&#xff08;Regular Dependencies&#xff09;&#xff1a; 这些是你项目中的实际依赖项&#xff0c;用于构建、运行或扩展你的应用程序。这些依赖会被包含在你的应用程序…...

音频4A算法导论

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) 一 音频4A算法是? 音频4A算法是指自动增益控制(Automatic Gain Control, AGC)、自动噪声抑制(Automatic Noise Suppression, ANS)和自动回声消除(Automatic Echo Cancellation, AEC),主动降噪ANC(Active Noi…...

SecureBridge安全文件下载的组件Crack

SecureBridge安全文件下载的组件Crack SecureBridge包括SSH、SSL和SFTP客户端和服务器组件。它使用SSH或SSL安全传输层协议和加密消息语法来保护任何TCP流量&#xff0c;这些协议为客户端和服务器提供身份验证、强数据加密和数据完整性验证。SecureBridge组件可以与数据访问组件…...

进程同步

目录 临界区&#xff08;Critical Section&#xff09;: 互斥量&#xff08;Mutex&#xff09;: 信号量&#xff08;Semaphore&#xff09;: 事件&#xff08;Event&#xff09;: 进程同步的四种方法 临界区&#xff08;Critical Section&#xff09;: 通过对多线程的串行…...

Prometheus+Grafana+AlertManager监控Linux主机状态

文章目录 PrometheusGrafanaAlertManager监控平台搭建开始监控Grafana连接Prometheus数据源导入Grafana模板监控Linux主机状态 同系列文章 PrometheusGrafanaAlertManager监控平台搭建 Docker搭建并配置Prometheus Docker拉取并配置Grafana Docker安装并配置Node-Exporter …...

UI设计第一步,在MasterGo上开展一个新项目

我们都知道&#xff0c;一个完整的项目&#xff0c;要经历创建团队、搭建组件库、应用规范以及管理设计资产&#xff0c;那么今天小编就在MasterGo中带你从0到1开展一个全新的项目。 你一定遇到过这种情况&#xff0c;同团队的设计师&#xff0c;由于使用不同版本或不同软件&a…...

【校招VIP】TCP/IP模型之常用协议和端口

考点介绍&#xff1a; 大厂测试校招面试里经常会出现TCP/IP模型的考察&#xff0c;TCP/IP协议是网络基础知识&#xff0c;是互联网的基石&#xff0c;不管你是做开发、运维还是信息安全的&#xff0c;TCP/IP 协议都是你绕不过去的一环&#xff0c;程序员需要像学会看书写字一样…...

Spring统一功能处理

1. AOP存在的问题 获取参数复杂AOP的规则相对简单 2. 拦截器 2.1. 应用(以登录为例) 2.1.1. 自定义拦截器 新建interceptor文件夹 import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http…...

搭建CFimagehost私人图床,实现公网远程访问的详细指南

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…...

Python的logging.config模块

要使用Python的logging.config模块记录一个月的日志数据&#xff0c;你可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;导入必要的模块&#xff1a; import logging import logging.config import datetime创建一个配置文件&#xff0c;例如logging.ini&#xff0c;用…...

【2023】LeetCode HOT 100——滑动窗口子串

目录 1. 无重复字符的最长子串1.1 C++实现1.2 Python实现1.3 时空分析2. 找到字符串中所有字母异位词2.1 C++实现2.2 Python实现2.3 时空分析3. 和为 K 的子数组3.1 C++实现3.2 Python实现3.3 时空分析4. 滑动窗口最大值4.1 C++实现4.2 Python实现4.3 时空分析5. 最小覆盖子串5…...

【云卓笔记】mavlink java文件

根据飞控提供的xml文件来生成的 生成的就是这样的java文件 准备工作: Mavlink协议生成 参考 1.安装mavlink : 使用MAVLink工具的要求是 Python 3.3 (recommended) or Python 2.7 Python future模块 (可选) PythonTklnter模块(如果需要使用图形用户界面)。 环境变量PYTHO…...

电机控制软件框架

应用层包括main 主函数模块&#xff0c;ISR 中断处理函数模块、时基Systick 模块和BLDC 应用接口模块&#xff1b;算法层包括BLDC Algorithm 模块和PID control 模块&#xff1b;驱动层&#xff08;Driver layer&#xff09;&#xff1a;包括GD32Fxx_Standard_peripheral libra…...

SCCB与IIC的异同及FPGA实现的注意事项

文章目录 前言一、信号线二、SCCB数据传输格式三、SCCB写&#xff08;与IIC完全一致&#xff09;四、SCCB读五、SCCB和IIC的区别 前言 IIC接口有比较广泛的应用&#xff0c;而SCCB&#xff08;Serial Camera Control Bus&#xff0c;串行摄像头控制总线&#xff09;是由OV&…...

【开发】安防监控视频智能分析平台新功能:安全帽/反光衣/安全带AI识别详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频AI智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检…...

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…...

栈和队列在数据结构中的应用

文章目录 理解栈和队列的概念及其特点栈的应用和操作队列的应用和操作结论 &#x1f389;欢迎来到数据结构学习专栏~探索栈和队列在数据结构中的应用 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;…...

AndroidStudio升级后总是Read Time Out的解决办法

AndroidStudio升级后在gradle的时候总是Time out&#xff0c;遇到过多次&#xff0c;总结一下解决办法 1、gradle下载超时 在工程目录../gradle/wrapper/gradle-wrapper.properties中找到gradle版本的下载链接&#xff0c;如下图&#xff1a; 将其复制到迅雷里下载&#xff0…...

升级Go 版本到 1.19及以上,Goland: file.Close() 报错: Unresolved reference ‘Close‘

错误截图 解决方法 File -> Settings -> Go -> Build Tags & Vendoring -> Custom tags -> 添加值 “unix” 原因 Go 1.19 引入了unix构建标签。因此&#xff0c;需要添加unix到自定义标签。 参考 https://blog.csdn.net/weixin_43940592/article/det…...

进程,线程,协程

1、进程 进程是具有一定独立功能的程序关于某个​​数据集​​合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。由于进程比较重量&#xff0c;占据独立的内存&#xff0c;所以上下…...