springboot第44集:Kafka集群和Lua脚本

news2024/12/28 4:57:56
  1. servers:Kafka服务器的地址。这是Kafka集群的地址,生产者将使用它来发送消息。

  2. retries:在消息发送失败时,生产者将尝试重新发送消息的次数。这个属性指定了重试次数。

  3. batchSize:指定了生产者在发送消息之前累积的消息大小(以字节为单位)。一次性发送多个消息可以提高性能。

  4. linger:指定了生产者在发送消息之前等待的时间(以毫秒为单位)。这可以帮助在一起发送多个消息以减少网络开销。

  5. bufferMemory:指定了生产者用于缓冲等待发送的消息的内存大小(以字节为单位)。

这是一个自定义注解 @Log,用于在方法上进行注解。以下是对该注解的逐行详细说明:

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    /** 标题 */
    public String title() default "";

    /** 功能 */
    public BusinessType businessType() default BusinessType.OTHER;
}

这个自定义注解的作用如下:

  • @Target({ElementType.PARAMETER, ElementType.METHOD}): 指定了可以在方法和方法参数上使用这个注解。

  • @Retention(RetentionPolicy.RUNTIME): 指定了这个注解在运行时保留,这样它可以在运行时被反射读取。

  • @Documented: 表示这个注解应该被包含在JavaDoc中。

注解元素:

  • public String title() default "": 这是一个注解元素,用于指定日志的标题。默认值为空字符串,可以通过注解时指定。

  • public BusinessType businessType() default BusinessType.OTHER: 这是一个注解元素,用于指定日志的业务类型。默认值为 BusinessType.OTHER,表示其他业务类型。可以通过注解时指定不同的业务类型。

这个自定义注解可以用于方法上,以帮助描述方法的功能和业务类型,通常用于日志记录或其他相关的操作。在使用时,可以为方法添加 @Log 注解,并指定标题和业务类型。例如:

@Log(title = "用户登录", businessType = BusinessType.LOGIN)
public void userLogin() {
    // 方法实现
}

在这个示例中,方法 userLogin 被标记为登录操作,并指定了相关的标题。这有助于记录日志和监控应用程序的操作。

Spring Framework 通过 @Autowired 注解来自动装配这些依赖,从而减少了手动配置和依赖管理的工作。

Redis Lua脚本,通常用于在Redis中执行原子操作。这个脚本的主要作用是递增存储在Redis中的一个键的值,并在第一次递增时设置过期时间。以下是脚本的主要步骤:

  1. current变量:首先,脚本声明了一个本地变量current,用于存储键的当前值。

  2. redis.call("incr", KEYS[1]):这一行执行了一个Redis原子操作,即将键KEYS[1]的值递增1,并返回递增后的值,该值被存储在current变量中。

  3. if tonumber(current) == 1 then:接下来,脚本检查current的值是否等于1。这是为了判断是否是第一次递增。tonumber(current)用于将current的值转换为整数,以便进行比较。

  4. 如果current的值等于1,表示第一次递增,那么脚本会执行以下操作:

  • redis.call("expire", KEYS[1], KEYS[2]):设置键KEYS[1]的过期时间为KEYS[2],即设置键在一定时间后过期。

最后,脚本返回current的值,这是递增后的值。

总的来说,这个脚本用于实现一个计数器,每次调用时递增,但仅在第一次递增时设置过期时间。这种模式常用于执行某些操作的限制或计时器功能。

这个Lua脚本的主要作用是在Redis中实现一个计数器,同时在第一次递增时设置键的过期时间。通常,这种功能可以用于限制用户在一段时间内执行某个操作的次数,或者用于实现一个短期有效的计数功能。

示例1:限制用户发送短信的次数

假设你想要限制用户在一分钟内只能发送一次短信,你可以使用这个Lua脚本。脚本会递增计数,如果用户在一分钟内已经发送了一次短信,那么后续请求将返回0,表示不允许再发送。

local current
current = redis.call("incr", KEYS[1])
if tonumber(current) == 1 then
    redis.call("expire", KEYS[1], KEYS[2])
end
return current

示例2:计时器

你可以使用这个脚本来实现一个简单的计时器,以记录某个事件的发生次数。例如,你可以记录一小时内某个事件发生的次数。

