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

增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战

目录

1.引言

什么是HTNN?

为什么开发 BasicAuth 和 ACL 插件?

2.技术背景

技术栈概览

Istio 与服务网格简述

HTNN 框架与插件机制概览

3.插件开发详解:BasicAuth 与 ACL

3.1 BasicAuth插件

功能点

实现细节

3.2 ACL插件

功能点

实现细节

4.实践过程

4.1本地构建自定义HTNN镜像

1.修改源码并添加插件

2.构建Docker镜像

4.2 在 Kubernetes 中部署插件

1.将构建好的数据面和控制面的镜像先导入到Kubernetes集群

2.修改Helm Chart的 values.yaml文件

4.3 测试验证流程


1.引言

什么是HTNN?

HTNN 是一个基于 Istio 构建的服务网格增强项目,通过插件机制来扩展和定制流量控制、安全策略等能力。与 Istio 原生的 Mixer 插件体系不同,HTNN 提供了更加灵活和轻量的插件注册与运行方式,适合快速验证和迭代。

项目地址:https://github.com/mosn/htnn

为什么开发 BasicAuth 和 ACL 插件?

在 HTNN 官方仓库中,虽然提供了如 key-authhmac-auth 等认证插件,但对于传统的用户名密码认证(BasicAuth)以及基于源 IP 的访问控制(ACL)仍未支持。在一些面向公网服务或细粒度控制场景中,这类插件是非常常用且必要的。

因此,我基于 HTNN 插件机制,自行开发并集成了:

basicAuth 插件:用于支持 HTTP Basic Authentication,适用于快速接入第三方平台或内部服务接口保护。

acl 插件:实现对来源 IP 的白名单与黑名单策略配置,增强服务边界的访问控制能力。

2.技术背景

技术栈概览

技术作用
Go编写插件逻辑,HTNN 本身使用 Go 开发
Protobuf定义插件配置结构、实现插件与框架间的序列化通信
Docker构建包含自定义插件的 HTNN 镜像
Kubernetes部署测试 HTNN 与插件,验证实际运行效果
Linux本地开发与测试环境,使用 shell 工具辅助调试
Istio服务网格的核心组件,HTNN 作为其增强层构建在上方

Istio 与服务网格简述

Istio 是当前主流的服务网格框架,提供流量管理、安全控制、可观测性等能力。在微服务架构中,Istio 通过 sidecar(通常是 Envoy)注入方式拦截进出流量,实现服务间的无侵入治理。然而,Istio 自身对于某些认证或访问控制的定制化支持较为复杂或不够灵活,这正是 HTNN 出现的背景。

HTNN 框架与插件机制概览

热插拔机制:插件通过 plugins.RegisterPlugin 接口注册,支持动态加载与配置。

统一请求拦截点:插件可以在请求进入 Envoy 之前对其进行处理(如验证、拦截)。

可配置结构:通过 Protobuf 配置文件或 ConfigMap 传递运行参数,实现运行时灵活控制。

与 Istio 无缝集成:在 Istio 的 service mesh 中以 sidecar 的形式运行,兼容 Istio 原生组件。

3.插件开发详解:BasicAuth 与 ACL

3.1 BasicAuth插件

功能点

1.基于 HTTP Basic Auth 的认证:

验证 HTTP 请求中的 Authorization 头部,确保用户提供了正确的用户名和密码。

如果认证失败,返回 HTTP 401 状态码。

2.支持多用户凭据:

插件支持配置多个用户名和密码对,允许不同用户访问。

3.动态配置:

用户名和密码通过配置文件动态加载,支持灵活调整

4.安全性:

使用 Base64 解码解析 Authorization 头部中的凭据。

如果凭据无效或缺失,拒绝请求。

实现细节

1. 配置结构

配置文件定义在 [config.go] 中:

type Config struct {Credentials map[string]string `json:"credentials,omitempty"`
}

Credentials 字段

键是用户名,值是对应的密码。

示例配置:

{"credentials": {"user1": "password1","user2": "password2"}
}

2. 插件注册

插件通过 plugins.RegisterPlugin 注册到框架中:

func init() {plugins.RegisterPlugin(basicauth.Name, &plugin{})
}

