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

【2024秋招】2023-10-9 同花顺后端笔试题

1 Hashmap mp = new hashmap(50)的大小扩充了几次

初时应该就给了这么多空间,在不考虑添加元素,所以扩容为0次

2 算数表达式的中缀为a+b*c-d/e,后缀为abc*+de/-,前缀是?

3 50M电信带宽,计算下带宽理论最快下载速度是多少

带宽通常以"比特/秒"(如Mbps,即百万比特每秒)为单位表示,而文件或数据的大小通常以"字节"为单位表示(如MB,即兆字节)。要注意,1字节等于8比特。

假设你的50M电信带宽是50Mbps(50兆比特每秒)。

理论最快下载速度 = 带宽 / 8

= 50 Mbps / 8
= 6.25 MB/s

因此,理论上,你的下载速度最快可以达到6.25 MB/s。

4 你的服务器被攻击了,黑客把他的程序伪装成服务器上正常的工具程序,如何找到这些程序,请说出你的思路

当服务器受到攻击并且恶意程序伪装成正常的工具程序时,检测和清除这些威胁是一项挑战。以下是一些检测恶意程序的常用方法和思路:

  1. 日志审查

    • 检查系统和应用日志以寻找异常活动或未授权的访问记录。
  2. 文件完整性检查器

    • 使用如Tripwire或AIDE这样的工具来检查系统文件的完整性。这些工具可以检测到文件的任何未授权更改。
  3. 进程监视

    • 使用ps, top, 或htop等工具来查看正在运行的进程,寻找异常或未知的进程。
    • netstatss 可以用来查看当前的网络连接,以确定是否有异常的外部连接。
  4. 系统基线

    • 如果你有一个系统基线(一个已知的干净、正常的系统状态快照),可以将当前状态与此基线进行比较,找出差异。
  5. Rootkit检测工具

    • 使用如Rkhunter或Chkrootkit这样的工具来检测是否有rootkits存在。
  6. 外部扫描

    • 使用外部系统对你的服务器进行扫描,以确定是否有任何已知的恶意活动或开放的漏洞。
  7. 定期更新和打补丁

    • 确保系统和所有应用程序都是最新的,以减少已知漏洞。
  8. 网络流量分析

    • 使用网络监控工具(如Wireshark)来捕获和分析流量,寻找异常模式或恶意活动。
  9. 文件系统审计

    • 定期检查最近修改或新创建的文件,特别是在关键目录中。
  10. 反病毒和反恶意软件扫描

  • 使用反病毒软件来扫描可能的恶意文件或程序。
  1. 沙盒技术
  • 在隔离的环境中执行可疑的程序或文件,以观察其行为。

最后,如果你认为服务器已经被感染或渗透,最安全的做法是从已知的干净备份中恢复,并对系统进行全面审计,以确定攻击的来源和范围,并修复任何潜在的安全漏洞。

5 写一个匹配url的正则表达式

匹配URL的正则表达式可以有很多种,根据所需匹配的URL的类型和复杂性。下面是一个常用的,能匹配大部分常见URL的正则表达式:

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

解释:

  • ^: 开始。
  • (https?:\/\/)?: 可选的匹配 http:// 或 https://。
  • ([\da-z\.-]+): 匹配域名标签(如 “google” 在 “google.com”)。
  • \.([a-z\.]{2,6}): 匹配顶级域名(如 “.com”, “.org.cn”)。
  • ([\/\w \.-]*)*\/?: 匹配路径、文件名和查询参数。
  • $$: 结束。

请注意,这个正则表达式能匹配大部分常见的URL,但对于某些特定情况或特殊的URL可能需要调整或完善。正则表达式可以根据具体需求进行修改或扩展。

6 说一下对象锁和类锁的区别

