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

环境准备

安装依赖

设置 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
作者分享
提到用 Rust 重写项目,很多人的第一反应往往是性能提升。以 Bun 为例,它最初主要采用 Zig 开发,后来在 2026 年发布的 v1.4 版本中将核心代码迁移到了 Rust。用 Rust 重写,性能、安全性往往是大家想要的,但是有没有想过用 Rust 重写还能发现 bug 呢? pgrust 这个项就是,他用 Rust 重新实现 PostgreSQL,保持通信协议和 SQL 方言兼容。为了确认新系统的行为和原版一致,开发者需要对着 PostgreSQL 的实际返回逐个比对。结果查着查着,有些异常不是新代码的锅,PostgreSQL 自己就是这样的。pgrust 开发者 Michael Malis 把其中几个报告给了 PostgreSQL 社区。 大概的问题: 1)SP-GiST 空间索引里有个函数判断点的方位,代码认为上、下、同一水平线三种情况已经穷尽了,末尾放了句「impossible case」兜底。结果在特定浮点边界附近,三种判断同时不成立,程序真走进了这个「不可能」的分支 2)日期格式缓存复用时,一个解析模式的标记没重置,导致同一条 JSONPath 查询在同一个会话里,换个执行顺序结果就不一样。 3)pgcrypto 的 crypt() 在某些输入下截断了多字节字符,返回的文本编码不合法。能存进去,但 pg_dump 导出时就炸了。 一个用 Rust 重写的新项目,测着测着,把运行了几十年的 PostgreSQL 里埋着的东西翻了出来。Rust 重写的价值,不一定只在跑得更快、更安全这一件事上。为了做到真正的兼容,开发者得把前人没怎么碰过的边界全走一遍,这个过程本身就在帮原版排雷。
4
ARTS 1025: 唯一字符与同构字符串、省词可能增加阅读负担与重新估算软件的实现成本
5
🎉 1024 程序员节快乐! 祝编程导航里的每一位程序员:offer 多多,薪资翻倍,面试顺利,早日拿下心仪 offer!💻
17
AST:从 Java 代码理解抽象语法树
5
原来维基百科还有专门研究「AI 味」的页面 今天偶然发现一个挺有意思的维基百科页面:https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing,专门整理 AI 写作的典型特征。 里面总结了很多我们平时经常看到的 AI 味,比如喜欢用“值得注意的是”“在当今快速发展的时代”“综上所述”,还有过度使用排比、加粗、列表,以及一些看起来很有道理,实际上没什么信息量的表达。 感觉以后可以定期翻翻这个 wiki,尤其是经常使用 AI 辅助写作的人,应该能从中发现不少所谓的 AI 味。 链接: https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing
5
下载 APP