3. 核心逻辑

核心逻辑实现于 [filter.go] 中:

func (f *filter) DecodeHeaders(headers api.RequestHeaderMap, endStream bool) api.ResultAction {authHeader, ok := headers.Get("Authorization")if !ok || !strings.HasPrefix(authHeader, "Basic ") {return &api.LocalResponse{Code: 401, Msg: "missing or invalid Authorization header"}}encodedCredentials := strings.TrimPrefix(authHeader, "Basic ")decoded, err := base64.StdEncoding.DecodeString(encodedCredentials)if err != nil {return &api.LocalResponse{Code: 401, Msg: "invalid Authorization header"}}parts := strings.SplitN(string(decoded), ":", 2)if len(parts) != 2 {return &api.LocalResponse{Code: 401, Msg: "invalid Authorization header"}}username, password := parts[0], parts[1]if validPassword, ok := f.config.Credentials[username]; !ok || validPassword != password {return &api.LocalResponse{Code: 401, Msg: "invalid username or password"}}return api.Continue
}

逻辑说明:

检查 Authorization 头部是否存在,且是否以 Basic  开头。

使用 Base64 解码凭据,并解析出用户名和密码。

验证用户名和密码是否匹配配置中的凭据。

如果验证失败,返回 HTTP 401;否则继续处理请求。

4. 单元测试

单元测试位于 [filter_test.go]:

func TestBasicAuthFilter(t *testing.T) {tests := []struct {name     stringconf     stringheaders  map[string][]stringexpected int}{{name: "valid credentials",conf: `{"credentials": {"user1": "password1","user2": "password2"}}`,headers: map[string][]string{"Authorization": {"Basic " + base64.StdEncoding.EncodeToString([]byte("user1:password1"))},},expected: 0,},{name: "invalid credentials",conf: `{"credentials": {"user1": "password1","user2": "password2"}}`,headers: map[string][]string{"Authorization": {"Basic " + base64.StdEncoding.EncodeToString([]byte("user1:wrongpassword"))},},expected: 401,},}
}

测试覆盖了以下场景:

有效的用户名和密码。

无效的用户名或密码。

缺失 Authorization 头部

3.2 ACL插件

功能点

1.基于IP地址的访问控制:

支持通过 allow_list 和 deny_list 配置访问规则。

优先检查 deny_list,如果匹配则拒绝访问。

2.CIDR支持:

支持 CIDR 格式的 IP 地址范围匹配。

3.动态配置:

通过配置文件动态加载访问控制规则。

4.安全性:

如果请求的 IP 地址不在 allow_list 中,默认拒绝访问。

实现细节

1.配置结构

配置文件定义在 [config.go] 中:

type Config struct {AllowList []string `json:"allow_list,omitempty"`DenyList  []string `json:"deny_list,omitempty"`
}

AllowList 和 DenyList 字段

AllowList:允许访问的 IP 地址或 CIDR 范围。

DenyList:拒绝访问的 IP 地址或 CIDR 范围。

示例配置:

{"allow_list": ["192.168.1.0/24"],"deny_list": ["10.0.0.1"]
}

2.插件注册

插件通过 plugins.RegisterPlugin 注册到框架中:

func init() {plugins.RegisterPlugin(acl.Name, &plugin{})
}

3.核心逻辑

核心逻辑实现于 [filter.go] 中:

func (f *filter) DecodeHeaders(headers api.RequestHeaderMap, endStream bool) api.ResultAction {clientIP, ok := headers.Get("X-Forwarded-For")if !ok {return &api.LocalResponse{Code: 403, Msg: "client IP not found"}}for _, denyIP := range f.config.DenyList {if isIPMatch(clientIP, denyIP) {return &api.LocalResponse{Code: 403, Msg: "access denied"}}}for _, allowIP := range f.config.AllowList {if isIPMatch(clientIP, allowIP) {return api.Continue}}return &api.LocalResponse{Code: 403, Msg: "access denied"}
}

逻辑说明:

获取请求头中的 X-Forwarded-For 字段,提取客户端 IP。

检查 IP 是否匹配 deny_list,如果匹配则拒绝访问。

