01-Kafaka

2023-11-06

1、Kafka 2 的安装与配置

1、上传kafka_2.12-1.0.2.tgz到服务器并解压:

        tar -zxf kafka_2.12-1.0.2.tgz  -C /opt

2、配置环境变量并更新:

编辑profile配置文件:  vim /etc/profile

#设置kafka的环境变量

export KAFKA_HOME=/opt/kafka_2.12-1.0.2

export PATH=$PATH:$KAFKA_HOME/bin

重新加载profile文件:        source /etc/profile

3、在/opt/kafka_2.12-1.0.2目录中输入kafka-按住tab键,如果能调出其他的指令说明我们配置

profile成功。

4、配置/opt/kafka_2.12-1.0.2/config中的server.properties文件:

> Kafka连接Zookeeper的地址:49.234.5.32:2181,后面的 myKafka 是Kafka在Zookeeper中的根节点路径。

zookeeper.connect=49.234.5.32:2181/mykafka

> 发消息到kafka,kafka会给你进行一个持久化,存储的目录。

Log.dir=/var/niko/kafka/kafka-logs

我们创建这个目录/var/niko/kafka/kafka-logs

mkdir -p /var/niko/kafka/kafka-logs

5、启动zookeeper

进入到/opt/zookeeper-3.4.14/bin目录

cd /opt/zookeeper-3.4.14/bin

启动

zkServer.sh start

6、验证zookeeper:

zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /opt/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: standalone 说明成功了

7、启动Kafka:

进入Kafka安装的bin目录,执行如下命令:

cd  /opt/kafka_2.12-1.0.2/bin

kafka-server-start.sh  ../config/server.properties

启动成功,可以看到控制台输出的最后一行的started状态:

[2019-07-31 21:18:53,199] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)

8、查看Zookeeper的节点

进入到Zookeeper安装目录的bin目录下

执行 zkCli.sh

执行命令ls /    查看所有的子节点

[mykafka, zookeeper]

9、此时Kafka是前台模式启动,要停止,使用Ctrl+C。

10、如果要后台启动 

进入Kafka安装的bin目录,执行如下命令:

cd /opt/kafka_2.12-1.0.2/bin

执行:kafka-server-start.sh -daemon  ../config/server.properties

11、查看Kafka的后台进程:ps aux | grep kafka

注意 kafka端口号9092

2、查看kafka是否启动

1、输入指令jps,查看kafka是否启动。

2、在任意目录下以后台的方式启动kafka

kafka-server-start.sh  -daemon  /opt/kafka_2.12-1.0.2/config/server.properties

3、再次输入jps,查看kafka是否启动成功。

3、在Linux使用命令生产与消费(了解)

3.1、kafka-topics.sh 用于管理主题

# 列出现有的主题(主题是放在zookeeper的节点上的)

kafka-topics.sh --list --zookeeper localhost:2181/mykafka

# 创建主题,该主题包含一个分区,该分区为Leader分区,它没有Follower分区副本

--partitions    创建的分区个数

--replication-factor       创建的副本个数,用来实现高可用

kafka-topics.sh --zookeeper 49.234.5.32:2181/mykafka --create --topic topic_1 --partitions 1  --replication-factor 1

# 查看指定主题的详细信息

kafka-topics.sh --zookeeper 49.234.5.32:2181/mykafka --describe --topic topic_1

输出结果:

Topic:topic_1   PartitionCount:1        ReplicationFactor:1     Configs:

Topic: topic_1  Partition: 0    Leader: 0       Replicas: 0     Isr: 0

#删除指定主题

kafka-topics.sh --zookeeper 49.234.5.32:2181/mykafka --delete --topic topic_1

3.2、kafka-console-producer.sh用于生产消息

kafka-console-producer.sh --topic topic_1 --broker-list 49.234.5.32:9092

3.3、kafka-console-consumer.sh用于消费消息

kafka-console-consumer.sh  --bootstrap-server 49.234.5.32:9092 --topic topic_1

开启消费者方式二,从头消费,不按照偏移量消费

kafka-console-consumer.sh --bootstrap-server 49.234.5.32:9092 --topic topic_1 --from-beginning

注意:先开启消费消息,在开启生成消息,这样有生成消息的时候就可以直接消费了。

