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

qq音乐的网站建设信息/杭州免费网站制作

qq音乐的网站建设信息,杭州免费网站制作,天津制作网站公司,学校vi设计案例使用Python操作Kafka:KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…

使用Python操作Kafka:KafkaProducer、KafkaConsumer
Python kafka-python API的帮助文档

1 kafka tools连接

(1)/usr/local/kafka_2.13-3.4.0/config/server.properties
listeners = PLAINTEXT://myubuntu:9092
advertised.listeners=PLAINTEXT://192.168.1.8:29092(2)/etc/hosts
10.0.2.11 myubuntu其中192.168.1.8是宿主机外网地址
其中10.0.2.11是虚拟机内网地址
192.168.1.8:29092映射到了10.0.2.11:9092。

在这里插入图片描述

2 单线程生产者

说是单线程,其实并不是,你启动一个生产者其实是2个线程,后台有一个IO线程用于真正发送消息出去,前台有一个线程用于把消息发送到本地缓冲区。

KafkaProducer是发布消息到Kafka集群的客户端,它是线程安全的并且共享单一生产者实例。生产者包含一个带有缓冲区的池,用于保存还没有传送到Kafka集群的消息记录以及一个后台IO线程,该线程将这些留在缓冲区的消息记录发送到Kafka集群中。

2.1 KafkaProducer构造函数参数

(1)acks 
0表示发送不理睬发送是否成功;
1表示需要等待leader成功写入日志才返回;
all表示所有副本都写入日志才返回(2)buffer_memory 
默认33554432也就是32M,该参数用于设置producer用于缓存消息的缓冲区大小,
如果采用异步发送消息,那么生产者启动后会创建一个内存缓冲区用于存放待发送的消息,
然后由专属线程来把放在缓冲区的消息进行真正发送,
如果要给生产者要给很多分区发消息那么就需要考虑这个参数的大小防止过小降低吞吐量(3)compression_type 
是否启用压缩,默认是none,可选类型为gzip、lz4、snappy三种。
压缩会降低网络IO但是会增加生产者端的CPU消耗。
另外如果broker端的压缩设置和生产者不同那么也会给broker带来重新解压缩和重新压缩的CPU负担。(4)retries 
重试次数,当消息发送失败后会尝试几次重发。
默认为0,一般考虑到网络抖动或者分区的leader切换,
而不是服务端真的故障所以可以设置重试3次。(5)retry_backoff_ms 
每次重试间隔多少毫秒,默认100毫秒。(6)max_in_flight_requests_per_connection 
生产者会将多个发送请求缓存在内存中,默认是5个,
如果你开启了重试,也就是设置了retries参数,
那么将可能导致针对于同一分区的消息出现顺序错乱。
为了防止这种情况需要把该参数设置为1,来保障同分区的消息顺序。(7)batch_size 
对于调优生产者吞吐量和延迟性能指标有重要的作用。
buffer_memeory可以看做池子,而这个batch_size可以看做池子里装有消息的小盒子。
这个值默认16384也就是16K,其实不大。生产者会把发往同一个分区的消息放在一个batch中,
当batch满了就会发送里面的消息,但是也不一定非要等到满了才会发。这个数值大那么生产者吞吐量高但是性能低,
因为盒子太大占用内存发送的时候这个数据量也就大。如果你设置成1M,那么显然生产者的吞吐量要比16K高的多。(8)linger_ms 
上面说batch没有填满也可以发送,那显然有一个时间控制,就是这个参数,
默认是0毫秒,这个参数就是用于控制消息发送延迟多久的。
默认是立即发送,无需关系batch是否填满。
大多数场景我们希望立即发送,但是这也降低了吞吐量。(9)max_request_size 
最大请求大小,可以理解为一条消息记录的最大大小,默认是1048576字节,1M。(10)request_timeout_ms  
生产者发送消息后,broker需要在规定时间内将处理结果返回给生产者,
那个这个时间长度就是这个参数控制的,默认30000,也就是30秒。如果broker在30秒内没有给生产者响应,那么生产者就会认为请求超时,
并在回调函数中进行特殊处理,或者进行重试。

2.2 示例代码