local current
current = redis.call("incr", KEYS[1])
if tonumber(current) == 1 then
    redis.call("expire", KEYS[1], 3600)  -- 设置过期时间为1小时
end
return current

在这两个示例中,脚本首先尝试递增计数,然后在第一次递增时设置过期时间。如果计数超过一定限制,后续请求将返回已达到限制的标志,不再允许递增。这可以用于实现许多不同类型的计数和限制功能。

  1. 使用 registry.addMapping("/**") 配置跨域设置,表示针对所有的路径都应用相同的 CORS 配置。

  2. .allowCredentials(false) 指定不允许发送凭证信息,例如 cookies。这表示客户端的请求不包含敏感凭证。

  3. .allowedOrigins("*") 允许来自任何源(包括不同域名或 IP 地址)的请求。使用 "*" 表示允许来自任何源的请求。

  4. .allowedHeaders("*") 允许所有的请求头,这意味着客户端可以发送任意请求头到服务器。

  5. .allowedMethods("GET", "PUT", "POST", "DELETE") 指定允许的 HTTP 方法,这里配置了常见的 GET、PUT、POST 和 DELETE 方法。

  6. .exposedHeaders("*") 暴露所有响应头给客户端,允许客户端访问所有响应头信息。

消息队列是为了解决消息间通信繁忙而诞生的,体现了解耦和异步的实现
为了解决消息间通信繁忙的问题,我们可以理解为引入了一个中间件(消息队列),发送方在发送信息的时候,不是直接发送到接收方,而是发送信息到中间件,接收方通过中间件获取自己想要的信息。
在这个过程中,我们可以把发送方理解为生产者,接收方认为是消费者。
生产者发布信息,消费者订阅信息(通过中间件)
引出一个问题,消费者如何拿到自己想要的数据,这个问题的解决方法就是主题(topic),生产者将不同主题的信息发布到中间件(kafka)中,消费者通过订阅不同的主题来消费自己想要的数据
在主题下面会有分区,分区可以实现分布在不同的服务器上,生产者将数据存储在主题下的不同分区里面
两种模式:1.生产者指定分区 2.分区器(一个算法)通过消息的键(一个标记)来安排数据的存储空间

我们现在可以知道一条消息可能带有以下几个数据:1.主题 2.分区 3.键 4.值(想传送的数据)

那消费者如何读取数据呢?引出偏移量
偏移量(offset):第几个
一个分区里面,每个消息的偏移量都是唯一的
消费者只能顺序读取

这样的话我们就实现了一个borker,borker里面包含主题,分区、
borker为传来的消息根据分区设置偏移量,将其存储在磁盘上,borker也为消费者提供服务,提供响应。
多个Borker集群就是kafka集群,这样就提供了消息的安全性。在这个集群中可能还会有一个集群负责控制器的角色。

bec3eee0402275009ddc9fa09f795867.png
image.png
310897678f65fb9f1b8fb276ea047386.png
image.png
ad55ee03e920dea2b3df0254fdc69e1f.png
image.png
a9760ccfb53724154ff885b94eba0f36.png
image.png
bfe71f4d0006e51356ee7039a239f5bf.png
image.png
888599616b25f24b0a988abe20abe4de.png
image.png
37459d5c1757dfb033be9b5ea51fb4a2.png
image.png
ae7a99fd4cdaded52ec30fb14dce84fb.png
image.png
1b23eac09cf9c76d0e8ecd711f4c34e3.png
image.png
02341edf17cd8a3adc7086acb680983d.png
image.png
850b52741d3f8e2c6a2c219f6ec18a9f.png
image.png
0f5ea2a7b69d696b76f5e8e0010ca275.png
image.png
3ddccd69bb59481b91969046a5c99a31.png
image.png

第一步:vi ~/.zshrc
第二步:按 i 进行输入
添加:source ~/.bash_profile
第三步:按esc 输入: :wq 进行保存退出

MQTT(消息队列遥测传输)是一种网络协议(长连接,意思就是除了客户端可以主动向服务器通信外,服务器也可以主动向客户端发起),也是基于TCP/IP的,适用于算力低下的硬件设备使用,基于发布\订阅范式的消息协议