检查 IP 是否匹配 allow_list,如果匹配则允许访问。

如果未匹配任何规则,默认拒绝访问。

4.单元测试

单元测试位于 [filter_test.go]:

func TestACLFilter(t *testing.T) {tests := []struct {name     stringconf     stringheaders  map[string][]stringexpected int}{{name: "deny list match",conf: `{"allow_list": ["192.168.1.0/24"],"deny_list": ["10.0.0.1"]}`,headers: map[string][]string{"X-Forwarded-For": {"10.0.0.1"},},expected: 403,},{name: "allow list match",conf: `{"allow_list": ["192.168.1.0/24"],"deny_list": ["10.0.0.1"]}`,headers: map[string][]string{"X-Forwarded-For": {"192.168.1.50"},},expected: 0,},}
}

测试覆盖了以下场景

匹配 deny_list

匹配 allow_list

未匹配任何规则。

4.实践过程

4.1本地构建自定义HTNN镜像

1.修改源码并添加插件

分别在types\plugins(实现配置)和plugins\plugins(实现逻辑)目录下新增basicauth和acl目录。

分别在两个目录下的主插件入口调用RegisterPlugin(...)注册。

2.构建Docker镜像

先检查实现.editorconfig文件的代码格式规范,避免因系统版本不兼容导致换行符等问题影响镜像的构建

dockerfile文件直接复用 htnn\manifests\images\cp\Dockerfile 和htnn\manifests\images\dp\Dockerfile 就行

cd到 htnn\manifests\Makefile 目录下执行 make 命令完成构建:

make build-proxy-imagemake build-controller-image

4.2 在 Kubernetes 中部署插件

1.将构建好的数据面和控制面的镜像先导入到Kubernetes集群
minikube image load your-image-name1:tagminikube image load your-image-name2:tag
2.修改Helm Chart的 values.yaml文件
#文件 htnn\manifests\charts\htnn-controller\values.yaml
hub: ""image: htnn-controllertag: "latest"imagePullPolicy: "Never" # 不使用远程镜像
#文件 manifests\charts\htnn-gateway\values.yaml
gateway:name: istio-ingressgatewayimage: m.daocloud.io/docker.io/envoyproxy/envoy:latestimagePullPolicy: Neverenv:ISTIO_DELTA_XDS: "true"
#默认的manifests\charts\htnn-gateway\values.schema.json文件中没有镜像参数
#需要在json文件中添加该结构参数

3.部署或更新 HTNN 到 Kubernetes

首次部署:

控制面

helm install htnn-controller 本地Path\htnn\manifests\charts\htnn-controller --namespace istio-system --create-namespace -f 本地Path\htnn\manifests\charts\htnn-controller\values.yaml

 数据面

helm install htnn-gateway 本地Path\htnn\manifests\charts\htnn-gateway -n istio-system -f 本地Path\htnn\manifests\charts\htnn-gateway\values.yaml 

已有部署则使用升级命令 upgrade 替换 install

4.查看 istio-system 命名空间下所有 Pod 的运行状态

PS C:\WINDOWS\system32> kubectl -n istio-system get pods
NAME                                    READY   STATUS    RESTARTS       AGE
istio-ingressgateway-674cd8d4c9-lg692   1/1     Running   3 (3d2h ago)   3d20h
istiod-6b6c464bb7-2df62                 1/1     Running   3 (3d2h ago)   3d20h

如果出现异常状态,用以下命令查看原因

kubectl -n istio-system describe pod <pod-name>

4.3 测试验证流程

分别进行后端服务部署、入口流量管理、路由规则定义和安全认证策略配置,配置到kubernetes环境中

部署后端服务

//backend.yaml
---
apiVersion: v1
kind: Service
metadata:name: backendnamespace: istio-systemlabels:app: backend
spec:ports:- port: 80name: httptargetPort: 5678selector:app: backend
---
apiVersion: apps/v1
kind: Deployment
metadata:name: backendnamespace: istio-system
spec:replicas: 1selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- name: backendimage: hashicorp/http-echoargs:- "-text=hello from backend"ports:- containerPort: 5678

 定义入口网关

//gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: htnn-gatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"

 定义虚拟服务路由规则

//vs-basicauth.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:name: vs-basicauthnamespace: istio-system
spec:hosts:- "*"gateways:- htnn-gatewayhttp:- match:- uri:prefix: /route:- destination:host: backend.istio-system.svc.cluster.localport:number: 80

 定义 basicAuth 插件的策略

//basicauthpolicy.yaml
apiVersion: htnn.mosn.io/v1
kind: FilterPolicy
metadata:name: basicauth-policynamespace: istio-system
spec:targetRef:group: networking.istio.iokind: VirtualServicename: vs-basicauthfilters:basicAuth:config:credentials:admin: "admin123"user: "user123"

先通过 status 检查下策略是否被接受:

$ kubectl -n istio-system get filterpolicies.htnn.mosn.io policy -o yaml···​
status:conditions:- lastTransitionTime: "2025-05-15T13:56:42Z"message: The policy has been acceptedobservedGeneration: 1reason: Acceptedstatus: "True"type: Accepted
kind: List
metadata:resourceVersion: ""

让我们在一个终端上执行 port-forward,让本地的客户端可以访问到 k8s 里面的服务:

kubectl port-forward -n istio-system svc/istio-ingressgateway 30474:80

在另一个终端上,我们可以通过 30474 端口访问到 HTNN:

//正确的用户名和密码
curl -v --user admin:admin123 http://localhost:30474/get
HTTP/1.1 200 OK
//不正确的
curl -v --user admin:admin121 http://localhost:30474/get
HTTP/1.1 401 Unauthorized

以上是basicauth插件的测试流程,acl的流程是一样的,先将配置文件写好,再应用策略:

//aclpolicy.yaml
apiVersion: htnn.mosn.io/v1
kind: FilterPolicy
metadata:name: acl-policynamespace: istio-system
spec:targetRef:group: networking.istio.iokind: VirtualServicename: vs-aclfilters:acl:config:allow_list:- "192.168.1.0/24"deny_list:- "10.0.0.1"

 让我们在一个终端上执行 port-forward,让本地的客户端可以访问到 k8s 里面的服务:

kubectl port-forward -n istio-system svc/istio-ingressgateway 30474:80

在另一个终端上,我们可以通过 30474 端口访问到 HTNN:

curl -v --header "Host: backend.local" --header "X-Forwarded-For: 192.168.1.100" http://localhost:30474/getHTTP/1.1 200 OKcurl -v --header "Host: backend.local" --header "X-Forwarded-For: 10.0.0.1" http://localhost:30474/getHTTP/1.1 403 Forbidden

相关文章:

增强 HTNN 服务网格功能:基于 Istio 的BasicAuth 与 ACL 插件开发实战

目录 1.引言 什么是HTNN&#xff1f; 为什么开发 BasicAuth 和 ACL 插件&#xff1f; 2.技术背景 技术栈概览 Istio 与服务网格简述 HTNN 框架与插件机制概览 3.插件开发详解&#xff1a;BasicAuth 与 ACL 3.1 BasicAuth插件 功能点 实现细节 3.2 ACL插件 功能点 …...

从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例

产品部门定义了一个如下概念性的“知识奇点工程师”&#xff0c;他们构建的不仅仅是一个数据库或知识图谱&#xff0c;而是一个活的、能自我进化的知识生态系统&#xff0c;是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性&#xff0c;不亚于为AI引擎…...

docker(四)使用篇一:docker 镜像仓库

前文我们已经介绍了 docker 并安装了 docker&#xff0c;下面我们将正式步入使用环节&#xff0c;本章是第一个使用教学&#xff1a;docker 镜像仓库。 一、什么是镜像仓库 所谓镜像仓库&#xff0c;其实就是负责存储、管理和分发镜像的仓库&#xff0c;并且建立了仓库的索引…...

S7-1500 与 IM60 进行 PROFINET 通信

S7-1500 与 IM60 进行 PROFINET 通信 本文档介绍使用 S7-1500 CPU 与 IM 60 进行 PROFINET 通信&#xff0c;实现对 IM60 及 AM03 的控制。 使用软件及硬件 软件&#xff1a;工控人加入PLC工业自动化精英社群 TIA Portal V19 ET 200 SMART IM60 GSD 文件下载链接&#xff…...