# -*- coding: utf-8 -*-
import time
import random
import sysfrom kafka import KafkaProducer
from kafka.errors import KafkaError, KafkaTimeoutError
import jsonclass Producer(object):def __init__(self, KafkaServerList=['127.0.0.1:9092'], ClientId="Procucer01", Topic='Test'):self._kwargs = {"bootstrap_servers": KafkaServerList,"client_id": ClientId,"acks": 1,"buffer_memory": 33554432,'compression_type': None,"retries": 3,"batch_size": 1048576,"linger_ms": 100,"key_serializer": lambda m: json.dumps(m).encode('utf-8'),"value_serializer": lambda m: json.dumps(m).encode('utf-8'),}self._topic = Topictry:self._producer = KafkaProducer(**self._kwargs)except Exception as err:print(err)def _onSendSucess(self, record_metadata):"""异步发送成功回调函数,也就是真正发送到kafka集群且成功才会执行。发送到缓冲区不会执行回调方法。:param record_metadata::return:"""print("发送成功")print("被发往的主题:", record_metadata.topic)print("被发往的分区:", record_metadata.partition)print("队列位置:", record_metadata.offset)  # 这个偏移量是相对偏移量,也就是相对起止位置,也就是队列偏移量。def _onSendFailed(self):print("发送失败")def sendMessage(self, value=None, partition=None):if not value:return None# 发送的消息必须是序列化后的,或者是字节# value = json.dumps(value, encoding='utf-8', ensure_ascii=False)# value 必须为字节或者被序列化为字节,# 由于之前我们初始化时已经通过value_serializer来做了,所以我上面的语句就注释了# key 与value对应的键,可选,也就是把一个键关联到这个消息上,# KEY相同就会把消息发送到同一分区上,所以如果有这个要求就可以设置KEY,也需要序列化# partition 发送到哪个分区,整型。如果不指定将会自动分配。kwargs = {"value": value,"key": None,"partition": partition}try:# 异步发送,发送到缓冲区,同时注册两个回调函数,一个是发送成功的回调,一个是发送失败的回调。# send函数是有返回值的是RecordMetadata,也就是记录的元数据,包括主题、分区、偏移量future = self._producer.send(self._topic, **kwargs)future.add_callback(self._onSendSucess)future.add_errback(self._onSendFailed)print("发送消息:", value)except KafkaTimeoutError as err:print(err)except Exception as err:print(err)def closeConnection(self, timeout=None):# 关闭生产者,可以指定超时时间,也就是等待关闭成功最多等待多久。self._producer.close(timeout=timeout)def sendNow(self, timeout=None):# 调用flush()函数可以将所有在缓冲区的消息记录立即发送,即使ligner_ms值大于0.# 这时候后台发送消息线程就会开始立即发送消息并且阻塞在这里,等待消息发送成功,当然是否阻塞取决于acks的值。# 如果不调用flush函数,那么什么时候发送消息取决于ligner_ms或者batch任意一个条件满足就会发送。try:self._producer.flush(timeout=timeout)except KafkaTimeoutError as err:print(err)except Exception as err:print(err)def main():p = Producer(KafkaServerList=["127.0.0.1:29092"], ClientId="Procucer01", Topic="test")for i in range(10):time.sleep(1)closePrice = random.randint(1, 500)msg = {"Publisher": "Procucer01","股票代码": 60000 + i,"昨日收盘价": closePrice,"今日开盘价": 0,}p.sendMessage(value=msg)p.closeConnection()if __name__ == "__main__":try:main()finally:sys.exit()

3 单线程消费者

初始化一个消费者实例,消费者不是线程安全的,所以建议一个线程实现一个消费者,而不是一个消费者让多个线程共享

下面这些是可选参数,可以在初始化KafkaConsumer实例的时候传递进去:

enable_auto_commit 是否自动提交,默认是trueauto_commit_interval_ms 自动提交间隔毫秒数auto_offset_reset="earliest"  
重置偏移量,earliest移到最早的可用消息,latest最新的消息,默认为latest

3.1 手动拉取消息