275de7c6dba6ad413a1d45d6e4c580db.png
image.png
d29956f0495102cd8ec2ff42ce221c6c.png
image.png

Arduino IDE(集成开发环境)是一个用于开发Arduino(一种开源硬件平台)的集成开发环境。Arduino 是一种基于开源硬件和软件的电子原型平台,旨在帮助电子爱好者、学生和专业开发人员快速、轻松地创建各种交互式电子项目。Arduino IDE 用于编写、上传和运行Arduino代码,并与Arduino板上的硬件进行交互。

Arduino IDE 提供了以下主要功能:

  1. 代码编写:您可以使用Arduino IDE编写Arduino的程序代码,这些代码通常使用C/C++语言编写。

  2. 代码编辑:IDE包含代码编辑器,具有语法高亮显示、代码自动完成和调试功能,使编写代码更加容易。

  3. 上传代码:一旦您编写了Arduino代码,可以将它们上传到Arduino开发板上,以便实际运行代码并控制硬件。

  4. 硬件交互:Arduino IDE允许您与Arduino开发板上的各种传感器、执行器和其他外围设备进行交互,以创建各种物联网、嵌入式系统和电子艺术项目。

  5. 库管理:Arduino社区为常见的硬件和传感器提供了大量库,这些库可通过IDE进行管理和导入,以便轻松使用这些硬件组件。

  6. 调试和监控:Arduino IDE提供了一些基本的调试和监控工具,帮助您检查代码的执行和硬件的状态。

  7. 项目管理:IDE允许您管理多个项目,以便组织和跟踪不同的Arduino应用程序。

7844f9ba69c8f2167e7290c34d36f464.png
image.png

如果你是 ECS 云主机,点击实例>点击你的服务器名>安全组>配置规则>手动添加

添加这么一条即可:

340cbe3205f48137772fedc19d25f771.png
image.png

如果你是轻量服务器,点击安全>防火墙>添加规则 即可,跟ECS设置大差不差。

3是准备给前端页面用的 ,2是给后端用的,1是我个人自留的超级用户,wemos是设备用的,即上面设备连接时输入的用户名密码。

2f356ceb3fff595849fd6f6502efa13c.png
image.png
bead396119c3106cc456090977d9fcb6.png
image.png

1883(mqtt默认端口)开启的,当然,和开启18083的方法一样。

  • 1804 websockets 默认端口

  • 3306 mysql默认端口

  • 1803

当你开启完成后,再次尝试使用mqttx连接broker,会发现可以连接了

4cd132b3f2762af4c3ba7ebdcb752d95.png
image.png

左侧添加订阅,右侧的聊天框里会出现该topic的消息

4253d1b6d01a82e6aed3c9a2e775c30d.png
image.png

在loop中每一秒向 home/status/ 发送一条设备在线的提示

设备、服务器、emqx控制台已经跑通了。

前端不必多说,我们使用echarts承载展示数据,由于体量较小,我们不使用任何框架,直接使用jq和echarts实现

<script src="https://cdn.bootcdn.net/ajax/libs/mqtt/4.1.0/mqtt.min.js"></script>
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##
    server {
    listen 80;
    server_name jshub.cn;
    #将请求转成https
    rewrite ^(.*)$ https://$host$1 permanent;
    }
    server {
        listen 443 ssl;
                server_name xxx.cn;
                location / {
                    root /larryzhu/web/release/toolbox;
                    index index.html index.htm;
                    try_files $uri $uri/ /index.html;
                }
     location /mqtt {
           proxy_pass http://localhost:8083;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
         }
        # SSL 协议版本
        ssl_protocols TLSv1.2;
        # 证书
        ssl_certificate /larryzhu/web/keys/9263126_xxx.cn.pem;
        # 私钥
        ssl_certificate_key /larryzhu/web/keys/9263126_xxx.cn.key;
        # ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
        # ssl_ciphers AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256;

        # 与False Start没关系,默认此项开启,此处减少抓包的干扰而关闭
        # ssl_session_tickets off;

        # return 200 "https ok \n";
  }

如果数据量超过43200(每两秒插入一条,这是一天的量)条,调用存储过程删除最早的一条数据

693f5b29178b9f4fa9791c92bfb951c5.png
image.png
a432efa34ed2d24d15fa3b71b0e42614.png
image.png