车载诊断架构 ---车载总线对于功能寻址的处理策略

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

观QFramework框架底层逻辑有感

拿QFramework&#xff08;以下简称QF&#xff09;第一个案例简单理解框架底层代码逻辑。 使用QF框架重构后的代码&#xff0c;给我这种小白一种很抽象的感觉&#xff0c;但好的代码就是抽象的&#xff0c;这是不可否认的。于是想掌握一下这个框架的基础部分&#xff0c;至少能…...

ExecutorService详解:Java 17线程池管理从零到一

简介 在现代高并发应用中,线程池管理已成为提升系统性能与稳定性的关键核心技术。ExecutorService作为Java并发编程的核心接口,提供了对线程池的强大抽象与管理能力,相比直接管理线程,它能显著降低资源消耗、提高响应速度并增强系统可维护性。随着Java 17的发布,线程池管…...

Go 中闭包的常见使用场景

在 Go 中&#xff0c;闭包&#xff08;Closure&#xff09; 是一个函数值&#xff0c;它引用了其定义时所在作用域中的变量。也就是说&#xff0c;闭包可以访问并修改外部作用域中的变量。 Go 中闭包的常见使用场景 ✅ 1. 封装状态&#xff08;无须结构体&#xff09; 闭包可…...

养生:打造健康生活的四大支柱

饮食养生&#xff1a;吃对食物&#xff0c;滋养生命根基 饮食是健康的物质基础&#xff0c;需遵循 “均衡、天然、顺应时节” 原则&#xff1a; 三餐科学搭配&#xff1a; 早餐以高蛋白 膳食纤维为主&#xff0c;如燕麦粥配水煮蛋、蓝莓&#xff0c;快速激活代谢&#xff1b;…...

OpenCV 图像直方图:从原理剖析到实战应用

在数字图像处理领域&#xff0c;图像直方图是一种强大而基础的工具&#xff0c;它以直观的方式展示了图像中像素值的分布情况。OpenCV 作为广泛应用的计算机视觉库&#xff0c;提供了丰富的函数来处理图像直方图。本文将深入讲解图像直方图的原理、OpenCV 中的实现方法&#xf…...

springboot+vue实现在线书店(图书商城)系统

今天教大家如何设计一个图书商城 , 基于目前主流的技术&#xff1a;前端vue&#xff0c;后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统&#xff0c;需要有商品中心&#xff0c;库存中心&#xff0c;订单…...

LLM Text2SQL NL2SQL 实战总结

目录 尽量全面的描述表的功能 尽量全面的描述字段的功能 适当放弃意义等价的字段 放弃业务上无用的字段 对于LLM来说,由于它没有什么行业经验,所以我们需要尽可能的给予它恰当的“背景信息”,才能使它更好的工作。所谓恰当,不是越多越好,因为太多的信息会消耗掉LLM的可…...

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境&#xff1a;SQLPub。它提供了最新版本的 MySQL 服务器测试服务&#xff0c;可以方便开发者和测试人员验证数据库功能&#xff0c;也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址&#xff1a; https://sqlpub.com/ SQLP…...

EasyExcel集成使用总结与完整示例

EasyExcel集成使用总结与完整示例 一、EasyExcel简介 EasyExcel是阿里巴巴开源的Java库&#xff0c;专注于简化Excel文件的读写操作。它基于Apache POI进行了优化&#xff0c;采用流式处理&#xff0c;具有低内存占用和高性能的特点&#xff0c;非常适合处理大规模数据的导入…...

【hot100-动态规划-139.单词拆分】

力扣139.单词拆分 本题要求判断给定的字符串 s 是否可以被空格拆分为一个或多个在字典 wordDict 中出现的单词,且不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用,这是一个典型的动态规划问题。 动态规划思路 定义状态: 定义一个布尔类型的数组 dp,其中…...

人工神经网络(ANN)模型