在Java的多线程编程中,对象锁和类锁是两种常见的同步机制。它们的区别主要如下:

  1. 锁的对象不同

    • 对象锁:是对一个实例对象进行加锁。这通常是通过synchronized关键字在实例方法上实现的,或者通过synchronized(this)在代码块上实现。
    • 类锁:是对一个类的所有对象实例进行加锁。这通常是通过synchronized关键字在静态方法上实现的,或者通过synchronized(ClassName.class)在代码块上实现。
  2. 作用范围不同

    • 对象锁:只影响对该对象实例的访问。即,同一时刻,其他线程仍然可以访问该类的其他实例对象。
    • 类锁:影响对该类的所有对象实例的访问。即,同一时刻,其他线程不能访问该类的任何实例。
  3. 使用场景不同

    • 对象锁:当需要控制对单个对象实例的访问时使用。
    • 类锁:当需要控制对类的所有实例的访问或对静态资源的访问时使用。
  4. 实现方式不同

    • 对象锁:通常通过以下方式实现:
      • synchronized 修饰非静态方法。
      • synchronized(this) 修饰代码块。
    • 类锁:通常通过以下方式实现:
      • synchronized 修饰静态方法。
      • synchronized(ClassName.class) 修饰代码块。
  5. 存储位置

    • 对象锁:存在于对象的头部。
    • 类锁:存在于类的Class对象的头部。

总的来说,对象锁和类锁是Java中的两种同步机制,但它们的作用范围和使用场景是不同的。选择哪种类型的锁应该基于实际的同步需求来决定。

7 用java实现输出1到999中所有不包含5的整数

以下是一个简单的Java程序,用于输出1到999之间所有不包含数字5的整数:

public class NoFiveNumbers {public static void main(String[] args) {for (int i = 1; i <= 999; i++) {if (!Integer.toString(i).contains("5")) {System.out.println(i);}}}
}

此程序将每个整数转换为字符串,并检查它是否包含数字5。如果不包含5,它就会输出该整数。

8 如何理解aop,是否有编写自定义注解的经验,文字描述一下实现过程

理解AOP

AOP(面向切面编程 - Aspect Oriented Programming)是一个编程范式,其目标是解决软件设计中的交叉关注点,即那些分布在多个模块中的功能(如日志、事务管理、安全性等)。AOP使得这些功能可以被模块化,并能在不修改核心逻辑的情况下被应用到代码的不同部分。

关于编写自定义注解:

Java中的注解是一种元数据形式,它们不直接影响代码的逻辑,但可以通过反射被读取,并为工具和库提供额外的信息。

实现一个使用自定义注解和AOP的例子:

  1. 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {
}

这是一个简单的注解,可以应用于方法上,以记录方法的执行时间。

  1. 编写切面

使用Spring AOP,我们可以定义一个切面,当调用带有 @LogExecutionTime 注解的方法时,记录其执行时间。

@Aspect
@Component
public class LogExecutionAspect {@Around("@annotation(LogExecutionTime)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long start = System.currentTimeMillis();Object proceed = joinPoint.proceed();long executionTime = System.currentTimeMillis() - start;System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");return proceed;}
}
  1. 使用注解

应用 @LogExecutionTime 注解于任何你想记录执行时间的方法上:

@Service
public class SomeService {@LogExecutionTimepublic void serve() throws InterruptedException {Thread.sleep(2000);}
}
  1. 配置AOP

如果你使用的是Spring Boot,只需在pom.xml文件中添加Spring AOP的依赖,并在应用主类上使用@EnableAspectJAutoProxy注解。

总结:

通过结合自定义注解和AOP,你可以轻松地为应用添加跨多个模块的功能,而无需修改核心业务逻辑。这增强了代码的可维护性和可重用性。

9 spring bean如何保持线程安全,为什么