3.4、查看Kafka所有持久化的数据

进入到我们创建的用来保存持久化数据的目录:

cd /var/niko/kafka/kafka-logs

ls  

 有下面的偏移量,说明我们使用kafka成功。

  __consumer_offsets-22  __consumer_offsets-35  __consumer_offsets-48

__consumer_offsets-10      __consumer_offsets-23

4、kafka发送消息的流程

5、Maven项目中使用Kafka开发实战(了解)

1、首先创建一个maven工程,我们将src目录删除,然后再pom.xml文件中设置这个工程的打包方式为pom。

    <!--    这是kafka的工程的父目录 我们使用pom的打包方式-->

    <packaging>pom</packaging>

2、设置工程的maven仓库目录和setting文件。

3、创建子模块producer-consumer-test01 和 producer-product-test01

4、在模块producer-consumer-test01的pom.xml文件中导入依赖。

<dependencies>
	<!-- kafka-clients的依赖-->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <!-- 高版本兼容低版本,我们使用和broker一致的版本 -->
            <version>1.0.2</version>
        </dependency>
    </dependencies>

5.1、生产者

消费者生产消息后,需要broker端的确认,可以同步确认,也可以异步确认。

同步确认效率低,异步确认效率高,但是需要设置回调对象。

package com.wei.producer;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.header.Header;
import org.apache.kafka.common.header.internals.RecordHeader;
import org.apache.kafka.common.serialization.IntegerSerializer;
import org.apache.kafka.common.serialization.StringSerializer;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class MyProducer1 {


    public static void main(String[] args) throws ExecutionException, InterruptedException {

        /**
         *  1.1、KafkaProducer 的创建需要指定的参数
         *  server地址   key的序列化   value的序列化  timeout   ack  retries
         */
        Map<String,Object> map = new HashMap<>();
        map.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"49.234.5.32:9092");
        map.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class);
        map.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
//        map.put("request.timeout.ms",55);
//        map.put(ProducerConfig.ACKS_CONFIG,"all");  //有默认值可以不设置
//        map.put(ProducerConfig.RETRIES_CONFIG,3);   //也可以不设置
//        1、创建发送消息的类对象KafkaProducer
        KafkaProducer<Integer, String> producer = new KafkaProducer<>(map);


        /**
         * -String topic:  主题
         * -Integer partition: 分区
         * -Long timestamp: 时间戳
         * -K key:  key
         * -V value:    value
         * -Iterable<Header> headers) :用于设置用户自定义的消息头字段
         *
         */
//        2.1、创建一个数组,里面存放的都是Header
        ArrayList<Header> headers = new ArrayList<>();
//        添加的是Header接口的实现类RecordHeader  通过构造方法实例化一个RecordHeader对象
        headers.add(new RecordHeader("wode.name","wode.value".getBytes(StandardCharsets.UTF_8)));
//        2、使用producerRecord用来给kafka发送封装的消息
        ProducerRecord<Integer, String> producerRecord = new ProducerRecord<>(
                "topic_2",
                0,
                0,
                "nihao wudi",
                headers
        );
//        3、发送消息
//        消费者生产消息后,需要broker端的确认,可以同步确认,也可以异步确认。
//        同步确认效率低,异步确认效率高,但是需要设置回调对象。
//        3.1、同步发送
//       final Future<RecordMetadata> future = producer.send(producerRecord);
//        final RecordMetadata recordMetadata = future.get();
//        System.out.println("主题是:"+recordMetadata.topic());
//        System.out.println("分区是:"+recordMetadata.partition());
//        System.out.println("变异量是:"+recordMetadata.offset());
//        3.2、异步发送
        producer.send(producerRecord, new Callback() {
            @Override
            public void onCompletion(RecordMetadata metadata, Exception exception) {
                if (exception == null) {
                    System.out.println("消息的主题:" + metadata.topic());
                    System.out.println("消息的分区号:" + metadata.partition());
                    System.out.println("消息的偏移量:" + metadata.offset());
                } else {
                    System.out.println("异常消息:" + exception.getMessage());
                }
            }
        });
//        4、关闭producer
        producer.close();
    }
}

5.2、消费者

