亿级流量点赞系统本地运行

环境准备

安装依赖

设置 Maven 完成 https://www.codefather.cn/post/1836689783992958977

使用 IDEA 打开项目

image-20241030153859685

选择 Java 版本

image-20241101132905013

选择 Java 21

image-20250508185043476

没有的话可以使用下面的 Download JDK

image-20241114112524129

选择 Java 21

image-20250508185108310

  • 本地没有 JDK 可以直接 Download JDK
  • 本地有 JDK 但是没识别到 Add JDK from disk 选择对应目录即可
  • 选择 Java 21

初始化数据

连接本地 MySQL

image-20241030155405801

image-20241030155543228

点击 Download 下载 driver files

image-20241030155613559

输入账号密码之后点击Test Connection 成功之后直接点击 OK

image-20241030155950071

找到根目录的 sql/create_table.sql

image-20250506084758065

image-20250506085020304

执行成功后

image-20250506085521723

安装 Docker Desktop

从官网 https://www.docker.com 下载对应自己系统版本的 Docker Desktop

image-20250506090601075

双击下载下来的 Docker Desktop Installer.exe -> 点击 OK 之后就安装成功

image-20250506111120399

相关环境

pulsar

1、打开安装好的 Docker Desktop

2、打开 Terminal

image-20250506111450548

3、输入下面的命令

▼
text
复制代码
docker run hello-world

Snipaste_2025-05-06_11-27-55

4、确保 hello-world 跑通,再运行

▼
text
复制代码
docker run -d -it --name pulsar -p 6650:6650 -p 8080:8080 docker.1panel.live/apachepulsar/pulsar:4.0.3 bin/pulsar standalone

image-20250508191427163

5、启动成功

启动成功之后可与在 Containers 里面找到正在运行的 pulsar

image-20250508191458078

6、校验是否启动成功

▼
text
复制代码
curl http://localhost:8080/admin/v2/brokers/health

会有返回值 OK 有的话就启动成功🤩

image-20250506185941357


BUG

1、如果遇到 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:6650 -> 127.0.0.1:0: listen tcp 0.0.0.0:6650: bind: An attempt was made to access a socket in a way forbidden by its access permissions.****

1)把 winnat 关掉 (PS 需要使用管理员权限)

image-20250506115303147

image-20250506115212044

▼
text
复制代码
net stop winnat

2)再次执行 docker run

▼
text
复制代码
docker run -d -it --name pulsar -p 6650:6650 -p 8080:8080 docker.1panel.live/apachepulsar/pulsar:4.0.3 bin/pulsar standalone

3)最后可以再次开启 winnat

▼
text
复制代码
net start winnat

2、解决办法:不限制 pulsar 的内存,我出现这个 BUG 的场景是限制内存导致的