在Spring框架中,Bean的线程安全性主要取决于其作用域和你如何使用这些Bean。下面是关于Spring Bean线程安全性的几点考虑:

  1. 默认的Bean作用域 - 单例(Singleton)

    • 当Bean的作用域为单例时,Spring容器在启动时只为该Bean创建一个实例,并为所有对该Bean的请求返回相同的实例。这意味着,如果Bean的状态在多线程环境中被多个线程共享,那么这个Bean是线程不安全的。
    • 为了确保单例Bean的线程安全性,你应该避免在Bean中使用任何共享状态(例如,成员变量)或确保对共享状态的访问是线程安全的(例如,通过同步)。
  2. 原型(Prototype)作用域

    • 当Bean的作用域为原型时,Spring容器每次请求时都会创建一个新的Bean实例。因此,Bean的状态不会被多个线程共享,但这并不保证Bean引用的其他对象是线程安全的。
  3. 请求(Request)和会话(Session)作用域

    • 这些是专为web应用设计的作用域。请求作用域为每个HTTP请求创建一个新的Bean,而会话作用域为每个HTTP会话创建一个Bean。
    • 这些Bean本身不会被多个线程共享,但与单例Bean的交互可能仍需要线程安全性的考虑。
  4. 最佳实践

    • 无状态Bean:确保Bean是无状态的,即不包含任何会被多线程共享的成员变量,是保持线程安全性的最佳实践。
    • 同步:如果必须使用有状态的单例Bean,确保对共享资源的访问是同步的。
    • 使用线程局部变量:为每个线程存储其自己的状态。
  5. 为什么

    • Spring的设计选择,特别是默认的单例作用域,基于性能和内存使用的考虑。频繁地创建和销毁Bean实例会增加系统的开销。
    • 线程安全性是一个复杂的问题,而Spring选择提供灵活性,让开发者决定如何处理它,而不是强制一种特定的方式。

总的来说,保持Spring Bean线程安全主要是开发者的责任。选择合适的Bean作用域,并遵循线程安全的最佳实践,是确保应用线程安全性的关键。

10 创建5个线程,内核线程做2w次累加,最终输出5个线程的累加和

10.1 方法一:使用线程池

为了创建5个线程,并使每个线程内核进行2万次累加,你可以使用Java的Thread类或ExecutorService。下面是一个简单的示例,展示了如何使用ExecutorService来完成这个任务:

import java.util.concurrent.*;public class ThreadSum {public static void main(String[] args) throws InterruptedException, ExecutionException {ExecutorService executor = Executors.newFixedThreadPool(5);List<Future<Integer>> futures = new ArrayList<>();// 为每个线程提交一个任务for (int i = 0; i < 5; i++) {futures.add(executor.submit(new SumTask()));}// 获取每个线程的结果并累加int totalSum = 0;for (Future<Integer> future : futures) {totalSum += future.get();}System.out.println("Total sum: " + totalSum);executor.shutdown();}
}class SumTask implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 20000; i++) {sum += i;}return sum;}
}

此代码首先创建一个固定大小的线程池,然后提交5个任务到线程池。每个任务都会进行2万次的累加。最后,主线程等待所有任务完成,并累加每个任务的结果以得到最终总和。

注意:为了简化示例,这里直接使用了future.get()来获取每个任务的结果。在实际应用中,你可能需要考虑其他方法来有效地处理这些结果,特别是在大规模并发环境下。

10.2 使用CompletableFuture