# -*- coding: utf-8 -*-
import sys
from kafka import KafkaConsumer
import jsonclass Consumer(object):def __init__(self, KafkaServerList=['127.0.0.1:9092'], GroupID='TestGroup11', ClientId="Test", Topics=['Test', ]):"""用于设置消费者配置信息,这些配置项可以从源码中找到,下面为必要参数。:param KafkaServerList: kafka服务器IP:PORT 列表:param GroupID: 消费者组ID:param ClientId: 消费者名称:param Topic: 主题 列表"""self._kwargs = {"bootstrap_servers": KafkaServerList,"client_id": ClientId,"group_id": GroupID,"enable_auto_commit": False,"auto_offset_reset": "earliest","key_deserializer": lambda m: json.loads(m.decode('utf-8')),"value_deserializer": lambda m: json.loads(m.decode('utf-8')),}try:self._consumer = KafkaConsumer(**self._kwargs)self._consumer.subscribe(topics=(Topics))except Exception as err:print("Consumer init failed, %s" % err)def consumeMsg(self):try:while True:data = self._consumer.poll(timeout_ms=1000, max_records=100)  # 拉取消息,字典类型print(data)if data:for key in data:for consumerrecord in data.get(key):# 返回的是ConsumerRecord对象,可以通过字典的形式获取内容。if consumerrecord != None:# 消息消费逻辑message = {"Topic": consumerrecord.topic,"Partition": consumerrecord.partition,"Offset": consumerrecord.offset,"Key": consumerrecord.key,"Value": consumerrecord.value}print(message)# 消费逻辑执行完毕后在提交偏移量self._consumer.commit()else:print("%s consumerrecord is None." % key)except Exception as err:print(err)def main():try:c = Consumer(KafkaServerList=['127.0.0.1:29092'], Topics=['test'])c.consumeMsg()except Exception as err:print(err)if __name__ == "__main__":try:main()finally:sys.exit()

3.2 非手动拉取消息

# -*- coding: utf-8 -*-import sys
from kafka import KafkaConsumer
import jsonclass Consumer(object):def __init__(self, KafkaServerList=['172.16.48.171:9092'], GroupID='TestGroup111', ClientId="Test", Topics=['Test', ]):"""用于设置消费者配置信息,这些配置项可以从源码中找到,下面为必要参数。:param KafkaServerList: kafka服务器IP:PORT 列表:param GroupID: 消费者组ID:param ClientId: 消费者名称:param Topic: 主题"""self._kwargs = {"bootstrap_servers": KafkaServerList,"client_id": ClientId,"group_id": GroupID,"enable_auto_commit": False,"auto_offset_reset": "earliest","key_deserializer": lambda m: json.loads(m.decode('utf-8')),"value_deserializer": lambda m: json.loads(m.decode('utf-8')),}try:self._consumer = KafkaConsumer(**self._kwargs)self._consumer.subscribe(topics=(Topics))except Exception as err:print("Consumer init failed, %s" % err)def consumeMsg(self):try:while True:for consumerrecord in self._consumer:if consumerrecord:message = {"Topic": consumerrecord.topic,"Partition": consumerrecord.partition,"Offset": consumerrecord.offset,"Key": consumerrecord.key,"Value": consumerrecord.value}print(message)# 消费逻辑执行完毕后在提交偏移量self._consumer.commit()except Exception as err:print(err)def main():try:c = Consumer(KafkaServerList=['127.0.0.1:29092'], Topics=['test'])c.consumeMsg()except Exception as err:print(err)if __name__ == "__main__":try:main()finally:sys.exit()

4 消费者

4.1 简单demo

启动后消费者可以从kafka服务器获取数据.

from kafka import KafkaConsumer# 参数为接收主题和kafka服务器地址
consumer = KafkaConsumer('test',bootstrap_servers=['127.0.0.1:29092'])# 这是一个永久堵塞的过程,生产者消息会缓存在消息队列中,并且不删除,
# 所以每个消息在消息队列中都有偏移
# consumer是一个消息队列,当后台有消息时,这个消息队列就会自动增加.
# 所以遍历也总是会有数据,当消息队列中没有数据时,就会堵塞等待消息带来
for msg in consumer:print("{}:{}:{}: key={} value={}".format(msg.topic, msg.partition,msg.offset, msg.key,msg.value))

4.2 消费者组