▼
text
复制代码
Caused by: javax.ws.rs.InternalServerErrorException: HTTP 500 {"reason":"\n --- An unexpected error occurred in the server ---\n\nMessage: Topic creation encountered an exception by initialize topic policies service. topic_name=persistent://public/functions/assignments error_message={\"errorMsg\":\"Bookie handle is not available - ledger=2 - operation=Failed to read entry - entry=0\",\"reqId\":845559152753469356, \"remote\":\"localhost/127.0.0.1:6650\", \"local\":\"/127.0.0.1:47776\"}\n\nStacktrace:\n\norg.apache.pulsar.broker.service.BrokerServiceException$ServiceUnitNotReadyException: Topic creation encountered an exception by initialize topic policies service. topic_name=persistent://public/functions/assignments error_message={\"errorMsg\":\"Bookie handle

TiDB

编写 Docker-Compose

1、首先复制下面的内容到任意目录(无中文、无空格)的路径下命名为 docker-compose.yml

▼
yml
复制代码
version: "3.8" networks: backend: driver: bridge services: tidb: image: docker.1panel.live/pingcap/tidb:latest container_name: tidb ports: - "4000:4000" # TiDB MySQL 协议端口 - "10080:10080" # TiDB HTTP 状态端口 networks: - backend mysql: image: docker.1panel.live/library/mysql:8.0 container_name: mysql environment: MYSQL_ROOT_PASSWORD: rootpwd ports: - "3307:3307" # 为了防止和本地 MySQL 端口使用了 3307 冲突 networks: - backend depends_on: - tidb

image-20250507213504096

2、打开 docker desktop 的 Terminal

image-20250507214032206

进入到对应的目录(看自己的 docker-compose.yml 具体的路径)

image-20250507213913284

执行

▼
text
复制代码
docker-compose up -d

成功后的效果

image-20250507214315345

3、验证是否启动成功,可以在 containers 里面找到启动成功

image-20250507214448318

3、使用 docker-desktop 进入到 MySQL 之中

image-20250507214648590

选择 Exec

image-20250507214707302

输入下面命令连接 TiDB,可以发现连接成功🤩🤩🤩

▼
text
复制代码
mysql -h tidb -P 4000 -uroot

image-20250507215003878

设置远程连接用户

登录到 TiDB(用 root)

▼
text
复制代码
mysql -h tidb -P 4000 -uroot

在 SQL 提示符下,执行(假设你希望密码为YourPass123):

▼
text
复制代码
-- 1) 创建用户(如果已存在可改用 ALTER USER) CREATE USER IF NOT EXISTS 'leikooo'@'%' IDENTIFIED BY 'YourPass123'; -- 2) 授权:给这个用户对所有库的所有表的所有权限 GRANT ALL PRIVILEGES ON *.* TO 'leikooo'@'%'; -- 3) 刷新权限(TiDB 会自动生效,但加上也无妨) FLUSH PRIVILEGES;

image-20250507215515249

退出,再用新用户+密码连接:

退出 TiDB 输入 exit 即可

▼
text
复制代码
mysql -h tidb -P4000 -u leikooo -pYourPass123

这里 YourPass123 就是设置的密码

image-20250507215639968

IDEA 尝试连接

使用 IDEA 自带的 Data Sources 进行尝试链接

image-20250507215831322

注意⭐ 端口是 4000 !

image-20250507220052437

6、至此完成,服务器上安装 TiDB 也是同理

迁移 MySQL 数据

1、导出 MySQL 的数据

image-20250507224313099

选择自己 myqldump.exe 的位置

image-20250507225401846

如果不知道的话可以下载「Everything」

image-20250507230125360

生成成功之后会有弹窗,点击就可以直接到对应文件

image-20250507230324195

2、导入数据到 TiDB

1)首先手动创建数据库 thumb_db

▼
text
复制代码
-- 创建库 create database if not exists thumb_db;

image-20250507230554177

创建成功

image-20250507230629184

2)插入数据,选择刚才生成的 sql

image-20250507230742541

选择对应路径然后点击 OK 即可

image-20250507230830839

执行成功

image-20250507230901087

image-20250507230947585

可观测相关

Redis 指标监控

1) redis.addr 如果是本地一般是 redis://host.docker.internal:6379

2)如果 redis 没有设置密码那么可以去掉 --redis.password=xxx

▼
dockerfile
复制代码
docker run --name redis-exporter -d -p 9121:9121 docker.1panel.live/oliver006/redis_exporter --redis.addr=redis://host.docker.internal:6379 --redis.password=xxx

这里直接指定了前缀去 docker.1panel.live 镜像拉取 oliver006/redis_exporter 加快下载速度

image.png

2、启动成功之后可以在 containers 里面找到 redis-exporter

image-20250508104829921

3、测试效果

访问:http://localhost:9121

image-20250508105259107

prometheus

1、创建 prometheus.yml 这个文件

1)host.docker.internal:9199 表示请求宿主机自己的服务的后端,如果部署到服务器上就改成服务器对应的地址

2)host.docker.internal:9121 表示请求宿主机自己的服务的 Redis ,如果是服务器就改成服务器对应的地址

