go-zero(十二)消息队列
go zero 消息队列
在微服务架构中,消息队列主要通过异步通信实现服务间的解耦,使得各个服务可以独立发展和扩展。
go-zero中使用的队列组件go-queue
,是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。
一、kafka简单介绍
Kafka 是一个开源的分布式流处理平台,主要用于构建实时数据管道和流应用。
1.Kafka 的架构
Kafka 的架构通常由以下几个部分构成:
- Broker(节点):Kafka 集群由多个 broker 实例组成,负责管理消息的存储和处理。
- Topic(主题):消息以主题的形式组织,每个主题可以有多个分区(partition),以支持高并发和扩展性。
- Produce(生产者):消息生产者将数据发送到特定的topic中。
- Consumer(消费者):消费者从topic中读取数据,可以将多个消费者分组以进行负载均衡。
2.Kafka 的关键特性
-
高吞吐量:
Kafka 设计上能够处理大量的实时数据流,具备非常高的吞吐量。这使得它能够轻松应对大规模数据流量,适合做日志聚合、监控数据处理等。 -
持久性:
Kafka 将消息持久化到磁盘,并提供复制功能,以确保数据的安全性和可靠性。即使在节点出现故障的情况下,也能保证数据不会丢失。 -
可扩展性:
Kafka 能够水平扩展,通过增加更多的节点来处理更多的消费者和生产者,这使得它能够应对越来越多的业务需求。 -
实时处理:
Kafka 提供低延迟的数据传输,这使得实时处理和分析成为可能。您可以瞬时处理到来的数据流。 -
支持多种消息传递模式:
Kafka 支持发布-订阅和点对点的消息传递模式,能够灵活适应不同场景下的需求。 -
强大的生态系统:
Kafka 拥有丰富的生态系统,包括 Kafka Streams 和 Kafka Connect,这些工具可以帮助开发者更方便地进行流处理和数据集成。
3.常见应用场景
-
日志聚合:
Kafka 可以作为一个集中式的日志聚合器,将分布在不同服务的日志集中到一个地方,方便后续分析和监控。 -
实时数据流处理:
使用 Kafka,用户可以实时处理和分析流数据,例如检测异常、生成实时报告等。 -
系统监控和事件追踪:
Kafka 经常用于收集和跟踪系统事件(如用户行为、系统状态等),并通过流式处理进行实时监控。 -
数据集成:
Kafka 可以作为数据的桥梁,连接不同的数据源和目标系统,方便实现数据的流转和转换。 -
消息队列:
Kafka 可用作高效的消息队列,实现服务间的异步通信。例如,在微服务架构中,服务 A 可以将消息发送到 Kafka,而服务 B 可以异步地从 Kafka 中读取处理这些消息。
二、环境部署
1.Docker安装Kafka
配置文件:
version: '3'######## 项目依赖的环境,启动项目之前要先启动此环境 #######services:#zookeeper是kafka的依赖 - Zookeeper is the dependencies of Kafkazookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperenvironment:# 时区上海 - Time zone Shanghai (Change if needed)TZ: Asia/Shanghairestart: alwaysports:- 2181:2181networks:- gozero_net#消息队列 - Message queuekafka:image: 'bitnami/kafka:3.6.2'container_name: kafkarestart: alwaysulimits:nofile:soft: 65536hard: 65536environment:- TZ=Asia/Shanghai- KAFKA_CFG_NODE_ID=0- KAFKA_CFG_PROCESS_ROLES=controller,broker- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLERports:- '9092:9092'- '9094:9094'volumes:- ./volumes/kafka:/bitnami/kafkanetworks:gozero_net:driver: bridgeipam:config:- subnet: 172.16.0.0/16
这里的kafka 对外暴露的端口为9094
使用命令执行文件
docker compose up
2.创建topic
进入kafka容器
docker exec -it {{容器ID}} /bin/bash
#或者直接使用容器名
docker exec -it kafka /bin/bash
进入kafka执行命令目录
进入kafka执行命令目录
cd /opt/bitnami/kafka/bin
创建topic
创建名为topic-test
的topic
./kafka-topics.sh --create --topic topic-test --bootstrap-server localhost:9092
查看topic信息
./kafka-topics.sh --describe --topic topic-test --bootstrap-server localhost:9092
3.测试topic
使用两个终端,进入kafka执行命令目录,执行下面两个命令:
生产消息
./kafka-console-producer.sh --topic topic-test --bootstrap-server localhost:9092
消费消息
./kafka-console-consumer.sh --topic topic-test --bootstrap-server localhost:9092
测试
在生产者输入消息,会自动同步到消费者
4. 拉取依赖
项目中首先要拉取 go-queue 的依赖
go get github.com/zeromicro/go-queue@latest
三、项目演示
1.配置说明
type KqConf struct {service.ServiceConf// Brokers: Kafka 的多个 Broker 节点Brokers []string// Group: 消费者组Group string// Topic: 订阅的 Topic 主题Topic string// Offset: 如果新的 topic Kafka 没有对应的 offset 信息,或者当前的 offset 无效(历史数据被删除),// 需要指定从头(first)消费还是从尾(last)消费Offset string `json:",options=first|last,default=last"`// Conns: 一个 Kafka queue 对应可对应多个 consumer,Conns 对应 Kafka queue 数量,// 可以同时初始化多个 Kafka queue,默认只启动一个Conns int `json:",default=1"`// Consumers: go-queue 内部起多个 goroutine 从 Kafka 中获取信息写入进程内的 channel,// 此参数控制 goroutine 数量(⚠️ 并不是真正消费时的并发 goroutine 数量)Consumers int `json:",default=8"`// Processors: 当 Consumers 中的多个 goroutine 拉取到 Kafka 消息后,// 通过此参数控制当前消费逻辑的并发 goroutine 数量Processors int `json:",default=8"`// MinBytes: fetch 一次返回的最小字节数,若不够该字节数则会等待MinBytes int `json:",default=10240"` // 10K// MaxBytes: fetch 一次返回的最大字节数,若第一条消息大小超过该限制仍会继续拉取,// 以确保 consumer 的正常运行。并非绝对配置,消息大小也受 broker 的 message.max.bytes 限制,// 以及 topic 的 max.message.bytes 限制MaxBytes int `json:",default=10485760"` // 10M// Username: Kafka 的账号(可选)Username string `json:",optional"`// Password: Kafka 的密码(可选)Password string `json:",optional"`
}
2.配置
配置文件
在yaml 配置文件中添加当前的 kafka 配置信息,我这里为了省事就都放在一个配置文件下了:
#....#生产者
KqPusherConf:Name: log-producerBrokers:- 127.0.0.1:9094Group: logs-groupTopic: topic-test
#消费者
KqConsumerConf:Name: log-consumerBrokers:- 127.0.0.1:9094Group: logs-groupTopic: topic-testOffset: lastConsumers: 8Processors: 8
config.go
在 internal/config 下的 config.go 中定义 go 映射的配置
type Config struct {/*.....*/KqPusherConf kq.KqConfKqConsumerConf kq.KqConf
}
svc注入
在 svc/serviceContext.go 中初始化 pusher 的 kq client
type ServiceContext struct {Config config.ConfigKqPusherClient *kq.Pusher}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,KqPusherClient: kq.NewPusher(c.KqPusherConf.Brokers, c.KqPusherConf.Topic),}
}
3. 生产者
在 logic 中写业务逻辑使用 go-queue 的 kq client 发送消息到 kafka,这里我们用登录作为演示,当登录成功后,发送用户信息:
func (l *LoginLogic) Login(req *types.LoginRequest) (resp *types.LoginResponse, err error) {// todo: add your logic here and delete this line/*....省略其他代码*///生产者需要异步执行,threading.GoSafe() 是go zero官方对 go func() 的安全封装threading.GoSafe(func() {logData := map[string]any{"user": user.Username,"mobile": user.Mobile,}logs, _ := json.Marshal(logData)// 使用Push推送消息,消息为jsonerr := l.svcCtx.KqPusherClient.Push(l.ctx, string(logs))if err != nil {logx.Errorf("KqPusherClient Push Error , err :%v", err)}})// 如果既没有验证码也没有密码return nil, errors.New(10010, "未提供有效的登录凭证")
}
生产者需要异步执行,threading.GoSafe()
是go zero官方对 go func()
的安全封装,如果出现panics
会自动恢复。
4. 消费者
在 internal
下新建一个 mq
文件夹,在 mq
文件夹下新建一个消费者 consumer.go
:
package mqsimport ("beyond/user/api/internal/svc""context""fmt""github.com/zeromicro/go-zero/core/logc""github.com/zeromicro/go-zero/core/logx"
)//定义日志消费者
type LogsConsumer struct {ctx context.ContextsvcCtx *svc.ServiceContext
}// 定义构造方法
func NewLogsConsumer(ctx context.Context, svcCtx *svc.ServiceContext) *LogsConsumer {return &LogsConsumer{ctx: ctx,svcCtx: svcCtx,}
}// Consume为go zero内置接口, 实现Consume接口方法
func (l *LogsConsumer) Consume(ctx context.Context, key, val string) error {//logx.Infof("Consumer key :%s , val :%s", key, val)logc.Infof(ctx, "Consumer key :%s, val :%s", key, val)return nil
}
Consume
为go queue内置接口
因为消费者可能有多个,在 mq
文件夹下新建一个文件mqs.go
用来监听多个消费者,mqs.go
代码如下:
package mqsimport ("beyond/user/api/internal/config""beyond/user/api/internal/svc""context""github.com/zeromicro/go-queue/kq""github.com/zeromicro/go-zero/core/service"
)func Consumers(c config.Config, ctx context.Context, svcCtx *svc.ServiceContext) []service.Service {// 监听消费者状态变化return []service.Service{//创建消息队列kq.MustNewQueue(c.KqConsumerConf, NewLogsConsumer(ctx, svcCtx)),}}
在 main.go 中启动 consumers 等待消费
func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)server := rest.MustNewServer(c.RestConf)defer server.Stop()svcCtx := svc.NewServiceContext(c)handler.RegisterHandlers(server, svcCtx)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)// 因为现在添加了mq,属于多服务状态,所以需要启动mq服务//server.Start() //创建新的服务组serviceGroup := service.NewServiceGroup()defer serviceGroup.Stop()// 从mq中获取消费者服务,并添加到服务组中for _, mq := range mqs.Consumers(c, context.Background(), svcCtx) {serviceGroup.Add(mq)}//添加原来的server服务serviceGroup.Add(server)// 启动服务组serviceGroup.Start()}
5.启动项目
我们这里就是简单的输出日志,你也可以拓展成发送邮件或者短信给用户,提示用户注册成功。
相关文章:
go-zero(十二)消息队列
go zero 消息队列 在微服务架构中,消息队列主要通过异步通信实现服务间的解耦,使得各个服务可以独立发展和扩展。 go-zero中使用的队列组件go-queue,是gozero官方实现的基于Kafka和Beanstalkd 的消息队列框架,我们使用kafka作为演示。 一、…...
CSS3 常用特性及应用全解析
CSS3 常用特性及应用全解析 在前端开发领域,CSS3 以其丰富多样的特性为网页增添了绚丽的视觉效果与流畅的交互体验。本文将详细介绍一些 CSS3 的常见知识及其使用方法,助力开发者打造更具吸引力的网页。 一、边框效果升级 (一ÿ…...
revit转gltf,revit转3dtiles,如何将Revit模型转为3DTiles格式并在Cesiumjs中高效可视化
Revit模型导出gltf、glb与3dtiles有多种方式,但一般的商业工具收费普遍较高:Cesiumlab导出3dTile格式数据,Cesiumlab暂时可试用3天,会员版收费每年800;BimAngleEngine导出3dTile格式数据BimAngleEngine暂时可试用30天&…...
Unity学习笔记(二)如何制作角色动画
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 创建一个角色 我们的目的是创建一个可移动、跳跃、冲刺等动作的角色 需要的组件:Rigidbody(用于创建物理规则)、Collider(用于检测碰撞&am…...
基于卷积神经网络的Caser算法
将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后,基于卷积序列嵌入的推荐(Caser)算法利用多个不同大小的卷积滤波器,来捕捉序列中物品间的点级(point-level)、联合的(union-…...
Java中服务器代理(Proxy)详解
Java中服务器代理(Proxy)详解 服务器代理(Proxy)在网络编程和分布式系统中是一个至关重要的概念,其功能远超一般的网络请求转发。在现代互联网架构中,代理不仅广泛应用于负载均衡、访问控制和安全防护&…...
css中相对定位的应用场景
元素位置微调 文本与图标组合微调:在网页设计中,经常会有文本和图标的组合,比如一个带有搜索图标的搜索框。可以使用相对定位来微调图标在搜索框内的位置。例如,有以下HTML结构: <input type"text" class…...
人工智能技术的深度解析与推广【人工智能的应用场景】
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
Quad Remesher使用教程
为什么要拓扑? 我们知道,模型在三维软件中的表现,是由一系列的面通过不同角度组合而成的。3D模型制作层面上的拓扑,按我的理解来说,就是一个模型的面的结构分布——布线。想表现和制作一个三维模型,有无限…...
【经验分享】容器云运维的知识点
最近忙于备考没关注,有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源,但我以交流、交换为主,笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟,为了避免更多人花没必要的钱,所以决定公…...
NDRCContextUnmarshall断点函数分析之I_RpcBindingCopy函数的作用
NDRCContextUnmarshall断点函数分析之I_RpcBindingCopy函数的作用 第一部分: void RPC_ENTRY NDRCContextUnmarshall ( // process returned context OUT NDR_CCONTEXT PAPI *phCContext,// stub context to update IN RPC_BINDING_HANDLE hRPC, …...
代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC746.使用最小花费爬楼梯
动态规划理论基础 解释:动态规划,英文:Dynamic Programming,简称DP;如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划五部曲: 1、确定dp数组(dp table)…...
[每周一更]-(第127期):Go新项目-Gin中使用超时中间件实战(11)
在项目不断迭代过程中,发现基础架构中,没有进行超时控制,有些接口由于网络延迟以及远程调用等情况存在请求时间过长的问题,消耗了资源,也降低了用户体验,这一讲我们聊下超时控制中间件,来完善我…...
【HAL库】STM32CubeMX开发----STM32F407----Time定时器中断实验
STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F407----目录 前言 本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。 实现定时器TIM3中断,每1s进一次中断。 定时器计算公式如下: arr 是自动装载值&#x…...
使用idea创建一个JAVA WEB项目
文章目录 1. javaweb项目简介2. 创建2.1 idea新建项目2.2 选择,命名2.3 打开2.4 选择tomcat运行2.5 结果 3. 总结 1. javaweb项目简介 JavaWeb项目是一种基于Java技术的Web应用程序,主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上&a…...
PDF 文件如何转为 CAD 图纸?PDF2CAD 使用教程
在工程设计和建筑行业中,PDF 文件常常被用来分享和存档图纸。然而,当需要对这些图纸进行编辑或进一步开发时,静态的 PDF 格式就显得力不从心了。这时候,将 PDF 文件转换为可编辑的 CAD(计算机辅助设计)格式…...
Spring Boot 集成 MyBatis 全面讲解
Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架,与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis,包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …...
SpringBoot | SpringBoot原理分析
SpringBoot原理分析(一).jpg SpringBoot原理分析(二).jpg 核心要点: 1、SpringBootApplication 2、SpringBootConfiguration 3、ComponentScan 4、EnableAutoConfiguration 5、AutoConfigurationPackages 6、import(Au…...
解决“VMware虚拟机报Intel VT-x”错误
今天,在windows系统上,打开VMware WorkStation v15软件里的虚拟机,弹出"Intel VT-x处于禁用状态"错误,如图(1)所示: 图(1) 虚拟机报"Intel VT-x"错误 问题原因:当前电脑的BIOS没有开启…...
LeetCode200.岛屿数量
题目 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设…...
python学opencv|读取图像(七)抓取像素数据顺利修改图像大小
【1】引言 前序我们已经学习图像的基本读取操作,文章链接为: python学opencv|读取图像-CSDN博客 也掌握了彩色图像的保存: python学opencv|读取图像(二)保存彩色图像_python opencv 读取图像转为彩色-CSDN博客 以…...
Qt Pro 常用配置
Part1: Summary Qt 开发中 Pro 文件的内容很多,需要不断的去学习和使用,现系统性的整理一下。以备录; 1.创建pro文件 1.1 步骤: Qt Creator--->New Project--->应用程序--->Qt Widgets Application--->名称为&…...
源码分析之Openlayers中默认Controls控件渲染原理
概述 Openlayers 中默认的三类控件是Zoom、Rotate和Attribution 源码分析 defaults方法 Openlayers 默认控件的集成封装在defaults方法中,该方法会返回一个Collection的实例,Collection是一个基于数组封装了一些方法,主要涉及到数组项的添…...
银河麒麟桌面操作系统添加WPS字体
【使用场景】 银河麒麟桌面操作系统支持添加WPS字体。在银河麒麟桌面操作系统中使用WPS软件编辑文档时存在需要添加WPS字体的情况,例如字体缺失或者需要特殊字体时,需要添加WPS字体。 【操作方法】 步骤一:在互联网上搜索并下载.ttf格式的字体文件。 步骤二:下载完成后,在…...
利用Python实现多元回归预测汽车价格
引言: AI技术的热门使得大家对机器学习有了更多的关注,作为与AI技术息息相关的一门课程,从头了解基础的机器学习算法就显得十分有必要,如:梯度下降,线性回归等。 正文: 本文将讲解线性回归中多元回回归的案例 机器学习大致可以分为监督学习,非监督学习、半监督学习还…...
16、PyTorch中进行卷积残差模块算子融合
文章目录 1. 1x1卷积核-> 3x3卷积核2. 输入x --> 3x3卷积核,无变化3. 代码 1. 1x1卷积核-> 3x3卷积核 假设我们有一个1x1的卷积核,需要通过填充变为一个3x3的卷积核,实现的是像素之间无关联 [ 4 ] → [ 0 0 0 0 4 0 0 0 0 ] \begin{equation}…...
CMake简单使用(二)
目录 五、scope 作用域5.1 作用域的类型5.1.1 全局作用域5.1.2 目录作用域5.1.3 函数作用域 六、宏6.1 基本语法6.2 演示代码 七、CMake构建项目7.1 全局变量7.2 写入源码路径7.3 调用子目录cmake脚本7.4 CMakeLists 嵌套(最常用) 八、CMake 与库8.1 CMake生成动静态库8.1.1 动…...
React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
React 在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件…...
MATLAB 识别色块和数量
文章目录 前言步骤 1: 读取图像步骤 2: 转换为 HSV 颜色空间步骤 3: 定义颜色范围步骤 4: 创建颜色掩码步骤 5: 应用形态学操作(可选)步骤 6: 标记和显示结果完整代码步骤七 返回色块坐标 总结 前言 提示:这里可以添加本文要记录的大概内容&…...
.NET 9 已发布,您可以这样升级或更新
.NET 9 已经发布,您可能正在考虑更新您的 ASP.NET Core 应用程序。 我们将介绍更新应用程序所需的内容。从更新 Visual Studio 和下载 .NET SDK 到找出可能破坏应用程序的任何重大更改。 下载 .NET 9 SDK 这些是下载 .NET 9 SDK 所需的步骤。 更新 Visual Studi…...
VMware ubuntu16.04怎么设置静态IP联网
1.将VMware桥接到当前电脑使用的网络上面; 2.点击网络符号,编辑连接; 3.双击有线连接1; 4.选择IPv4设置,将地址,子网掩码,网关,DNS服务器设置好,保存; 5.在终…...
#渗透测试#漏洞挖掘#红蓝攻防#js分析(上)
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
.NET 6.0 中接入 Log4net 和 NLog
一、接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文件内容为 <?xml version"1.0" encoding"utf-8"?> <log4net> <!-- Define some output appe…...
linux从frame buffer中将qt界面拷贝出来放到u盘的操作方法
使用的是gsnap工具,源码可以在百度上搜,以Imx6为例的使用方法 rootimx6qsabresd:~# rootimx6qsabresd:~# rootimx6qsabresd:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 289293 197510 76423 73% / devtmpfs …...
最新全开源IM即时通讯系统源码(PC+WEB+IOS+Android)部署指南
全开源IM(即时通讯)系统源码部署是一个复杂但系统的过程,涉及多个组件和步骤。以下是一个详细的部署指南,旨在帮助开发者或系统管理员成功部署一个全开源的IM系统,如OpenIM。 IM即时通讯系统源码准备工作 …...
使用Linux的logrotate工具切割日志:Tomcat、NGINX(journal文件清理)
文章目录 引言I Tomcat日志切割配置轮转参数验证码II NGINX访问文件的配置和切割access.log 访问日志的配置使用Linux的logrotate工具切割日志验证文件切割III /run/log/journaljournalctl文件清理引言 journal文件清理: 只保留过去两天,清理之前的文件 journalctl --vacuu…...
shell脚本1
运行脚本 1、先创建一个sh脚本文件,里面输入一个输出网站的命令,比如echo www.baidu.com vim 1.sh2、可以利用以下三种方式、这三种其实不管哪种脚本解释器最后调用的还是这个dash,下面是解释为什么调用都是dash,我们ls可以发现最后目录都是指向了dash…...
Qt-chart 画折线图(以时间为x轴)
上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…...
【kubernetes】kubectl get nodes报NotReady
目录 1. 说明2. 问题描述3. kube-flannel.yml 1. 说明 1.这里k8s的版本是v1.17.4。2.若kube-flannel.yml中的镜像拉取不下来,可以下载本文章的文件资源,手动docker load -i ***.tar的方式。3.v1.17.4的kube-flannel.yml参考下面代码。4.通过kubectl get…...
分布式开发学习
1、kratos的特点 gRPC:Kratos 默认支持 gRPC,提供高性能的远程调用能力,适用于微服务间通信。 HTTP :同时支持 HTTP/1.1 和 HTTP/2,方便微服务与外部系统交互。 Protocol Buffers: protoc 工具生…...
软件测试的几种方法详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、从是否关心内部结构来看 (1)白盒测试:又称为结构测试或逻辑驱动测试,是一种按照程序内部逻辑结构和编码结构,设计测试数据并…...
C语言---int r 与 int r=数的区别
int r 在这里面声明了一个变量r,创建了内存空间 int r 2 声明了一个整数类型的变量r,并给它赋值(初始值)为2,创建内存空间并赋值。...
matlab测试ADC动态性能的原理
目录 摘要: 简介: 动态规范和定义 动态规格: 双面到单边的功率谱转换 摘要: 模数转换器(adc)代表了接收器、测试设备和其他电子设备中的模拟世界和数字世界之间的联系。正如本文系列的第1部分中所概述…...
XDOJ 877 图的深度优先遍历
题目:图的深度优先遍历 问题描述 已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即…...
内网穿透讲解
什么是内网穿透 内网穿透是一种网络技术,它允许外网或者其他局域网的用户来访问这个局域网的服务器资源,让资源的利用率更高,更加灵活,但是也要确保网络安全。 工作原理 如果你在公司,但是你需要使用到你家里的那台电…...
怎么规划一个呼叫中心大模型呼入部门?设置哪些岗位?
怎么规划一个呼叫中心大模型呼入部门?设置哪些岗位? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 规划一个呼叫中心大模型呼入部门是一个复杂而细致的过程,涉及多个层面的…...
企业级Nginx Web服务优化实战(上)
一 ,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说 ,软件的漏洞都和版本有关 ,这个很像汽车的缺陷 ,同一批次的要有问题就 都有问题 ,别的批次可能就都是好的。 因此 ,我们应尽量隐藏或…...
Redisson常用方法
Redisson 参考: 原文链接 定义:Redisson 是一个用于与 Redis 进行交互的 Java 客户端库 优点:很多 1. 入门 1.1 安装 <!--redission--> <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifa…...
【树莓派4B】MindSpore lite 部署demo
一个demo,mindspore lite 部署在树莓派4B ubuntu22.04中,为后续操作开个门! 环境 开发环境:wsl-ubuntu22.04分发版部署环境:树莓派4B,操作系统为ubuntu22.04mindspore lite版本:mindspore-li…...
ESP32-S3模组上跑通ES8388(30)
接前一篇文章:ESP32-S3模组上跑通ES8388(29) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回终于解析完了es8388_init函数的所有代码。本回回到调用它的地方,继续往下讲解。 我们是从ESP32-S3模组上跑通ES8388(7)-CSDN博客开始进入es8388_init函数,展开对于它的解析的…...