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

Kubernetes服务注册到consul流程实践


文章目录

  • 前言
  • 架构图示意
  • 一、环境准备
  • 二、consul部署
    • 1.yaml示例
    • 2.consul部署验证
  • 三、consulctl工具实现
    • 1.核心功能
    • 2.注册到consul的标签及元数据
    • 3.consulctl工具使用示例
  • 四、通过Dockerfile构建consulctl工具镜像
  • 五、Kubernetes集成方案
  • 六、 结果验证
    • 1.注册验证
    • 2.销毁验证
  • 总结
    • 物来顺应,未来不迎,当时不杂,既过不恋


前言

在云原生架构中,服务注册与发现是微服务架构的核心组件之一。随着Kubernetes成为容器编排的事实标准,如何将传统服务注册中心与Kubernetes原生服务发现机制相结合,成为企业级应用面临的重要课题。本文详细介绍如何利用HashiCorp Consul实现Kubernetes服务的自动注册与发现,通过开发定制化工具解决实际生产环境中的服务治理难题,并结合Prometheus实现监控


目的: 通过开发一个轻量级的 consulctl 工具,配合Kubernetes的生命周期钩子preStop函数+sidecar边车容器实现pod启动时自动注册到consul、pod销毁时自动从consul剔除

架构图示意

在这里插入图片描述

一、环境准备

名称作用
k8s1.28集群用于部署consul及测试pod
docker镜像构建
harbor镜像存储

二、consul部署

以NFS为底层存储,通过storageclass实现consul的动态pv

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: consul-storage #要与statefulset文件中的名称一致
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:archiveOnDelete: "true"
reclaimPolicy: Retai

1.yaml示例

如下(示例):consul开启ACL token,避免后续未授权登录漏洞

生成一个64位字符串用做于consul的master token

[root@k8s-master consul]# uuidgen
9bfbe81f-2648-4673-af14-d13e0a170050

准备consul的配置文件,开启acl、配置token,生成configmap