启动多个消费者,只有其中某一个成员可以消费到,满足要求,消费组可以横向扩展提高处理能力。

from kafka import KafkaConsumer
# 使用group,对于同一个group的成员只有一个消费者实例可以读取数据
consumer = KafkaConsumer('test',group_id='my-group',bootstrap_servers=['127.0.0.1:29092'])
for msg in consumer:print("{}:{}:{}: key={} value={}".format(msg.topic,msg.partition,msg.offset,msg.key,msg.value))

4.3 读取目前最早可读的消息

auto_offset_reset:重置偏移量,earliest移到最早的可用消息,latest最新的消息,默认为latest。源码定义:{‘smallest’: ‘earliest’, ‘largest’: ‘latest’}

from kafka import KafkaConsumer
# 使用group,对于同一个group的成员只有一个消费者实例可以读取数据
consumer = KafkaConsumer('test',auto_offset_reset='earliest',bootstrap_servers=['127.0.0.1:29092'])
for msg in consumer:print("{}:{}:{}: key={} value={}".format(msg.topic,msg.partition,msg.offset,msg.key,msg.value))

4.4 手动设置偏移量

from kafka import KafkaConsumer
from kafka.structs import TopicPartition
# ==========读取指定位置消息===============
consumer = KafkaConsumer('test',bootstrap_servers=['127.0.0.1:29092'])print(consumer.partitions_for_topic("test"))  # 获取test主题的分区信息
print(consumer.topics())  # 获取主题列表
print(consumer.subscription())  # 获取当前消费者订阅的主题
print(consumer.assignment())  # 获取当前消费者topic、分区信息
print(consumer.beginning_offsets(consumer.assignment()))  # 获取当前消费者可消费的偏移量
consumer.seek(TopicPartition(topic='test', partition=0), 5)  # 重置偏移量,从第5个偏移量消费for msg in consumer:print("{}:{}:{}: key={} value={}".format(msg.topic,msg.partition,msg.offset,msg.key,msg.value))

4.5 订阅多个主题

from kafka import KafkaConsumer
from kafka.structs import TopicPartitionconsumer = KafkaConsumer('test',bootstrap_servers=['127.0.0.1:29092'])# 订阅要消费的主题
consumer.subscribe(topics=('test','test0'))  
print(consumer.topics())#获取当前主题的最新偏移量
print(consumer.position(TopicPartition(topic='test', partition=0))) for msg in consumer:print("{}:{}:{}: key={} value={}".format(msg.topic,msg.partition,msg.offset,msg.key,msg.value))

4.6 手动拉取消息

from kafka import KafkaConsumer
import timeconsumer = KafkaConsumer('test',bootstrap_servers=['127.0.0.1:29092'])# 订阅要消费的主题
consumer.subscribe(topics=('test','test0'))
while True:msg = consumer.poll(timeout_ms=5)   # 从kafka获取消息print(msg)time.sleep(2)

4.7 消息挂起与恢复

# ==============消息恢复和挂起===========from kafka import KafkaConsumer
from kafka.structs import TopicPartition
import timeconsumer = KafkaConsumer(bootstrap_servers=['127.0.0.1:29092'])consumer.subscribe(topics=('test'))
consumer.topics()# pause执行后,consumer不能读取,直到调用resume后恢复
consumer.pause(TopicPartition(topic=u'test', partition=0)) 
num = 0
while True:print(num)print(consumer.paused())   # 获取当前挂起的消费者msg = consumer.poll(timeout_ms=5)print(msg)time.sleep(2)num = num + 1if num == 10:print("resume...")consumer.resume(TopicPartition(topic='test', partition=0))print("resume......")

相关文章:

kafka-6-python单线程操作kafka

使用Python操作Kafka:KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…...

【Spring教程】1.Spring概述

1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...

设计模式-代理模式

控制和管理访问 玩过扮白脸,扮黑脸的游戏吗?你是一个白脸,提供很好且很友善的服务,但是你不希望每个人都叫你做事,所以找了黑脸控制对你的访问。这就是代理要做的:控制和管理对象。 监视器编码 需求&…...

DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)