▼
yml
复制代码
global: scrape_interval: 15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'codelab-monitor' # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'biz' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s metrics_path: '/api/actuator/prometheus' static_configs: - targets: ['host.docker.internal:9199'] labels: group: 'thumb' - job_name: 'redis' scrape_interval: 5s static_configs: - targets: ['host.docker.internal:9121']

2、把上面的文件复制到桌面上(或者任意非中文、无空格的目录上即可)

image-20250508110841508

3、启动 prometheus

1)进入到包含 prometheus.yml 的路径下(输入 ls 命令如下图所示)

image-20250508111142024

2)输入下面命令

Linux\Mac 可以这样写

▼
text
复制代码
docker run -d --name prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml docker.1panel.live/prom/prometheus

Windows 需要写 prometheus.yml 的绝对路径(路径需要参考自己实际的路径)

▼
text
复制代码
docker run -d --name prometheus -p 9090:9090 -v C:\Users\leikooo\desktop\prometheus.yml:/etc/prometheus/prometheus.yml docker.1panel.live/prom/prometheus

image-20250508173327913

4、查看效果

访问:http://localhost:9090

image-20250508174252690

如果有 DOWN 的情况就确保

1)启动了 Redis 指标监控

2)启动了后端服务且后端端口是 9199

grafana

1、打开 docker desktop 的 Terminal 运行下面的代码

▼
text
复制代码
docker run -d --name grafana -p 3000:3000 docker.1panel.live/grafana/grafana-enterprise

2、查看效果

访问:http://localhost:3000/login

默认账号密码都是:admin

官方文档:https://grafana.com/docs/grafana/latest/setup-grafana/sign-in-to-grafana/

image-20250508174546580

剩下的添加数据源的操作可以参考「9-架构优化:系统可观测性优化」

环境内存占用参考

当然可以进行限制内存大小

▼
text
复制代码
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS bacc0434d260 prometheus 0.04% 69.4MiB / 7.567GiB 0.90% 8.53MB / 12.4MB 0B / 0B 26 d407016ca4ef pulsar 1.74% 2.364GiB / 7.567GiB 31.24% 35.7kB / 28.1kB 0B / 0B 344 82b3bb45428e grafana 0.19% 114.9MiB / 7.567GiB 1.48% 22.9MB / 17.9MB 0B / 0B 24 d25e5e2665af redis-exporter 0.00% 17.88MiB / 7.567GiB 0.23% 196kB / 890kB 0B / 0B 15 3082643eff7b mysql 0.35% 370.9MiB / 7.567GiB 4.79% 1.22kB / 126B 0B / 0B 37 73f86948e25e tidb 1.95% 445.4MiB / 7.567GiB 5.75% 426kB / 427kB 0B / 0B 19

MySQL 后面可以删除,但是删除之后就无法操作

image-20250508181030327

修改配置文件

如果要使用 TiDB 的话 修改为对应的 TiDB 连接地址和端口,例如 jdbc:mysql://127.0.0.1:4000/thumb_db

如果使用 MySQL 修改为对应的 MySQL 连接地址和端口,例如 jdbc:mysql://127.0.0.1:3306/thumb_db

▼
yml
复制代码
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:4000/thumb_db username: root password: 123456

启动

1、最终启动

  • 启动 pulsar
  • 启动 TiDB
  • 可观测相关的不启动也可以运行成功

image-20250508185452180

2、打开接口文档 http://localhost:9199/api/doc.html 进行测试

image-20250507231234434

测试点赞