[root@k8s-master consul]# cat consul-config.json 
{"datacenter":"dc8","primary_datacenter":"dc8","acl":{"enabled":true, #开启ACL"default_policy":"deny","enable_token_persistence":true,"enable_key_list_policy":true,"tokens":{"master":"9bfbe81f-2648-4673-af14-d13e0a170050" #上述生成}}
}[root@k8s-master consul]# kubectl create configmap global-config -n middleware --from-file ./consul-config.json

statefulset文件

apiVersion: apps/v1
kind: StatefulSet
metadata:name: consulnamespace: middleware
spec:serviceName: consul-serverreplicas: 1selector:  # 新增selector部分matchLabels:component: consul  # 必须与template.metadata.labels中的标签匹配template:metadata:labels:component: consul  # 这里已经正确设置spec:tolerations:  # 新增污点容忍- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:  # 改为软性要求- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: componentoperator: Invalues:- consultopologyKey: kubernetes.io/hostnamecontainers:- name: consulimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/hashicorp/consul:latestargs:- "agent"- "-server"- "-bootstrap-expect=1" #此处的数量要与副本数相同- "-ui"- "-data-dir=/etc/consul/data"- "-config-file=/etc/consul/config/consul-config.json"- "-bind=0.0.0.0"- "-client=0.0.0.0"- "-advertise=$(PODIP)"- "-retry-join=consul-server.$(NAMESPACE).svc.cluster.local" - "-domain=cluster.local"- "-disable-host-node-id"livenessProbe:httpGet:path: /v1/status/leaderport: 8500initialDelaySeconds: 20  # Consul启动较慢需要更长的初始延迟periodSeconds: 20failureThreshold: 3readinessProbe:httpGet:path: /v1/status/peersport: 8500initialDelaySeconds: 15periodSeconds: 5successThreshold: 1failureThreshold: 2resources:requests:memory: "256Mi"cpu: "100m"limits:memory: "512Mi"cpu: "500m"volumeMounts:- name: datamountPath: /etc/consul/data- name: configmountPath: /etc/consul/config- name: timemountPath: /etc/localtimeenv:- name: PODIPvalueFrom:fieldRef:fieldPath: status.podIP- name: NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- containerPort: 8500name: ui-port- containerPort: 8400name: alt-port- containerPort: 53name: udp-port- containerPort: 8443name: https-port- containerPort: 8080name: http-port- containerPort: 8301name: serflan- containerPort: 8302name: serfwan- containerPort: 8600name: consuldns- containerPort: 8300name: servervolumes:- name: configconfigMap:name: consul- name: timehostPath:path: /usr/share/zoneinfo/Asia/Shanghai#- name: data#emptyDir: {}volumeClaimTemplates:  # 持久化存储声明模板- metadata:name: dataspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "consul-storage"  # 根据实际存储类调整resources:requests:storage: 1Gi #自行调整

无头service文件和nodeport类型的svc文件

apiVersion: v1
kind: Service
metadata:name: consul-server  # 必须与 StatefulSet 的 serviceName 一致namespace: middleware
spec:clusterIP: None  # Headless Service 特征ports:- port: 8300name: server-rpcselector:component: consul  # 匹配 Pod 标签
---
apiVersion: v1
kind: Service
metadata:name: consul-uinamespace: middlewarelabels:component: consul
spec:type: NodePortports:- name: httpport: 8500targetPort: 8500nodePort: 30850  # 自定义端口范围 30000-32767selector:component: consul  # 必须匹配 StatefulSet 的 Pod 标签

2.consul部署验证

代码如下(示例):

[root@k8s-master consul]# kubectl get pod,svc -n middleware 
NAME           READY   STATUS    RESTARTS   AGE
pod/consul-0   1/1     Running   0          11mNAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/consul-server   ClusterIP   None           <none>        8300/TCP         46h
service/consul-ui       NodePort    10.96.23.206   <none>        8500:30850/TCP   46h

访问验证
在这里插入图片描述

三、consulctl工具实现

1.核心功能

使用golang 调用consul包"github.com/hashicorp/consul/api" 实现pod的注册和销毁
注册逻辑包含以下关键步骤:1. 解析Pod环境变量(名称、IP、命名空间)2. 构造service名称 (采用pod所在的名称空间)3. 构造服务ID(采用 <pod-name>-<port> 格式)4. 添加丰富的元数据(监控类型、所属项目等)5. 调用Consul API完成注册
采用双重注销机制确保可靠性:1. 当执行delete pod或者delete -f xxx.yaml时 优先通过Agent接口注销2. 失败后尝试Catalog接口注销3. 收集所有错误信息统一处理
//核心功能定义
type ServiceManager struct {client *api.Client
}func NewServiceManager(consulAddr, token string) (*ServiceManager, error) {config := api.DefaultConfig()config.Address = strings.TrimSpace(consulAddr)config.Token = strings.TrimSpace(token)config.Transport.TLSHandshakeTimeout = defaultTimeoutclient, err := api.NewClient(config)if err != nil {return nil, fmt.Errorf("consul client init failed: %w", err)}return &ServiceManager{client: client}, nil
}func (sm *ServiceManager) Register(service *api.AgentServiceRegistration) error {return sm.client.Agent().ServiceRegister(service)
}func (sm *ServiceManager) Deregister(serviceID string) error {return sm.client.Agent().ServiceDeregister(serviceID)
}

2.注册到consul的标签及元数据

pod注册到consul中后tag是container和对应的pod名称,元数据标签包含pod名称、podIP、端口、所在节点名称、监控类型、标题

Tags: []string{"container",podName,},
Meta: map[string]string{"podName":     podName,"podIP":       podIP,"podPort":     port,"hostNode":    hostNode,"monitorType": monitorType,"project":     project,
}

3.consulctl工具使用示例

注册

[root@k8s-master consul]# ./consulctl register "http://consulIP:consulPort" "consul的ACL TOKEN" "微服务的容器端口" "monitorType(自行命名)" "project(自行命名)"

销毁

[root@k8s-master consul]# ./consulctl deregister "http://consulIP:consulPort" "consul的ACL TOKEN" "微服务的容器端口" "consul的节点名称(理解为conusl的pod名称)"

四、通过Dockerfile构建consulctl工具镜像

结合golang多阶段构建

FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/golang:1.23.7 AS builder
WORKDIR /app
COPY go.mod go.sum ./
COPY vendor  ./
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -mod=vendor -o /usr/local/bin/consulctlFROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/alpine:3.18.6
WORKDIR /usr/local/bin/
COPY --from=builder /usr/local/bin/consulctl /usr/local/bin/
ENTRYPOINT ["consulctl"]

通过docker构建并保存为tar文件

[root@k8s-master consul]# docker build -t pod_registry:v1.0 .
[root@k8s-master consul]# docker save -o pod_registry_v1.tar.gz pod_registry:v1.0

通过containerd的ctr命令将其导入到harbor中

#导入
[root@k8s-master consul]# ctr image import pod_registry_v1.tar.gz#替换标签
[root@k8s-master consul]# ctr image tag docker.io/library/pod_registry:v1 harbor.ops.local/registry/pod_registry:v1.0#推送到harbor仓库
[root@k8s-master consul]# ctr image push harbor.ops.local/registry/pod_registry:v1.0 --user admin:"xxxx" -k

五、Kubernetes集成方案

以k8s部署minio为例,修改对应的yaml文件,实现minio pod启动时将其注册到consul

文件如下所示 :只演示关键部分添加

global-config名称的configamap准备

apiVersion: v1
kind: ConfigMap
metadata:name: global-confignamespace: middleware  # 与微服务同命名空间
data:CONSUL_IP: "consul-server.middleware.svc.cluster.local:8500"  # Consul服务DNS名称

acl-token secretyaml准备

apiVersion: v1
kind: Secret
metadata:name: acl-tokennamespace: middleware
type: Opaque
data:ACL_TOKEN: OWJmYmU4MWYtMjY0OC00NjczLWFmMTQtZDEzZTBhMTcwMDUwCg==  #上述64位字符串进行base64加密

共享卷使用--使initContainer中的consulctl命令能在container中使用

关键设计点:1. 使用initContainer完成注册2. 通过共享卷将工具拷贝到业务容器3. 支持Consul节点参数动态配置和动态获取Consul服务地址和ACL令牌
      initContainers:- name: service-registrarimage: harbor.ops.local/registry/pod_registry:v1.0 #consulctl工具镜像env:- name: POD_NAME #获取pod名称,用于注册到consul中显示valueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACE  #用于将注册到consul的pod以自身的名称空间为目录valueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IP #用于consul中meta元数据展示valueFrom:fieldRef:fieldPath: status.podIP- name: CONSUL_IP #用于注册时连接consulvalueFrom:configMapKeyRef:name: global-config #与上述configmap名称一致key: CONSUL_IP- name: ACL_TOKEN #用于注册时登录consulvalueFrom:secretKeyRef:name: acl-token #与上述secret名称一致key: ACL_TOKEN - name: NODE_NAME  #用于consul中meta元数据展示valueFrom: fieldRef:fieldPath: spec.nodeNamevolumeMounts:- mountPath: /shared-bin  # 共享卷 /shared-bin目录 挂载到 Container,使其也能使用这个工具,不用再次封装minio镜像name: shared-bincommand: ["sh", "-c"]args:- |cp /usr/local/bin/consulctl /shared-bin/ &&/usr/local/bin/consulctl register \"$CONSUL_IP" \"$ACL_TOKEN" \"9000" \    #微服务pod端口"容器监控" \ #自定义"k8s"       #自定义

preStop钩子函数

通过preStop钩子确保:1. 服务注销先于Pod终止2. 设置terminationGracePeriodSeconds为60秒3. 支持Consul节点参数动态配置和动态获取Consul服务地址和ACL令牌
.....containers:- env:- name: CONSUL_IP  # 必须显式声明valueFrom:configMapKeyRef:name: global-configkey: CONSUL_IP- name: ACL_TOKEN  # 必须显式声明valueFrom:secretKeyRef:name: acl-tokenkey: ACL_TOKEN- name: CONSUL_NODE_NAME #根据自己的consul名称替换value: "consul-0"- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.nameimage: harbor.jdicity.local/registry/minio:latestlifecycle:preStop:exec:command: ["sh", "-c", "/usr/local/bin/consulctl deregister $CONSUL_IP $ACL_TOKEN 9000(根据实际微服务端口进行替换) $CONSUL_NODE_NAME"]volumeMounts:- mountPath: /usr/local/bin/consulctl  # 挂载到 minio 容器的 PATH 目录name: shared-binsubPath: consulctlvolumes:- name: shared-bin  # 共享卷emptyDir: {}

六、 结果验证

1.注册验证

在这里插入图片描述

创建minio,查看conusl ui中是否已经按要求注册到minio pod

[root@k8s-master consul]# kubectl apply -f sts_minio.yaml[root@k8s-master consul]# kubectl get pod -n middleware  -owide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE                       NOMINATED NODE   READINESS GATES
minio-0    1/1     Running   0          52s   10.244.1.63    k8s-node.ops.local     <none>           <none>
minio-1    1/1     Running   0          52s   10.244.0.113   k8s-master.ops.local   <none>           <none>#查看sidecar边车容器日志 提示注册成功
[root@k8s-master consul]# kubectl logs -f -n middleware minio-0 service-registrar 
/usr/local/bin/consulctl
register
consul-server.middleware.svc.cluster.local:8500
9bfbe81f-2648-4673-af14-d13e0a1700509000
容器监控
k8s
Service registered successfully

在这里插入图片描述
在这里插入图片描述

2.销毁验证

现在模拟删除一个minio-0 pod,看新pod是否会注册

[root@k8s-master consul]# kubectl delete pod -n middleware  minio-0
pod "minio-0" deleted
[root@k8s-master consul]# kubectl get pod -n middleware  -owide
NAME       READY   STATUS    RESTARTS   AGE     IP             NODE                  NOMINATED NODE   READINESS GATES
minio-0    1/1     Running   0          18s     10.244.1.64    k8s-node.ops.local     <none>           <none>
minio-1    1/1     Running   0          8m44s   10.244.0.113   k8s-master.ops.local   <none>           <none>

在这里插入图片描述
在这里插入图片描述
现在模拟删除一个minio的statefulset yml文件,看pod是否会被剔除

[root@k8s-master consul]# kubectl delete -f sts_minio.yml 
service "minio-svc" deleted
secret "minio-secret" deleted
statefulset.apps "minio" deleted

在这里插入图片描述

至此pod在consul中的注册/销毁功能已全部演示完成,目前已接入维护的项目中,需要工具留言即可


总结

物来顺应,未来不迎,当时不杂,既过不恋

曾国藩的这十六字箴言意思是,凡事要顺其自然,坦然面对,活在当下,不过度担忧未来还未发生的事,要心无杂念地做好眼前的事,不要去留恋和纠结发生过的事。这些处世原则可以帮助我们更好地应对生活的挑战,也让我们拥有更为丰富、充实和幸福的人生。希望各位亦是如此!!!

相关文章:

Kubernetes服务注册到consul流程实践

文章目录 前言架构图示意一、环境准备二、consul部署1.yaml示例2.consul部署验证 三、consulctl工具实现1.核心功能2.注册到consul的标签及元数据3.consulctl工具使用示例 四、通过Dockerfile构建consulctl工具镜像五、Kubernetes集成方案六、 结果验证1.注册验证2.销毁验证 总…...

供应链业务-供应链全局观(三)- 供应链三流的集成

概述 供应链的全局观的全两篇文章主要描述了供应链的基础概念和供应链的协作和集成问题。 供应链业务-供应链全局观&#xff08;一&#xff09;定义了什么是供应链和供应链管理。 所谓供应链就是把采购进来的东西&#xff0c;通过自身的生成加工&#xff0c;进行增值服务&am…...

Docker 提示Docker Engine stopped

做AI开发的时候&#xff0c;安装Docker提示Docker Engine stopped&#xff0c;以下是解决步骤&#xff1a; 一般都是成功的&#xff0c;不成功很可能是电脑兼容问题&#xff0c;通过采用4.4.4版本解决的&#xff1a; docker desktop 4.4.4 旧版本下载&#xff1a;在这里找到了4…...

对自己的优缺点评价

在面试中回答优缺点时&#xff0c;需要既体现自我认知的客观性&#xff0c;又能将优缺点与岗位需求结合&#xff0c;避免暴露可能影响工作的硬伤。以下是一个符合Java开发者角色的回答框架&#xff0c;供参考&#xff1a; 回答思路&#xff1a; 优点&#xff1a;选择与岗位直接…...

解决eNSP在24H2版本下AR_40启动失败问题

前言 1.网络学习中缺少不了模拟&#xff0c;自从Windows版本更新24H2以后&#xff0c;eNSP就出现各种问题&#xff0c;最常见的就是AR报错40【启动失败】&#xff0c;之前我也去网站搜了&#xff0c;也问了Microsoft社区&#xff0c;发现他们在底层逻辑上进行了修改(开启了虚拟…...

计算机组成原理-指令系统

1. 指令系统的定义与作用 指令系统&#xff08;Instruction Set Architecture, ISA&#xff09;是计算机硬件与软件之间的接口规范&#xff0c;定义了CPU能够识别和执行的所有指令的集合&#xff0c;是计算机体系结构的核心组成部分。 核心作用&#xff1a; 为程序员提供操作…...

Oracle数据库中 LEVEL start with prior connect by

在Oracle数据库中&#xff0c;处理层次结构数据是一项常见且重要的任务。无论是组织结构、分类目录还是其他具有层级关系的数据&#xff0c;Oracle都提供了强大的工具来简化和优化这些操作。其中&#xff0c;LEVEL伪列结合CONNECT BY和START WITH关键字&#xff0c;成为了处理层…...

HTTP 1.1 比 HTTP1.0 多了什么?(详尽版)

相较于HTTP 1.0&#xff0c;1.1 版本增加了以上特性&#xff1a; 1. 新增了连接管理即 keepalive&#xff0c;允许持久连接。 定义&#xff1a; Keepalive允许客户端和服务器在完成一次请求-响应后&#xff0c;保持连接处于打开状态&#xff0c;以便后续请求复用同一连接&am…...

Java学习手册:Java I/O与NIO

Java I/O&#xff08;Input/Output&#xff09;和NIO&#xff08;New Input/Output&#xff09;是Java语言中用于处理输入输出操作的重要部分。它们提供了丰富的API来处理文件和网络通信。I/O是Java早期版本中引入的&#xff0c;而NIO是在Java 1.4中引入的&#xff0c;旨在提供…...

linux下的目录文件管理和基本文件管理的基本操作

目录 1.目录创建&#xff0c;文件创建和文件编辑的案例 2.文件编辑进阶 --vim 3. 命令的别名 4. 查看文件内容和文件编辑(重定向)的案例 5. 重定向之追加 6. 查看目录和文件编辑的案例 7. 查看目录和文件编辑(覆盖)的案例 为了加深对linux命令的熟悉程度&#xff0c;这…...

magnet库Hello,world!

1.c文件 #include<iostream> #include"Control.hpp" class O1:public mag::Control{bool b; public:O1(){b1;}bool decide(){return b&&islifing();}void action(){std::cout<<"Hello,world!\n";b0;destroy();} }; int main(){O1 o1;…...

应急响应靶机-Linux(1)

挑战内容 账户密码&#xff1a;defend/defend Root/defend 黑客的IP地址遗留下的三个flag 1、按正常思路来走&#xff0c;先登录一手因已经给出root账户密码&#xff0c;先查看一手执行过的命令&#xff0c;发现一个flag值并且看到他往期编辑了一个文件&#xff0c;咱们顺便进去…...

k8s 部署spring项目+动态启动pod

在 Kubernetes 中部署 Spring Boot 项目并实现 动态管理 Pod&#xff08;自动扩缩容、滚动更新等&#xff09;&#xff0c;需要结合 Docker 镜像构建、Deployment 配置、Service 暴露和 HPA&#xff08;Horizontal Pod Autoscaler&#xff09; 等组件。以下是完整操作步骤&…...

【DINO】

detr 简化了检测流水线,消除了许多手工设置的组件 单阶段目标检测 需要前置的backbone抽取特征 faster_rcnn和yolo都是基于anchor,anchor当作候选框,NMS非极大值抑制 重叠的框只保存一个,效率低 所以detr来了,transformer,既有encoder又有decoder,套一个transforme…...

Nature重磅:后晶体管时代光子芯片革新AI计算!光子处理器运行《吃豆人》性能比肩电子,能效提升超500倍

随着人工智能&#xff08;AI&#xff09;模型规模以及应用范围的不断拓展&#xff0c;性能上限和能耗瓶颈正逐渐显现出来。大语言模型&#xff08;LLM&#xff09;、强化学习和卷积神经网络等 AI 模型的复杂性不断增长&#xff0c;正在将传统电子计算推向极限&#xff0c;能源需…...

Excel表格文件分组归并——通过sql

将 Excel 表转换为 SQL 数据库并直接执行 SQL 查询以获得所需的输出。以下是使用 SQL 实现此目的的步骤&#xff1a; 第 1 步&#xff1a;将 Excel 数据导入 MySQL 假设您设置了 MySQL 数据库&#xff0c;则需要先将 Excel 数据导入到表中。您可以使用语句或工具&#xff08;…...

2.微服务拆分流程

文章目录 交易服务1.1.创建项目1.2.引入依赖1.3.创建交易服务启动类1.4.创建并编写配置文件1.5.代码连接池4.2.1.引入依赖4.2.2.开启连接池抽取Feign客户端 1.6.抽取ItemClient接口1.7.抽取CartClient接口改造OrderServiceImpl扫描包 1.8.数据库1.9.配置启动项1.10.测试 以拆分…...

vue入门:计算属性computer监听器watch

文章目录 计算属性computer定义计算属性在模板中使用计算属性计算属性的使用场景 监听器watch基本语法深度监听立即执行监听数组异步操作数据校验副作用处理清理监听器 watch 与 computed 的区别 计算属性computer 在 Vue 中&#xff0c;计算属性&#xff08;computed&#xf…...

Jenkins 发送钉钉消息

这里不介绍 Jenkins 的安装&#xff0c;可以网上找到很多安装教程&#xff0c;重点介绍如何集成钉钉消息。 需要提前准备钉钉机器人的 webhook 地址。&#xff08;网上找下&#xff0c;很多教程&#xff09; 下面开始配置钉钉机器人&#xff0c;登录 Jenkins&#xff0c;下载 …...

numpy练习

生成一个2行3列随机整数二维数组a使用Numpy方法对&#xff08;1&#xff09;中数组a进行整体求积使用Numpy方法对&#xff08;1&#xff09;中数组a进行求每列最大值索引定义一个NumPy一维数组 b&#xff0c;元素为 1 到 10 的整数获取&#xff08;4&#xff09;数组b中最后五个…...

Ethers.js 开发入门:核心功能、最佳实践与避坑指南

引言 Ethers.js 是当前 Web3 开发领域增长最快、备受开发者青睐的以太坊 JavaScript 库之一。在本篇文章中&#xff0c;我们将介绍 Ethers.js 的核心功能和用法&#xff0c;包括如何连接区块链节点、与钱包交互、读取智能合约数据、发送交易等。同时&#xff0c;我们还将分享使…...

SQL查询语句的​​书写顺序​​

一、标准SQL书写顺序&#xff08;逻辑顺序&#xff09; 书写顺序是开发者编写SQL时遵循的语法规则&#xff0c;逻辑上更贴近“声明式”需求描述。以下是​​从前往后​​的书写顺序&#xff1a; SELECT[DISTINCT] 列名或表达式 FROM表名或子查询 [JOIN ... ON ...] WHERE行级…...

探索加密期权波动率交易的系统化实践——动态对冲工具使用

Trading Volatility – What Are My Options? 在本文中&#xff0c;我们将介绍一些如何交易资产波动性&#xff08;而非资产价格&#xff09;的示例。为了帮助理解&#xff0c;我们将使用 Deribit 上提供的几种不同产品&#xff0c;包括但不限于期权。我们将尽可能消除对标的价…...

文件操作和 IO - 3

目录 文件内容的读写 —— 数据流 InputStream 概述 方法&#xff1a; 说明&#xff1a; FileInputStream 概述 read 方法&#xff1a; OutputStream 概述 方法 说明 FileOutputStream 概述 write 方法&#xff1a; Reader 字符流 Writer 字符流 总结&#xff1a…...

Kubernetes中的Label和Selector核心作用与应用场景

一. Label 和 Selector 的核心概念 Label 和 Selector 是 Kubernetes 中实现灵活资源管理的基石&#xff0c;贯穿部署、服务发现、监控等核心场景。通过合理设计标签&#xff0c;用户可以高效实现自动化运维与精准资源控制。 Label&#xff08;标签&#xff09;&#xff1a; K…...

L1-6 大勾股定理

题目 大勾股定理是勾股定理的推广&#xff1a;对任何正整数 n 存在 2n1 个连续正整数&#xff0c;满足前 n1 个数的平方和等于后 n 个数的平方和。例如对于 n1 有 3^2 4^2 5^2 &#xff1b;n2 有 10^2 11^2 12^2 13^2 14^2 等。给定 n&#xff0c;本题就请你找出对应的解。 输…...

esp32-idf Linux 环境安装教程

一、提前说明 1. 系统环境 Ubuntu22.04 2. 适配芯片 ESP32S3 3. idf版本 v5.4.1(截止2025年4月13日为最新版本) 二、安装步骤 1. 安装前置依赖 sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev l…...

关于使用 nuitka进行构建python应用的一些配置,以及github action自动构建;

1. 通用配置 # 设置输出目录和文件名output_dir "dist"app_name "CursorAutoFree"# 基础命令行选项base_options ["--follow-imports", # 跟踪导入"--enable-plugintk-inter", # 启用 Tkinter 支持"--include-packagecusto…...

C++开山解惑

. Solution & Code 本题解仅适用于 C 选手。 这道题可谓是 C 中最基础的题目之一&#xff0c;先上两份代码&#xff1a; #include <cstdio> using namespace std;int main() {long long a, b;scanf("%lld%lld", &a, &b);printf("%lld"…...

Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(二)

Pytorch深度学习框架60天进阶学习计划 - 第41天&#xff1a;生成对抗网络进阶&#xff08;二&#xff09; 7. 实现条件WGAN-GP # 训练条件WGAN-GP def train_conditional_wgan_gp():# 用于记录损失d_losses []g_losses []# 用于记录生成样本的多样性&#xff08;通过类别分…...

路由策略/策略路由之route-policy

思科名称&#xff1a;route-map、match、set Route-policy 是一个非常重要的基础性策略工具。你可以把它想象成一个拥有多个节点&#xff08;node&#xff09;的列表&#xff08;这些 node 按编号大小进行排序&#xff09;。在每个节点中&#xff0c;可以定义条件语句及执行语…...

《嵌入式系统原理》一些题目

1 &#xff0e;ARM 的存储格式&#xff1f;默认的存储模式是&#xff1f; 大端格式和小端格式&#xff0c;默认为小端模式 2 &#xff0e;当前程序状态寄存器&#xff1f;&#xff08;英文简写、条件码标志位及控制位的含义&#xff09; CPSR&#xff0c;N,Z,C,V(P26) 3 &a…...

卡洛诗已悄然改写高性价比西餐的竞争规则

在餐饮行业竞争日益激烈的今天&#xff0c;消费者对“高性价比”的定义已从单纯的低价转向品质、体验与情感价值的综合考量。萨莉亚原团队成员出来升级孵化的新概念中式西餐卡洛诗以“访九州异馔&#xff0c;再造东方味”为核心理念&#xff0c;通过本土化创新、严控文化及场景…...

独立开发者之网站的robots.txt文件如何生成和添加

robots.txt是一个存放在网站根目录下的文本文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以抓取&#xff0c;哪些页面不可以抓取。下面我将详细介绍如何生成和添加robots.txt文件。 什么是robots.txt文件&#xff1f; robots.txt是遵循"机器人排除协议"(Robots…...

02核心-EffectSpec,EffectContext

1.FGameplayEffectSpec 效果Spec 创建&#xff1a;MakeOutGoingSpec>EffectSpecHandle≈EffectSpec. 创建总结&#xff1a;EffectLevelEffectContext>EffectSpec(Handle) 数据&#xff1a;EffectSpec存有效果的等级&#xff0c;上下文&#xff0c;类。 还有很多其他东…...

驱动开发硬核特训 · Day 10(下篇):设备模型实战篇 —— Platform 驱动机制 ≈ 运行时适配器

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 总线驱动模型实战全解析 敬请关注&#xff0c;记得标为原始粉丝。 &#x1f527; &#x1f4cd; 一、目标与回顾 在上篇《理论篇》中&#xff0c;我们从软件工程角度&#xff0c;解释…...

集合框架二三事

一.集合框架 Java集合框架&#xff08;Java Collections Framework&#xff09;是Java标准库中用于存储和处理对象集合的一组接口和实现类。它提供了一套统一的API&#xff0c;使得开发者能够高效地管理和操作数据集合。以下是关于Java集合框架的详细介绍&#xff0c;包括其核…...

前端jest(vitest)单元测试快速手上

前言 vitest和jest除了配置上不同&#xff0c;其他的基本差不多&#xff0c;这里以jest为例进行说明 安装依赖 npm install -D jest编写测试 例如&#xff0c;我们将编写一个简单的测试来验证将两个数字相加的函数的输出。 sum.js export function sum(a, b) {return a b…...

优化方法介绍(二)

优化方法介绍(二) 本博客是一个系列博客,主要是介绍各种优化方法,使用 matlab 实现,包括方法介绍,公式推导和优化过程可视化 1 BFGS 方法介绍 BFGS 的其实就是一种改良后的牛顿法,因为计算二阶导数 Hessian 矩阵所需的计算资源是比较大的,复杂度为 O ( 2 ⋅ n 2 ) …...

Sklearn入门之datasets的基本用法

、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具&#xff0c;用于数据挖掘和数据分析&#xff0c;包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn下的datasets在机器学习中的基本用法。 获取方式 pi…...

UDS协议 - 应用层服务测试用例概览

目录 前言一、10服务物理寻址测试功能寻址测试二、11服务物理寻址测试功能寻址测试三、14服务物理寻址测试功能寻址测试四、19服务物理寻址测试功能寻址测试五、22服务物理寻址测试功能寻址测试六、27服务物理寻址测试七、28服务物理寻址测试功能寻址测试八、2E服务物理寻址测试…...

记录一个虚拟机分配资源的问题

Virtualize Intel VT - x/EPT or AMD - V/RVI&#xff1a;若物理机的 CPU 支持对应的硬件虚拟化技术&#xff08;Intel VT - x 或 AMD - V&#xff09;&#xff0c;强烈建议开启。该功能可显著提升虚拟机的性能&#xff0c;让虚拟机更高效地利用物理 CPU 资源&#xff0c;改善卡…...

(即插即用模块-特征处理部分) 三十一、(2024) CDFA 对比度驱动的特征聚合模块

文章目录 1、Contrast-Driven Feature Aggregation module2、代码实现 paper&#xff1a;ConDSeg: A General Medical Image Segmentation Framework via Contrast-Driven Feature Enhancement Code&#xff1a;https://github.com/Mengqi-Lei/ConDSeg 1、Contrast-Driven Feat…...

机械革命 无界15X 自带的 有线网卡 YT6801 debian12下 的驱动方法

这网卡是国货啊。。。 而且人家发了驱动程序 Motorcomm Microelectronics. YT6801 Gigabit Ethernet Controller [1f0a:6801] 网卡YT6801在Linux环境中的安装方法 下载网址 yt6801-linux-driver-1.0.29.zip 我不知道别的系统是否按照说明安装就行了 但是debian12不行&…...

TypeScript 的 interface 接口

TypeScript 的 interface 接口 简介 interface 是对象的模板&#xff0c;可以看作是一种类型约定&#xff0c;中文译为“接口”。使用了某个模板的对象&#xff0c;就拥有了指定的类型结构。 interface Person {firstName: string;lastName: string;age: number;} 上面示例中…...

SpringBoot3-web开发笔记(下)

内容协商 实现&#xff1a;一套系统适配多端数据返回 多端内容适配&#xff1a; 1. 默认规则 SpringBoot 多端内容适配。 基于请求头内容协商&#xff1a;&#xff08;默认开启&#xff09; 客户端向服务端发送请求&#xff0c;携带HTTP标准的Accept请求头。 Accept: applica…...

关于无线网络安全的基础知识,涵盖常见威胁、防护措施和实用建议

无线网络(WiFi)的普及极大地方便了我们的生活,但其开放性也带来了诸多安全隐患。以下是关于无线网络安全的基础知识,涵盖常见威胁、防护措施和实用建议: 一、无线网络常见安全威胁 窃听(Eavesdropping) 攻击者通过监听无线信号,截获未加密的数据(如登录密码、聊天记录…...

《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》

在深度学习领域&#xff0c;使用循环神经网络&#xff08;RNN&#xff09;进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开&#xff0c;深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…...

【leetcode刷题日记】lc.347-前 K 个高频元素

目录 1.题目 2.代码 1.题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1] 提示&#xff1a; 1 <…...

进程I·介绍、查看、创建与状态

目录 介绍 PCB&#xff08;进程控制块&#xff09; task_struct 查看、创建进程 进程状态 小知识 介绍 进程&#xff1a;PCB&#xff08;process control block&#xff09;&#xff08;内核数据结构&#xff09; 代码和数据 进程创建&#xff1a;操作系统将其相关属性信…...