package com.lagou.kafka.demo.consumer;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.IntegerDeserializer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

public class MyConsumer2 {
    public static void main(String[] args) {



        Map<String, Object> configs = new HashMap<>();
        // mac的hosts文件中手动配置域名解析
        configs.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "49.234.5.32:9092");
        // 使用常量代替手写的字符串,配置key的反序列化器
        configs.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, IntegerDeserializer.class);
        // 配置value的反序列化器
        configs.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        // 配置消费组ID
        configs.put(ConsumerConfig.GROUP_ID_CONFIG, "consumer_demo2");
        // 如果找不到当前消费者的有效偏移量,则自动重置到最开始
        // latest表示直接重置到消息偏移量的最后一个
        configs.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

        KafkaConsumer<Integer, String> consumer = new KafkaConsumer<Integer, String>(configs);

        // 先订阅,再消费
        consumer.subscribe(Arrays.asList("topic_1"));

        while (true) {
     // 如果主题中没有可以消费的消息,则该方法可以放到while循环中,每过3秒重新拉取一次
     // 如果还没有拉取到,过3秒再次拉取,防止while循环太密集的poll调用。
            // 批量从主题的分区拉取消息
            final ConsumerRecords<Integer, String> consumerRecords = consumer.poll(3_000);

            // 遍历本次从主题的分区拉取的批量消息
            consumerRecords.forEach(new Consumer<ConsumerRecord<Integer, String>>() {
                @Override
                public void accept(ConsumerRecord<Integer, String> record) {
                    System.out.println(record.topic() + "\t"
                            + record.partition() + "\t"
                            + record.offset() + "\t"
                            + record.key() + "\t"
                            + record.value());
                }
            });
        }

//        consumer.close();

    }
}

6、SpringBoot整合 Kafka

1、首先是创建一个springboot-kafka-sum-demo02项目。

2、通过快速构建的方式添加spring-web 、spring-kafka或者是手动在pom.xml文件中添加spring-web 、spring-kafka的依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

3、resource目录下的application.properties文件:

#1、设置应用程序的名称和端口号
spring.application.name=springboot-kafka-02
server.port=8080

#2、kafka单体或者集群的host和端口号
spring.kafka.bootstrap-servers=49.234.5.32:9092

#3、producer的配置
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.IntegerSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#producer生产者每一批次可以放多少条记录
spring.kafka.producer.batch-size=16384
#生产者端 可以用来发送的缓冲区的大小  32MB   单位是字节
spring.kafka.producer.buffer-memory=33554432

#4、consumer的配置
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.group-id=springboot-consumer02
#如果在kafka的消费者中找不到当前的偏移量  从最早的偏移量开始获取数据
spring.kafka.consumer.auto-offset-reset=earliest

#消费者的偏移量是自动提交还是手动提交  设置成true表示是自动提交变异量   如果有事务的情况下 我们通常是设置成手动提交
spring.kafka.consumer.enable-auto-commit=true
#消费者设置成自动提交偏移量的一个提交频率
spring.kafka.consumer.auto-commit-interval=1000

4、生产者同步发送消息

package com.wei.springbootkafka.producer;

import org.apache.kafka.clients.producer.RecordMetadata;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ExecutionException;

@RestController
public class MyProducer01 {

//    1、自动注入KafkaTemplate
    @Autowired
    private KafkaTemplate<Integer,String> template;

    @RequestMapping("/send/sync/{message}")
    public String sendSyncMessage(@PathVariable("message") String message){
//        2、使用KafkaTemplate发送消息
        ListenableFuture<SendResult<Integer, String>> future =
                template.send("spring-topic-01", 0, 0, message);
//        3、同步发送消息   get()
        try {
            SendResult<Integer, String> result = future.get();
            RecordMetadata metadata = result.getRecordMetadata();
            System.out.println("主题是:"+metadata.topic());
            System.out.println("分区是:"+metadata.partition());
            System.out.println("偏移量是:"+metadata.offset());
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("异常了");
        }
        return "success";
    }
}

5、生产者异步发送消息 

@RestController
public class MyProducer02 {

//    1、自动注入KafkaTemplate
    @Autowired
    private KafkaTemplate<Integer,String> template;