打开EMQ云服务器的控制台“**http://127.0.0.1:18083[1]”,初次登录的默认用户名是“admin”,密码是“public”**

./emqx start

EMQX云服务器是自带客户端调试功能面板的,在工具 —> WebSocket中即可进行简单的消息发布及订阅测试,MQTT协议是基于发布/订阅模式的轻量级传输协议

MQTT协议消息的订阅是需要包括消息的主题和服务质量的,消息的主题即“发送该消息的一个标签”,服务质量包括0、1、2,具体见下表:

Qos值Bit2Bit1描述
000最多分发一次
101至少分发一次
210只分发一次

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

参考资料

[1]

http://127.0.0.1:18083: https://link.juejin.cn/?target=http%3A%2F%2F127.0.0.1%3A18083

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.scala辅助构造器与为构造函数提供默认值(一)

概述 本文主要说明: 辅助构造器 与 为构造函数提供默认值 的使用 辅助构造器为构造函数提供默认值 相关链接 阅读之前&#xff0c;可以浏览一下 scala相关文章 辅助构造器 可以通过定义名为this的方法来定义辅助Scala类构造函数。只有几个规则需要了解&#xff1a; 每个辅助…

算法笔记【7】-直接插入排序算法

文章目录 一、简介二、基本原理和实现步骤三、优缺点分析 一、简介 在排序算法中&#xff0c;直接插入排序是一种基本而常用的排序方法。它通过不断将待排序数组中的元素插入到已排序部分的合适位置&#xff0c;逐步构建有序数组。本文将详细介绍直接插入排序算法的原理、实现…

2024王道考研计算机组成原理——总线

6.1 总线概述 每一个外设都通过IO接口和DB、CB、AB相连 三系统总线结构&#xff1a; 桥有总线仲裁的功能&#xff0c;就是把某一总线的使用权分给哪个设备&#xff1f; 6.1.2 总线的性能指标 总线复用&#xff1a;分时传输地址&数据 6.2 总线仲裁 通过控制总线来发送使…

《RT-DETR改进实战》专栏介绍 专栏目录

《RT-DETR改进实战专栏》介绍及目录 介绍&#xff1a;欢迎来到最新专栏《RT-DETR改进实战》&#xff01;这个专栏专注于基于 YOLOv8 项目的魔改版本&#xff0c;而不是百度飞桨框架中的 RT-DETR。 本专栏为想通过改进 RT-DETR 算法发表论文的同学设计。每篇文章均包含完整的改…

使用示例和应用程序全面了解高效数据管理的Golang MySQL数据库

Golang&#xff0c;也被称为Go&#xff0c;已经成为构建强大高性能应用程序的首选语言。在处理MySQL数据库时&#xff0c;Golang提供了一系列强大的库&#xff0c;简化了数据库交互并提高了效率。在本文中&#xff0c;我们将深入探讨一些最流行的Golang MySQL数据库库&#xff…

ImportError: DLL load failed while importing _pyopenvino: 找不到指定的程序

ImportError: DLL load failed while importing _pyopenvino: 找不到指定的程序 完全按照官方的pip安装方式&#xff0c;但是报错 解决方法&#xff1a; 下载下面压缩包 官网下载链接 解压到 运行程序之前 完成&#xff01;&#xff01;&#xff01; 测试 python -c &quo…

思维模型 纳什均衡

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。纳什均衡解释了囚徒困境、智猪博弈、内卷、美苏的军备竞赛等博弈问题。 1 纳什均衡的应用 1.1 经典的 囚徒困境 1 背景 囚徒困境是一个经典的博弈论问题&#xff0c;主要描述了两个被捕的…

第十三章 枚举与泛型

13.1枚举类型 13.1.1 使用枚举类型设置常 设置常量时&#xff0c;通常将常量放置在接口中&#xff0c;这样在程序中直接使用。该常量不能被修改&#xff0c;因为在接口定义常量时&#xff0c;该常量的修饰符为final与static。常规定义常量的代码如下&#xff1a; public int…

Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作

文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊&#xff0c;显卡版本太老&#xff0c;最高也就支持cuda10.2&#xff0c;因此只能安装pytorch1.12.1&…