目录 文章目录 目录MALLOC(librte_malloc,Memory Manager,内存管理组件)rte_malloc() 接口malloc_heap 结构体malloc_elem 结构体内存初始化流程内存申请流程内存释放流程MALLOC(librte_malloc,Memory Manager,内存管理组件) MALLOC 库基于 hugetlbfs 内核文件系统来实…...

【Java开发】Spring 12 :Spring IOC控制反转和依赖注入(解决单接口多实现类调用)

IOC 是 Inversion of Control 的简写,译为“控制反转”,Spring 通过 IOC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IOC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建…...

【C++学习】基础语法(三)

众所周知C语言是面向过程的编程语言,关注的是过程;解决问题前,需要分析求解的步骤,然后编辑函数逐步解决问题。C是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,不同对象间交互解决问…...

k8s自动化安装脚本(kubeadm-1.23.7)

文章目录介绍软件架构版本介绍更新内容2023-02-192023-02-152023-02-142023-02-102022-10-202022-08-06准备部署包操作步骤环境准备结构备注解压部署包修改host文件脚本使用方式初始化环境验证ansible配置安装k8s集群登录master的节点添加node节点master节点状态检查组件安装安…...

面试题记录

Set与Map的区别 map是键值对,set是值的集合。键,值可以是任何类型map可以通过get获取,map不能。都能通过迭代器进行for…of遍历set的值是唯一的,可以做数组去重,map,没有格式限制,可以存储数据…...

链式前向星介绍以及原理

1 链式前向星 1.1 简介 链式前向星可用于存储图,本质上是一个静态链表。 一般来说,存储图常见的两种方式为: 邻接矩阵邻接表 邻接表的实现一般使用数组实现,而链式前向星就是使用链表实现的邻接表。 1.2 出处 出处可参考此…...

jenkins 安装 -适用于在线安装 后续写个离线安装的

jenkins安装1.下载jenkins2.安装启动3.附件卸载jdk的命令4.配置jenkins一、在jenkins配置文件中配置jdk环境变量二、修改jenkins默认的操作用户1.下载jenkins jenkins官网下载 https://www.jenkins.io/ 点击下载 我是centos系统所以选择centos,点击后按着官方提供…...

【C++】再谈vscode界面调试C++程序(linux) - 知识点目录

再谈vscode界面调试C程序(linux) 配套文档:vscode界面调试C程序(linux) 命令解释 g -g ../main.cpp 编译main.cpp文件; -g:生成调试信息。编译器会在可执行文件中嵌入符号表和源代码文件名&…...

蚂蚁感冒---第五届蓝桥杯真题