public static void main(String[] args) throws InterruptedException, ExecutionException{List<CompletableFuture<Integer>>list=new ArrayList<>();for (int i = 0; i < 5; i++) {list.add(CompletableFuture.supplyAsync(()->{Integer sum=0;for (int j = 0; j < 2000; j++) {sum+=1;}return sum;}));}int s=0;for (Future<Integer>f:list){s+=f.get();}System.out.println("s:"+s);}import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;public class CompletableFutureSum {public static void main(String[] args) {List<CompletableFuture<Integer>> futures = new ArrayList<>();// 为每个线程提交一个任务for (int i = 0; i < 5; i++) {futures.add(CompletableFuture.supplyAsync(() -> {int sum = 0;for (int j = 0; j < 20000; j++) {sum += j;}return sum;}));}// 获取每个线程的结果并累加int totalSum = futures.stream().map(CompletableFuture::join).mapToInt(Integer::intValue).sum();System.out.println("Total sum: " + totalSum);}
}

11 现有集合Arraylist list =new ArrayLIst,利用反射机制在这个泛型为integer的list中存放一个string对象

利用Java的反射机制,你可以绕过泛型的类型检查,从而在一个设计为存储特定类型元素的ArrayList中存放其他类型的元素。以下是一个示例,展示如何在一个泛型为IntegerArrayList中存放一个String对象:

import java.lang.reflect.Method;
import java.util.ArrayList;public class ReflectionList {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();try {Method addMethod = list.getClass().getMethod("add", Object.class);addMethod.invoke(list, "This is a string");System.out.println(list.get(0));  // 输出: This is a string} catch (Exception e) {e.printStackTrace();}}
}

在这个示例中,我们首先创建了一个泛型为IntegerArrayList。然后,我们使用反射获取add方法,该方法的参数类型为Object。这允许我们调用该方法并传入一个String对象。

需要注意的是,这种操作会破坏泛型的类型安全性,因此在实际应用中应谨慎使用。

相关文章:

【2024秋招】2023-10-9 同花顺后端笔试题

1 Hashmap mp new hashmap&#xff08;50&#xff09;的大小扩充了几次 初时应该就给了这么多空间&#xff0c;在不考虑添加元素&#xff0c;所以扩容为0次 2 算数表达式的中缀为ab*c-d/e&#xff0c;后缀为abc*de/-&#xff0c;前缀是&#xff1f; 3 50M电信带宽&#xff…...

完美的错误处理:Go 语言最佳实践分享

Go 语言是一门非常流行的编程语言&#xff0c;由于其高效的并发编程和出色的网络编程能力&#xff0c;越来越受到广大开发者的青睐。在任何编程语言中&#xff0c;错误处理都是非常重要的一环&#xff0c;它关系到程序的健壮性和可靠性。Go 语言作为一门现代化的编程语言&#…...

vue首页多模块布局(标题布局)

<template><div class"box"><div class"content"><div class"box1" style"background-color: rgb(245,23,156)">第一个</div><div class"box2" style"background-color: rgb(12,233,…...

嵌入式系统>嵌入式硬件知识

AI芯片的特点包括 &#xff1a;新型计算范式AI芯片的关键特征&#xff1a; 1、新型的计算范式 AI 计算既不脱离传统计算&#xff0c;也具有新的计算特质&#xff0c;如处理的内容往往是非结构化数据&#xff08;视频、图片等&#xff09;。处理的过程通常需要很大的计算量&am…...

LeetCode 1402. 做菜顺序【排序,动态规划;贪心,前缀和,递推】1679

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【多线程】探索Java中的多线程编程

标题&#xff1a;探索Java中的多线程编程 摘要&#xff1a; Java是一种广泛使用的编程语言&#xff0c;具有强大的多线程编程能力。本文将深入探讨Java中的多线程编程&#xff0c;包括线程的创建、同步与互斥、线程池的使用以及常见的多线程编程模式。通过示例代码和详细解释&…...

【算法题】翻转对

题目&#xff1a; 给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 你需要返回给定数组中的重要翻转对的数量。 示例 1: 输入: [1,3,2,3,1] 输出: 2 示例 2: 输入: [2,4,3,5,1] 输出: 3 注意: 给定数组的长…...

适用于 Mac 或 Windows 的 4 种最佳 JPEG/PNG图片 恢复软件

您的计算机或外部存储驱动器上很可能有大量 JPEG /PNG图片照片&#xff0c;但不知何故&#xff0c;您意识到一些重要的 JPEG /PNG图片文件丢失或被删除&#xff0c;它们对您来说意义重大&#xff0c;您想要找回它们. 4 种最佳 JPEG/PNG图片 恢复软件 要成功执行 JPEG /PNG图片…...

位置信息API

位置信息API 一、获取当前位置&#xff1a;wx.getLocation(object)二、选择位置&#xff1a;wx.chooseLocation(object)三、打开位置&#xff1a;wx.openLocation(object)四、监听位置事件五、地图组件控制API六、收货地址API&#xff1a;wx.chooseAddress(object) 一、获取当前…...

MySQL——九、SQL编程

MySQL 一、触发器1、触发器简介2、创建触发器3、一些常见示例 二、存储过程1、什么是存储过程或者函数2、优点3、存储过程创建与调用 三、存储函数1、存储函数创建和调用2、修改存储函数3、删除存储函数 四、游标1、声明游标2、打开游标3、使用游标4、关闭游标游标案例 一、触发…...

threejs(4)-纹理材质高级操作

一、纹理重复_缩放_旋转_位移操作 // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; // 导入lil.gui import { GUI } from "three/examples/jsm/l…...

Redis | 数据结构(01)

这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库&#xff0c;使得所有的操作都在内存上进行之外&#xff0c;还有一个重要因素&#xff0c;它实现的数据结构&#xff0c;使得我们对数据进行增删查改操作时&#xff0c;Redis 能高效的处理。 因此&#xff0c;这次我…...

一文详解多模态大模型发展及高频因子计算加速GPU算力 | 英伟达显卡被限,华为如何力挽狂澜?

★深度学习、机器学习、多模态大模型、深度神经网络、高频因子计算、GPT-4、预训练语言模型、Transformer、ChatGPT、GenAI、L40S、A100、H100、A800、H800、华为、GPU、CPU、英伟达、NVIDIA、卷积神经网络、Stable Diffusion、Midjourney、Faster R-CNN、CNN 随着人工智能技术…...

debian 10 安装apache2 zabbix

nginx 可以略过&#xff0c;改为apache2 apt updateapt-get install nginx -ynginx -v nginx version: nginx/1.14.2mysql 安装参考linux debian10 安装mysql5.7_debian apt install mysql5.7-CSDN博客 Install and configure Zabbix for your platform a. Install Zabbix re…...

Qt之菜单栏、工具栏、状态栏介绍及工具栏QAction的动态增删显示实现方式

目的 端应用程序或者编辑器基本都支持工具栏快捷功能的动态增删&#xff0c;即通过在菜单栏上打钩就可以在工具栏上看到相应功能的快捷按钮&#xff0c;取消打钩则在工具栏上就移除了该功能的快捷按钮。那么Qt如何实现这个功能&#xff0c;本篇目的就是记录实现此功能的方法及思…...

十四天学会C++之第八天:文件操作

1. 文件的打开和关闭 文件操作的基本概念。打开文件&#xff1a;使用fstream库打开文件以供读写。关闭文件&#xff1a;确保文件在使用完毕后正确关闭。 文件的打开和关闭&#xff1a;C 文件操作入门 在C编程中&#xff0c;文件操作是一项重要的任务&#xff0c;可以读取和写…...

基于(N-1)×(N-1)棋盘的解的情况推出N×N棋盘的解的情况的N皇后问题

N皇后问题是一个比较经典的问题&#xff0c;其主要目标是在NN的棋盘上&#xff0c;放置N个皇后&#xff0c;要求所有皇后之间不能互相攻击&#xff0c;即任意两个皇后不能处在同一行、同一列或同一对角线上。解决该问题可以采用递归的方式&#xff0c;基于(N-1)棋盘的解的情况推…...

Vue mixin混入

可以把多个组件中共有的配置提取出来构成一个混入。 一、配置混入 &#xff08;一&#xff09; 创建mixin.js 这里的名字可以自定义&#xff0c;但是为了方便识别&#xff0c;多数场景下都写mixin。 mixin.js 要创建在src目录下&#xff0c;与main.js平级&#xff1a; &…...

基于 FFmpeg 的跨平台视频播放器简明教程(十):在 Android 运行 FFmpeg

系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;一&#xff09;&#xff1a;FFMPEG Conan 环境集成基于 FFmpeg 的跨平台视频播放器简明教程&#xff08;二&#xff09;&#xff1a;基础知识和解封装&#xff08;demux&#xff09;基于 FFmpeg 的跨平台视频…...

正点原子嵌入式linux驱动开发——Linux LCD驱动

LCD是很常用的一个外设&#xff0c;通过LCD可以显示绚丽的图片、界面等&#xff0c;提交人机交互的效率。STM32MP1提供了一个LTDC接口用于连接RGB接口的液晶屏。本章就来学校一下如何在Linux下驱动LCD屏。 LCD和LTDC简介 LCD简介 这里在当时学习stm32裸机开发的时候就学过了…...

2-Java进阶知识总结-6-多线程

文章目录 多线程--基本概念并发和并行进程和线程多线程 多线程--实现方式一&#xff0c;继承Thread类方法介绍实现步骤注意事项 方式二&#xff0c;实现Runnable接口Thread构造方法实现步骤 方式三&#xff0c;实现Callable接口方法介绍实现步骤 三种多线程实现方法对比 多线程…...

openwrt下游设备在校园网(DLUT-LingShui)中使用ipv6网络

背景&#xff1a;校园网最多支持6台设备的无感认证&#xff0c;需要使用路由器(本人使用openwrt系统)为更多的设备提供网络&#xff0c;但校园网分配的ipv6地址子网为/128&#xff0c;不能为路由器下的设备分配全球ipv6地址&#xff0c;因此需要使用nat6转发下游设备的局域网ip…...

10个基于.Net开发的Windows开源软件项目

1、基于.NET的强大软件开发工具 一个基于.Net Core构建的简单、跨平台快速开发框架。JNPF开发平台前后端封装了上千个常用类&#xff0c;方便扩展&#xff1b;集成了代码生成器&#xff0c;支持前后端业务代码生成&#xff0c;满足快速开发&#xff0c;提升工作效率&#xff1b…...

Java多线程秘籍,掌握这5种方法,让你的代码优化升级

介绍5种多线程方法&#xff0c;助您提高编码效率&#xff01; 如果您的应用程序与那些能够同时处理多个任务的应用程序相比表现不佳&#xff0c;很可能是因为它是单线程的。解决这个问题的方法之一是采用多线程技术。 以下是一些可以考虑的方法&#xff1a; 线程&#xff08;…...

npm install报错 缺少python

报错信息&#xff1a; Building:E:tolsnvmnodesnodeexe : ode emos ant-desig-we-eos odemodules node-gypbintnode-gp.s rebld -verbose -Libsass_ext --Libsas_cflags- lags --libsass_librarygyp info it worked if it ends with ok gyp verb cli [ gyp verb cliE: toolsnv…...

达梦:开启sql日志记录

前言 开启sql日志记录&#xff0c;可协助排查定位数据库问题。生产开启会有一定的性能消耗&#xff0c;建议打开 SQL 日志异步刷盘功能 1.配置sqllog.ini文件 sqllog.ini 用于 SQL 日志的配置&#xff0c;当且仅当 INI 参数 SVR_LOG1 时使用。 运行中的数据库实例&#xff0c;可…...

C语言开发,指针进阶,字符串查找,包含,拼接

文章目录 C语言开发&#xff0c;指针进阶。1.字符串与指针的关系2.指针获取字符串具体内容3.字符串比较&#xff0c;查找&#xff0c;包含&#xff0c;拼接4.字符串大小写 C语言开发&#xff0c;指针进阶。 1.字符串与指针的关系 // // Created by MagicBook on 2023-10-22. …...

PyCharm中文使用详解

PyCharm是一个Python IDE&#xff0c;可以帮助程序员节省时间&#xff0c;提高生产力。那么具体怎么用呢&#xff1f;本文介绍了PyCharm的安装、插件、外部工具、专业功能等&#xff0c;希望对大家有所帮助。 之前没有系统介绍过PyCharm。如何配置环境&#xff0c;如何DeBug&a…...

一键同步,无处不在的书签体验:探索多电脑Chrome书签同步插件

说在前面 平时大家都是怎么管理自己的浏览器书签数据的呢&#xff1f;有没有过公司和家里的电脑浏览器书签不同步的情况&#xff1f;有没有过电脑突然坏了但书签数据没有导出&#xff0c;导致书签数据丢失了&#xff1f;解决这些问题的方法有很多&#xff0c;我选择自己写个chr…...

在Go项目中二次封装Kafka客户端功能

1.摘要 在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafk…...