05、SpringCloud -- 秒杀按钮、秒杀请求流程(各种请求到后台的判断、减库存、下单数据和次数保存)

目录 秒杀按钮代码实现:vue的JS实现:秒杀请求需求:代码前端后端Seckill-apidomainSeckill-serverWebConfig1、秒杀请求判断controller2、重复下单判断MapperService 接口Impl 实现类controller3、库存判断4、秒杀涉及到的操作_01、减库存_02、创建订单对象并保存_03、用户下…

mycat2.X读写分离

一、数据库中间件介绍 二、下载安装包 2.1下载地址: 下载两个一个是mycat程序,一个是mycat的驱动 http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.20.zip http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies-2…

电子邮件钓鱼攻击的防范:如何识别并避免网络诈骗

在数字化的今天&#xff0c;电子邮件成为我们日常工作和生活中不可或缺的通讯工具。然而&#xff0c;电子邮件钓鱼攻击也随之成为网络诈骗的常见手法。通过识别和避免电子邮件钓鱼攻击&#xff0c;我们可以在很大程度上保护自己的网络安全。本文将为您提供一些实用的识别和防范…

nacos在linux中的安装、集群的配置、mysql生产配置

1.下载和安装 官方下载地址&#xff1a;https://github.com/alibaba/nacos/releases&#xff0c;根据自己需要的本版去下载就行 下载的是 .tar.gz 后缀的文件是linux版本的 使用tar命令解压&#xff0c;完成之后是一个nacos的文件夹 和windows下的文件夹目录是一样的 要启…

小黑子—spring:第三章 AOP开发

spring入门3.0 三 小黑子的springAOP开发1. AOP简介1.1 AOP的概念1.2 AOP思想的实现方案1.3 模拟AOP思想实现的基础代码1.4 AOP的相关概念 2. 基于xml配置的AOP2.1 XML方式AOP快速入门2.2 XML方式AOP配置详解2.3 xml方式AOP的原理解析2.3.1 AOP底层两种生成Proxy的方式 3. 基于…

一个老旧优盘从2M变回8G的逆袭之路

前言 最近收拾资料&#xff0c;发现了一个比较老的优盘&#xff0c;上面标记8G内存&#xff0c;就好奇里边存了点啥。用电脑打开&#xff0c;啥内容都没有&#xff0c;结果大小还显示2M&#xff1f;&#xff1f;&#xff1f;看看今天能不能救活吧。 正文 步骤一、清空磁盘 …

并发安全问题之超卖问题

并发安全问题之超卖问题 乐观锁总结&#xff1a; 优点&#xff1a;不加锁性能好。 缺点&#xff1a;同时请求成功率低&#xff08;即只要发现数据变了就放弃了&#xff09;。 乐观锁思想的具体体现&#xff1a;一共两步&#xff0c;第一步&#xff0c;先查询状态。第二步&…

Java VMTranslator Part I

目录 堆栈运算命令 基本思路 核心代码 Parser Code Writer Main 实验结果&#xff0c;使用SimpleAdd、StackTest进行验证 内存访问命令 基本思路 核心代码 Parser Code Writer Main 实验结果&#xff0c;使用进行验证。对比生成的二进制代码文件。 用Java写一个翻…

MySQL6:索引使用原则,联合索引,联合主键/复合主键,覆盖索引、什么是回表?索引条件下推,索引的创建与使用,索引的创建与使用,索引失效

MySQL6&#xff1a;索引使用原则&#xff0c;联合索引&#xff0c;联合主键/复合主键&#xff0c;覆盖索引、什么是回表&#xff1f;索引条件下推&#xff0c;索引的创建与使用&#xff0c;索引的创建与使用&#xff0c;索引失效 索引使用原则列的离散(sdn)度 联合索引创建联合…

【C++初探:简单易懂的入门指南】二

【C初探&#xff1a;简单易懂的入门指南】二 1.引用1.1引用做函数的参数1.2 引用做返回值1.2.1 关于引用做返回值的几点补充 1.3 多引用(对一个变量取多个别名)1.4 引用类型一致性原则以及权限的问题阐述1.5引用的效率问题1.6引用和指针的比较 2.auto关键字2.1 auto关键字的使用…

BSTree二叉树讲解

二叉搜索树的概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值…