一、概述 人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;是一种模拟生物神经网络结构和功能的计算模型&#xff0c;它通过大量的神经元相互连接&#xff0c;实现对复杂数据的处理和模式识别。从本质上讲&#xff0c;人工神经网络是…...

2025ICPC陕西省赛题解

L. easy 每行选能选的最小的两个&#xff0c;注意处理奇数的情况。 #include <bits/stdc.h> #define x first #define y second #define int long longusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<lon…...

不同进制的数据展示(十进制、十六进制、编码方式)

目录 1、十六进制的数值转为十进制&#xff08;可能是补码&#xff09; 2、十进制转为十六进制&#xff08;负数要转为补码&#xff09; 背景&#xff1a; &#xff08;1&#xff09; 接收到通讯的数据&#xff0c;把数据读取出来&#xff0c;并转成自己想要的格式。 &#x…...

贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现

贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现 目录 贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现效果一览基本介绍程序设计参考资料…...

为什么doris是实时的?

Apache Doris 作为实时分析型数据库的核心竞争力源于其技术架构与功能设计的深度融合&#xff0c;以下从关键特性解析其实时能力的技术实现&#xff1a; 一、 ‌MPP架构驱动分布式并行计算‌ 基于 ‌大规模并行处理&#xff08;MPP&#xff09;架构‌&#xff0c;Dori…...

ProceedingJoinPoint的认识

ProceedingJoinPoint 是 Spring AOP&#xff08;面向切面编程&#xff09; 中的核心接口&#xff0c;用于在 环绕通知&#xff08;Around&#xff09; 中拦截方法调用并控制其执行流程。以下是对其功能和用法的详细解释&#xff1a; 核心作用 拦截目标方法 在方法执行前后插…...

穿透工具如何保证信息安全?

引言 在当今数字化时代&#xff0c;网络穿透工具&#xff08;如VPN、SSH隧道、内网穿透工具等&#xff09;已成为企业远程办公和个人隐私保护的重要技术手段。然而&#xff0c;这些工具本身也可能成为信息安全的风险点。本文将探讨穿透工具如何在不牺牲便利性的前提下&#xff…...

卷积神经网络和深度神经网络的区别是什么?

近 6000 字长文梳理深度神经网络结构。 先来一个省流版回答&#xff1a;卷积神经网络&#xff08;CNN&#xff09;只是深度神经网络&#xff08;DNN&#xff09;家族中的一员&#xff0c;其处理数据&#xff08;如图像&#xff09;的核心方式是卷积操作&#xff0c;因此而得名…...

C#语言中 (元,组) 的发展史

C# 中的元组&#xff08;Tuple&#xff09;详解 元组(Tuple)是 C# 中的一种数据结构&#xff0c;用于将多个不同类型的值组合成一个复合值。元组在 C# 7.0 中得到了重大改进&#xff0c;提供了更简洁的语法和更好的性能。 1. 元组的基本概念 元组允许你将多个值组合成一个单…...

Apollo学习——planning模块(3)之planning_base

planning_component、planning_base、on_lane_planning 和 navi_planning 的关系 1. 模块关系总览 继承层次 PlanningComponent&#xff1a;Cyber RT 框架中的 入口组件&#xff0c;负责调度规划模块的输入输出和管理生命周期。PlanningBase&#xff1a;规划算法的 抽象基类&…...

【SPIN】PROMELA语言编程入门基础语法(SPIN学习系列--1)

PROMELA&#xff08;Protocol Meta Language&#xff09;是一种用于描述和验证并发系统的形式化建模语言&#xff0c;主要与SPIN&#xff08;Simple Promela Interpreter&#xff09;模型检查器配合使用。本教程将基于JSPIN&#xff08;SPIN的Java图形化版本&#xff09;&#…...

Linux --systemctl损坏

systemctlSegmentation fault (core dumped) 提示这个 Ubuntu/Debian sudo apt-get update sudo apt-get --reinstall install systemdCentOS/RHEL sudo yum reinstall systemd # 或 CentOS 8 / RHEL 8 sudo dnf reinstall systemd...

Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,