    @RequestMapping("/send/sync/{message}")
    public String sendSyncMessage(@PathVariable("message") String message){
//        2、使用KafkaTemplate发送消息
        ListenableFuture<SendResult<Integer, String>> future =
                template.send("spring-topic-01", 0, 0, message);
//        3、异步发送消息   
       future.addCallback(new ListenableFutureCallback<SendResult<Integer, String>>() {
           @Override
           public void onFailure(Throwable ex) {
               System.out.println("失败了"+ex.getMessage());
           }

           @Override
           public void onSuccess(SendResult<Integer, String> result) {
               RecordMetadata recordMetadata = result.getRecordMetadata();
               System.out.println("发送消息成功:" + metadata.topic() + "\t" 
                       + metadata.partition() + "\t" 
                       + metadata.offset());
           }
       });
       
       
        return "success";
    }
}

6、消费者消费消息

package com.wei.springbootkafka.consumer;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

//1、交由spring进行管理
@Component
public class MyConsumer01 {
//    2、KafkaListener监听指定的主题
    @KafkaListener(topics="spring-topic-01")
//    3、添加了@KafkaListener注解后  方法中就可以使用ConsumerRecord:用来接收kafka的消息
    public void getMessage(ConsumerRecord<Integer,String> record){
        System.out.println("consumer"
                + record.topic()+"\t"
                + record.partition()+"\t"
                + record.offset()+"\t"
                + record.key()+"\t"
                + record.value()+"\t"
        );
    }
}

7、kafka报错 UnknownHostException 解决方案

运行springboot和kafka整合项目报错java.net.UnknownHostException: VM-4-7-centos

解决方案:

1、cd 到/opt/kafka_2.12-1.0.2/config目录下

2、vim server.properties

设置成listeners=PLAINTEXT://VM-4-7-centos:9092

3、通过查看 linux服务器的 /etc/hosts 文件:将VM-4-7-centos指向的就是linux服务器ip。

127.0.0.1 VM-4-7-centos VM-4-7-centos

49.234.5.32  VM-4-7-centos VM-4-7-centos

4、由于我是在本机服务中访问到了linux服务器上的kafka服务,自然就无法解析到 VM-4-7-centos。因此需要在本机的hosts文件中也加入相应的配置!

5、Mac系统的hosts 文件就在 /etc/hosts 路径里,我们直接是无法编辑的,需要通过下面的方法来修改我们的 hosts 文件。

进入终端(命令窗口)里,输入 sudo vi /etc/hosts ,回车后再输入密码,再回车就可以打开我们的hosts文件了。

添加VM-4-7-centos 的服务器的ip地址:

49.234.5.32 VM-4-7-centos

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

01-Kafaka 的相关文章

  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set