image-20250508183728457

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
leikooo
作者分享
最近看了一个视频叫「被 Vibe Coding 抚平的大脑褶皱,还能救回来吗?」,聊的是 AI 时代学编程的困境,感觉说的挺好的,给鱼友们分享一下。 视频中提到现在学编程和以前最大的区别是,以前卡住了你只能自己想、查文档、翻 Stack Overflow,这个过程虽然痛苦,但你的脑子确实在转。现在有了 AI,卡住的第一反应就是打开 ChatGPT 问一句,代码瞬间就出来了,跑通了,感觉自己搞定了。但问题是,你的大脑在这个过程中几乎没有参与。视频里提到一个实验,有个学生读完题 10 秒钟就放弃思考去问 AI 了,事后还觉得是自己独立完成的。这就是 AI 带来的最大陷阱——你以为自己在学,其实只是在看AI 表演。 视频基于一项研究,总结了学编程时容易掉进去的 8 种思维陷阱。研究表明光是知道这些陷阱的存在,就能明显提升学习效果。前 5 种是编程学习中一直存在的,后 3 种是 AI 时代新出现的: 1)Forming(构建错误):你理解了问题,但用了错误的方法去解决。比如题目要你判断正数多还是负数多,你写了个求和的逻辑,方向对了路走偏了。 2)Dislodging(思维固着):你已经意识到方法不对,但就是转不过弯来换思路,反复在错误的方向上修修补补。 3)Assumption(假设偏差):你完美地解决了一个问题,但不是题目要求的那个问题。比如题目要处理任意个数字,你只处理了四个。4)Location(定位缺失):跳过了关键步骤就开始写代码,感觉快写完了,测试的时候才发现漏了循环或数据结构这种核心东西,得大改。 5)Achievement(成就幻觉):写了一大堆代码,明知道有问题但不愿意推倒重来,总想着再改改就好了,结果越改越乱。 6)Progression(进度错觉):AI 帮你写出了超出你水平的代码,作业都能交,但基础可能已经落后好几周了,自己完全不知道。这个是最危险的,等到面试或者独立写代码的时候才发现脑子里是空的。 7)Interruption(思维中断):你正在集中精力思考,AI 自动补全突然弹出来一段代码,思路直接被打断。有意思的是实验中表现好的学生大多直接忽略了 AI 的补全建议。 8)Mislead(误导跟随):信了 AI 给的一个看似合理但方向错误的建议,白白浪费时间走弯路。 大佬给出的建议是,遇到问题先别急着问 AI,给自己至少五分钟独立思考。卡住、沮丧、想摔键盘,这些不是你学不会的信号,这就是解决问题时的正常感受。AI 生成的代码跑通之后,试着关掉 AI 自己从零写一遍,能写出来才算真的会了。最重要的是分清场景,工作赶进度可以用 AI 提效,但练习和学习的时候请把「拐杖」放下,自己走。别让 AI 替你长脑子。
7
ARTS 0927: 单栈逐层展开嵌套字符串、包管理器与 Agent 沙箱本质同源与单次前向传播复刻极速决策模型
7
祝编程导航的鱼友们中秋快乐,愿代码顺利、生活如意,月圆人团圆,所愿皆可期!
13
ARTS 0913: 双栈互补实现队列、CIDR 聚合化解路由膨胀与 AI 作弊串通绝非偶然 Bug
8
微信爆出 P0 级漏洞😱,接到来电就中招,碰都不用碰手机。 怎么中招的? 黑客只需要是你的微信好友,然后给你打一个语音或视频通话,好了已经搞定了,你已经被黑了。 有多离谱? 完全不需要接这个电话。手机锁着屏扔在桌上,你看都没看一眼,只要响了几秒钟,恶意代码就已经在后台跑起来了。 黑客瞬间拿下你整个微信:翻你聊天记录、看你隐私、用你的身份给别人发消息。 更恐怖的是,你的微信紧接着会变成"丧尸",黑客可以自动给通讯录里所有好友挨个打电话,把他们也感染一遍。每个受害者又立刻变成新的传播者,像病毒一样指数级扩散...,不敢想象如果被利用了,理想情况下那需要多久就能扩散到全国的用户呢?30 分钟左右 好消息是这个 bug 微信团队已经知道了这个 bug ,坏消息这个 bug 好像不是微信团队发现的 文章来源:https://calif.io/research/weworm
7
下载 APP