目录 题目链接 题目描述 分析: 代码: y总综合​ 666 题目链接 1211. 蚂蚁感冒 - AcWing题库 题目描述 分析: y总真牛逼,掉头等价于穿过,以第一个点为分界点,分别判断 代码: (自…...

常见排序算法--Java实现

常见排序算法--Java实现插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序各种排序方法比较在网上找了些排序算法的资料。此篇笔记本人总结比较,简单注释,觉得比较好理解,且相对…...

算法笔记(九)—— 暴力递归

暴力递归(尝试) 1. 将问题转化为规模缩小了的同类问题子问题 2. 有明确的不需要的继续递归的条件 3. 有当得到子问题结果之后的决策过程 4. 不记录每一个子问题的解 Question:经典汉诺塔问题 1. 理解清楚,基础三个圆盘的移动…...

Flask框架学习记录

Flask项目简要 项目大致结构 flaskDemo1 ├─static ├─templates └─app.py app.py # 从flask这个包中导入Flask类 from flask import Flask# 使用Flask类创建一个app对象 # __name__:代表当前app.py这个模块 # 1.以后出现bug,可以帮助快速定位 # 2.对于寻找…...

【Opencv 系列】 第6章 人脸检测(Haar/dlib) 关键点检测

本章内容 1.人脸检测,分别用Haar 和 dlib 目标:确定图片中人脸的位置,并画出矩形框 Haar Cascade 哈尔级联 核心原理 (1)使用Haar-like特征做检测 (2)Integral Image : 积分图加速特征计算 …...

信源分类及数学模型

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:information-theory】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录信源分类按照信源…...

Games101-202作业1

一. 将模型从模型空间变换到世界空间下 在这个作业下,我们主要进行旋转的变换。 二.视图变换 ,将相机移动到坐标原点,同时保证物体和相机进行同样的变换(这样对形成的图像没有影响) 在这个作业下我们主要进行摄像机的平移变换&am…...

Linux系统之终端管理命令的基本使用

Linux系统之终端管理命令的基本使用一、检查本地系统环境1.检查系统版本2.检查系统内核版本二、终端介绍1.终端简介2.Linux终端简介3.终端的发展三、终端的相关术语1.终端模拟器2.tty终端3.pts终端4.pty终端5.控制台终端四、终端管理命令ps1.直接使用ps命令2.列出登录详细信息五…...

【Mongoose笔记】MQTT 服务器

【Mongoose笔记】MQTT 服务器 简介 Mongoose 笔记系列用于记录学习 Mongoose 的一些内容。 Mongoose 是一个 C/C 的网络库。它为 TCP、UDP、HTTP、WebSocket、MQTT 实现了事件驱动的、非阻塞的 API。 项目地址: https://github.com/cesanta/mongoose学习 下面…...

数据结构概述

逻辑结构 顺序存储 随机访问是可以通过下标取到任意一个元素,即数组的起始位置下标 链式存储 链式存储是不连续的,比如A只保留了当前的指针,那么怎么访问到B和C呢 每个元素不仅存储自己的值还使用额外的空间存储指针指向下一个元素的地址&a…...

【前端】Vue3+Vant4项目:旅游App-项目总结与预览(已开源)

文章目录项目预览首页Home日历:日期选择开始搜索位置选择上搜索框热门精选-房屋详情1热门精选-房屋详情2其他页面项目笔记项目代码项目数据项目预览 启动项目: npm run dev在浏览器中F12: 首页Home 热门精选滑动到底部后会自动加载新数据&a…...

51单片机蜂鸣器的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、有源蜂鸣器和无源蜂鸣器的区别二、代码编写总结前言 本文旨在介绍如何使用51单片机驱动蜂鸣器。 一、有源蜂鸣器和无源蜂鸣器的区别 有源蜂鸣器是一种电子…...

算法练习-链表(二)

算法练习-链表(二) 文章目录算法练习-链表(二)1. 奇偶链表1.1 题目1.2 题解2. K 个一组翻转链表2.1 题目2.2 题解3. 剑指 Offer 22. 链表中倒数第k个节点3.1 题目3.2 题解3.2.1 解法13.2.2 解法24. 删除链表的倒数第 N 个结点4.1 …...

LabVIEW使用实时跟踪查看器调试多核应用程序

LabVIEW使用实时跟踪查看器调试多核应用程序随着多核CPU的推出,开发人员现在可以在LabVIEW的帮助下充分利用这项新技术的功能。并行编程在为多核CPU开发应用程序时提出了新的挑战,例如同步多个线程对共享内存的并发访问以及处理器关联。LabVIEW可自动处理…...

【go语言grpc之client端源码分析二】

go语言grpc之server端源码分析二DialContextparseTargetAndFindResolvergetResolvernewCCResolverWrapperccResolverWrapper.UpdateStatecc.maybeApplyDefaultServiceConfigccBalancerWrapper.updateClientConnState上一篇文章分析了ClientConn的主要结构体成员,然后…...

centos7安装RabbitMQ

1、查看本机基本信息 查看Linux发行版本 uname -a # Linux VM-0-8-centos 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/redhat-release # CentOS Linux release 7.9.2009 (Core)2、创建创建工作目录 mkdir /…...

node基于springboot 口腔卫生防护口腔牙科诊所管理系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 JAVA简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2.5 SPRINGBOOT框架 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.…...

Linux常用命令之find命令详解

简介 find命令主要用于:用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。 如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 是我们在…...

CMake 入门学习4 软件包管理

CMake 入门学习4 软件包管理一、Linux下的软件包管理1. 检索已安装的软件包2. 让自己编译软件支持pkg-config搜索3. 在CMakeLists查找已安装的软件包二、适合Windows下的包管理工具1. vcpkg2. Conan(1) 安装Conan(2) 配置Conan(3) 创建工程(4) 安装依赖库(5) 使用依赖库三、CMa…...