随机推荐

  • java(有关类成员变量的访问权限)

    private public protected 默认不写 firendly 1 Class类的访问权限 public 可以供所有的类访问 默认 默认可以称为friendly但是 java语言中是没有friendly这个修饰符的 这样称呼应
  • Linux 编写定时任务

    1 先进入根目录 mkdir p home wangwenjun scripts cd home wangwenjun scripts 2 编写第一个shell文件 test sh vim test sh bin sh now date Y
  • Windows下Git-preview中文乱码的解决方法

    在Windows下安装Git preview 1 7 4后 使用中发现许多的乱码问题 感觉甚是不便 这是因为Git是在linux下开发的管理软件 而linux的编码方式是基于UTF 8的 所以移植到Windows之后难免会存在编码方式不同的
  • android wear 微信语音,moto 360手表语音回复微信教程

    moto360智能手表是一款搭载android系统的智能手表 目前微信已经添加了对智能手表的支持 不过很多玩家对于怎么使用moto 360语音回复微信还不是很清楚 下面小编就为大家分享一下moto 360语音回复微信教程 moto 360语
  • 最大权闭合子图(最小割)

    最大权闭合子图 最大流最小割 参考资料 1 最大权闭合子图 权闭合子图 存在一个图的子图 使得子图中的所有点出度指向的点依旧在这个子图内 则此子图是闭合子图 在这个图中有8个闭合子图 3 4 2 4 3 4 1 3 4 2 3 4 1 2
  • Qt绘图QGraphicsView、QGraphicsScene、QGraphicsItem简述

    Qt绘图中 QGraphicsView QGraphicsScene QGraphicsItem三者之间密不可分 以下简单介绍三者之间关系 三者之间关系 如同绘画的过程 Qt绘图中 QGraphicsView的作用相当于画板 QGraphi
  • linux 使用笔记

    1 查看使用的所有端口 netstat ntlp 2 查找文件路径 locate 文件名 如 find 文件名 如 find home 3 Linux下查看和停止所有java进程 在Linux下查看所有java进程命令 ps ef grep
  • 摄像机跟踪主角第三人称的视角

    using UnityEngine using System Collections public class FollowFarget MonoBehaviour public Transform PlayerTransfrom 定义一个
  • Unity 性能优化五:渲染模块压力

    CPU压力 Batching 在GPU渲染前 CPU会把数据按batch发送给GPU 每发送一次 都是一个drawcall GPU在渲染每个batch的时候 会切换渲染状态 这里的渲染状态指的是 影响对象在屏幕上的外观的渲染属性或材质 比如
  • OpenCV自适应阈值化函数adaptiveThreshold

    图像阈值化的一般目的是从灰度图像中分享目标区域和背景区域 然而仅仅通过设定固定阈值很难达到理想的分割效果 在实际应用中 我们可以通过某个像素的邻域以某种方法确定这个像素应该具有的阈值 进而保证图像中各个像素的阈值会随着周期围邻域块的变化而变
  • EasyExcel的简单导出

    EasyExcel的简单导出 Controller层代码 GetMapping download public void download String name HttpServletResponse response fileManag
  • 5、安全理论与框架-企业架构模型(EA)-业务组件模型(IBM CBM)

    一 背景 CBM component business model 组件化业务模型或叫业务组件模型 是IBM在2003年提出的 当时的大背景 公司内 外专业化 CBM是IBM做业务架构的一个重要方法论 就是把业务描述成一个个独立的小块 我们
  • 面试题一:前端去重方法汇总你知道多少?

    题记 我们项目中有很多的业务是需要去重的 那么下面是常用的一些去重的一些方法 用indexOf方法去重 新建一个空数组 遍历需要去重的数组 将数组元素存入新数组中 存放前判断数组中是否已经含有当前元素 没有则存入 此方法也无法对NaN去重
  • 上采样,下采样,过采样,欠采样的区别

    上下是方法 过欠是现象 上采样 upsampling 应该就是内插 补零滤波 下采样 downsampling 应该就是抽取 过采样就是采样频率大于两倍的信号最高频率 欠采样就是采样频率小于两倍的信号最高频率 欠采样失真仅仅是对基带信号而言
  • 源码编译llvm Error 记录

    cmake G Unix Makefiles llvm DLLVM ENABLE PROJECTS bolt clang clang tools extra compiler rt cross project tests libclc l
  • OceanBase:编译、安装和配置手册

    概述 OceanBase是 一个高性能的分布式表格系统 提供类似BigTable的性能和扩展性 但表格中保存的是强类型的数据 比如integer string datetime等 它使用C 编写 运行于64位Linux环境下 生产环境下需要
  • Ubuntu20.04编译安装opencv3.2和opencv_contrib-3.2

    图像特征提取中需要用到SIFT等算法 因此不得不安装从源码编译安装opencv contrib 网上有很多教程 但是在不同的环境下多少会出现一些错误 针对Ubuntu20 04 gcc 7环境下对opencv opencv contrib编
  • ios内嵌h5点击输入框页面放大

    首先咱们这个是基于修改meta没卵用的情况 去修改这个input的style把font size改成16px 我的机型是xr 自己用了反正有效 希望对你有帮助
  • 实战:tomcat版本升级

    tomcat版本升级 由原来的apache tomcat 7 0 96升级到apache tomcat 7 0 109 版本 1 先把原来的备份 mv apache tomcat 7 0 96 1 apache tomcat 7 0 96
  • 01-Kafaka

    1 Kafka 2 的安装与配置 1 上传kafka 2 12 1 0 2 tgz到服务器并解压 tar zxf kafka 2 12 1 0 2 tgz C opt 2 配置环境变量并更新 编辑profile配置文件 vim etc pr