Vue3ElementPlus后台管理系统&#xff0c;支持白天黑夜主题切换&#xff0c;专为教育管理场景设计。主要功能包括用户管理&#xff08;管理员、教师、学生&#xff09;、课件资源管理&#xff08;课件列表、下载中心&#xff09;和数据统计&#xff08;使用情况、教学效率等&am…...

Seata源码—3.全局事务注解扫描器的初始化二

大纲 1.全局事务注解扫描器继承的父类与实现的接口 2.全局事务注解扫描器的核心变量 3.Spring容器初始化后初始化Seata客户端的源码 4.TM全局事务管理器客户端初始化的源码 5.TM组件的Netty网络通信客户端初始化源码 6.Seata框架的SPI动态扩展机制源码 7.向Seata客户端注…...

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)

Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;七&#xff09; 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;六&#xff09;-CSDN博客 的基础上改进&#xff0c;主要是…...

快速搭建一个electron-vite项目

1. 初始化项目 在命令行中运行以下命令 npm create quick-start/electronlatest也可以通过附加命令行选项直接指定项目名称和你想要使用的模版。例如&#xff0c;要构建一个 Electron Vue 项目&#xff0c;运行: # npm 7&#xff0c;需要添加额外的 --&#xff1a; npm cre…...

Python网络请求利器:urllib库深度解析

一、urllib库概述 urllib是Python内置的HTTP请求库&#xff0c;无需额外安装即可使用。它由四个核心模块构成&#xff1a; ​​urllib.request​​&#xff1a;发起HTTP请求的核心模块​​urllib.error​​&#xff1a;处理请求异常&#xff08;如404、超时等&#xff09;​​…...

2025认证杯第二阶段数学建模B题:谣言在社交网络上的传播思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、引言 在当今数字化时代&#xff0c;社交网络已然成为人们生活中不可或缺的一部分。信息在社交网络上的传播速度犹如闪电&#xff0c;瞬间就能触及大量用户。然而&#xff0c;这也为谣言的滋生和扩…...

IP地址、端口、TCP介绍、socket介绍、程序中socket管理

1、IP地址&#xff1a;IP 地址就是 标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。IP 地址的作用是 标识网络中唯一的一台设备的&#xff0c;也就是说通过IP地址能够找到网络中某台设备。 2、端口&#xff1a;代表不同的进程,如下图&#xff1a; 3、socket:…...

leetcode0621. 任务调度器-medium

1 题目&#xff1a;任务调度器 官方标定难度&#xff1a;中 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表&#xff0c;用字母 A 到 Z 表示&#xff0c;以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成&#xff0c;但有一个限制…...

中小型培训机构都用什么教务管理系统?

在教育培训行业快速发展的今天&#xff0c;中小型培训机构面临着学员管理复杂、课程体系多样化、教学效果难以量化等挑战。一个高效的教务管理系统已成为机构运营的核心支撑。本文将深入分析当前市场上适用于中小型培训机构的教务管理系统&#xff0c;重点介绍爱耕云这一专业解…...

centos7 基于yolov10的推理程序环境搭建

这篇文章的前提是系统显卡驱动已经安装 安装步骤参照前一篇文章centos7安装NVIDIA显卡 安装Anaconda 下载地址anaconda.com 需要注册账号获取下载地址 wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh赋予权限 chmod ax Anaconda3-2024.10-1-…...

Web GIS可视化地图框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript

Mapbox、OpenLayers、Leaflet、ArcGIS for JavaScript和Cesium是五种常用的Web GIS地图框架&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。还有常见的3d库和高德地图、百度地图。 1. Mapbox 官网Mapbox Gl JS案列&#xff1a;https://docs.mapbox.com/mapbox-gl-…...

Kafka如何实现高性能

Kafka如何实现高性能 Kafka之所以能成为高性能消息系统的标杆&#xff0c;是通过多层次的架构设计和优化实现的。 一、存储层优化 1. 顺序I/O设计 日志结构存储&#xff1a;所有消息追加写入&#xff0c;避免磁盘随机写分段日志&#xff1a;将日志分为多个Segment文件&…...

如何通过partclone克隆Ubuntu 22系统

如何通过partclone克隆Ubuntu 22系统 一. 背景知识&#xff1a;为什么要克隆系统&#xff1f;二. 准备工作详解2.1 选择工具&#xff1a;为什么是partclone&#xff1f;2.2 制作定制化ISO的深层原因 三. 详细操作步骤3.1 环境准备阶段3.2 ISO改造关键步骤3.3 启动到Live环境3.4…...

语义化路径是什么意思,举例说明

下面的java代码输出结果是/a/b/../c/./a.txt/a/c/a.txt&#xff0c;语义化路径是什么意思呢&#xff1f;代码如下所示&#xff1a; import org.springframework.util.StringUtils; public class StringUtilsTest { /** 字符串处理 */ Test public void …...

Dockerfile构建镜像

Dockerfile 构建镜像 # 使用本地已下载的 java:8-alpine 镜像作为基础镜像 FROM java:8-alpine# 设置工作目录 WORKDIR /home/www/shop# 复制 JAR 文件到容器中 COPY ./fkshop-build.jar /home/www/shop/fkshop-build.jar# 复制配置文件&#xff08;如果需要&#xff09; COPY…...

vue3.0的name属性插件——vite-plugin-vue-setup-extend

安装 这个由于是在开发环境下的一个插件 帮助我们支持name属性 所以需要是-D npm i vite-plugin-vue-setup-extend -D在pasckjson中无法注释每个插件的用处 可以在vscode中下载一个JsonComments这样可以在json中添加注释方便日后维护和查阅API 引入 在vite.config.js中 im…...

gRPC为什么高性能

gRPC 之所以具备高性能的特性,主要得益于其底层设计中的多项关键技术优化。以下从协议、序列化、传输机制、并发模型等方面详细解析其高性能的原因: 1. 基于 HTTP/2 协议的核心优势 HTTP/2 是 gRPC 的传输基础,相较于 HTTP/1.x,它通过以下机制显著提升了效率: 多路复用(…...

进度管理高分论文

2022年&#xff0c;xx县开展紧密型县域医共体建设&#xff0c;将全县县、镇两级医疗机构组建成2家医共体&#xff0c;要求医共体内部实行行政、人员、财务、业务、信息、绩效、药械“七统一”管理。但是卫生系统整体信息化水平较低&#xff0c;业务系统互不相通&#xff0c;运营…...

每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h

一.定长滑动窗口 【套路】教你解决定长滑窗&#xff01;适用于所有定长滑窗题目&#xff01; 模版套路 1.题目描述 1.计算所有长度恰好为 k 的子串中&#xff0c;最多可以包含多少个元音字母 2.找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 3.…...

C++核心编程--1 内存分区模型

C程序执行时&#xff0c;内存可以划分为4部分 代码区&#xff1a;存放函数体的二进制代码 全局区&#xff1a;存放全局变量、静态变量、常量 栈区&#xff1a;局部变量、函数参数值&#xff0c;编译器自动分配和释放 堆区&#xff1a;程序员自己分配和释放 1.1 程序运行前…...

产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布

五月&#xff0c;谷云科技 iPaaS 集成平台保持月度更新&#xff0c; V7.5 版本于近日正式发布。我们一起来看看新版本有哪些升级和优化。 核心新增功能&#xff1a;深化API治理&#xff0c;释放连接价值 API网关&#xff1a;全链路可控&#xff0c;精准管控业务状态 业务状态…...

【AI论文】对抗性后期训练快速文本到音频生成

摘要&#xff1a;文本到音频系统虽然性能不断提高&#xff0c;但在推理时速度很慢&#xff0c;因此对于许多创意应用来说&#xff0c;它们的延迟是不切实际的。 我们提出了对抗相对对比&#xff08;ARC&#xff09;后训练&#xff0c;这是第一个不基于蒸馏的扩散/流模型的对抗加…...

欧拉计划 Project Euler 73(分数有范围计数)题解

欧拉计划 Project Euler 73 题解 题干分数有范围计数 思路code 题干 分数有范围计数 考虑形如 n d \frac{n}{d} dn​的分数&#xff0c;其中 n n n和 d d d均为正整数。如果 n < d n<d n<d且其最大公约数为1&#xff0c;则称该分数为最简真分数。 将所有 d ≤ 8 d\l…...