MoreRSS

site iconThetbw | 黑羽修改

游戏宅男,后端开发
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Thetbw | 黑羽的 RSS 预览

traefik.me

2025-11-15 22:19:36

traefik.me 是一种通配符域名,可以把类似 xxx.traefik.me 这种域名解析到 xxx 这个 ip 上面。

例如可以使用 192-168-1-1.traefik.me 访问你局域网的 192.168.31.1 这个 ip 地址,为什么要这么脱裤子放屁呢,主要因为直接使用 ip 地址对于浏览器有一系列限制,而且通常你还要加上端口。

对于 traefik.me ,你还可以在前面加上一定区分 ,例如 app1-192-168-1-1.traefik.me,还是解析到 192.168.31.1 这个机器,但是你可以在nginx中对 app1 app2 来反向代理到不同的服务,由于是域名,你还可以使用 acme 实现自动 SSL。

如果你使用 tailscale 就更方便了,本身 tailscale 可以组网,直接用组网的ip,这样你的内网服务就可以在内部各处访问了,不需要折腾太多公网的东西。

例如我的,使用dokploy这个自动部署工具

image.png

service-nekotemplatespringadmindev-cnjau7-cb6638-100-118-61-63.traefik.me 是我写的一个测试服务的地址,这个是 dokploy 随机生成的,前面的一堆都可以不用看,我部署了很多程序,前面的是用来区分是哪个程序的,100-118-61-63 这个是我机器的内网地址,当访问上面的网址时候,dokploy会使用 treafik 路由,反向代理到我部署的 docker 程序,就像下面这样。

http:  routers:    service-nekotemplatespringadmindev-cnjau7-router-26:      rule: Host(`service-nekotemplatespringadmindev-cnjau7-cb6638-100-118-61-63.traefik.me`)      service: service-nekotemplatespringadmindev-cnjau7-service-26      middlewares: []      entryPoints:        - web  services:    service-nekotemplatespringadmindev-cnjau7-service-26:      loadBalancer:        servers:          - url: http://service-nekotemplatespringadmindev-cnjau7:8080        passHostHeader: true

这个使用 nginx 也可以可以实现的。

这样我就可以在任意位置,只要加入了 tailscale 组网,就可以使用上面域名访问我的服务,也不用输入端口,也可以使用 https,因为现在浏览器很多新增功能,为了安全也是要 https 才能支持。

通常支持这个功能的还有 nip.ioxip.io 这种。

补牙-以及最近三两事

2025-11-10 11:46:02

之前就发现自己门牙上旁边有个黑窟窿,可能是蛀牙什么的,上周有时间,就去最近的一个医院看了一下。看了之后发现蛀牙还真不少,总共6个小的,3个大的,反倒是门牙那个很显眼的,医生说不是蛀牙,是什么牙结石之类,后面做了牙周处理。

几个小的蛀牙用树脂填的,大的医生说最好用嵌体,总共花费了7-8千块钱,医保瞬间给我清空了属于是,自己还自费了6千。本来还觉得我的决定还是挺冲动的,没有货比三家去别的医院也看看,或许医生坑我呢,也许有更好的方案,现在觉得也没必要怀疑医生吧。
也是切身体会了电影《Eden》里的那个男主,为什么决定离开城市时候把自己牙全拔光了,牙医真的是现代社会不可或缺的职业呀。

补牙之前需要把蛀牙用那个类似小电钻的东西打磨掉,照片就不放了,看的吓人呢,几个小的牙齿没什么感觉,就是能闻到烧糊的味道,3个严重点的就感觉到一整酸痛的感觉,后面的医生拍的照片可以看出来,牙齿中间被打磨出了一个很深的十字形的坑,全程也是张了很久的嘴,感觉都快脱臼了。医生用3d扫描的设备,给牙齿做了个建模,这3个要做嵌体的,还要等厂家根据3D扫描生产出来才能做,医生说要等下周了,现在先临时用一个绿色的啥玩意填充了一下。

不过说到这个临时填充的,今天早上刷牙我尽然给它刷出来了,不知道吃饭东西会不会卡进这个牙坑里面,后来又用手塞了进去,感觉最近不能吃太刺激的了,毕竟那个坑也是离神经不远了。

补完牙之后又是做的牙周,医生给打了一点镇静计,我也是全程没怎么看,只是感觉医生那什么塞进我的一个个牙缝,还有偶尔的酸痛,还有一阵阵烧糊的味道。结束之后看到我嘴里都是血,漱了漱口口后医生给上了个药,拿了漱口水,也是结束了。

还是没想到自己蛀牙这么多,以为自己还是很年轻之类的,就一堆问题,可能是之前快乐水喝多了,医院也能听到一些10来岁的小孩,在那哭的特别大声,看来这玩意跟年纪也没什么关系,之后人生又要少了一个乐趣了。

之前也是刷到过一些做根管的视频,看着就很吓人,推荐各位没看过的去搜下看下,健全的还是要注意防护呀,看完就会瞬间有了敬畏之心了。医生也是一直有推荐用什么牙线清理,这玩意我到现在还是一次没用过,之前倒是有尝试,总感觉塞不到牙齿里面,后面还是要尝试一下。


本来想着每周写一点什么的,这个打算是昨天写的,然后还约了个模特练习下拍照,也是因为是下雨,然后就是昨天早上睡了很久,大概是前天22:30就睡了,到第二天8:30,还是没睡醒,下午头昏脑涨,有点发烧的样子,中午的饭吃了两口也是吃不下了,有点想吐的。

没办法也是没出门,在家看了KT:T1的比赛,恭喜Faker的六冠王,这次比赛虽然国内没什么热度,赛事结束也是有点敷衍,但是我觉得5把都打满,也是蛮精彩的,尤其是第一把,不过后面KT感觉就一直不在状态,不知是不是因为英雄池太浅,反倒是T1越战越勇。

讲讲java的内存分析

2025-11-06 15:09:21

JDK 自带了一些工具,用于监控 JVM 的运行情况,例如 jconsolejvisualvm,也有一些第三方的工具,例如 matyourkit java profiler,这里推荐 mat,非常的好用,yourkit 的则是界面更现代化一点,功能也更多,是收费的,多出来的功能其实也没什么用,因为本身也是依靠 JVM 提供的接口。

关于 JVM 的内存模型网上有很多分享了,感觉大多都是复制粘贴,这里也不想说这个,我觉得所谓的 'JVM调优',本身就是个伪命题,JVM 不需要调优,默认运行就好,更多的还是代码层面的问题,瞎折腾不如不折腾,有那工夫可以多审查下代码,或者升级 JVM ,能带来的提升都远比所谓的 '调优' 大。


今天主要想讨论的问题是,当 JVM 内存占用过高,或者出现 OOM 的时候,如何去分析。

首先当前就是转储内存了,可以设置参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/heapdump.hprof 在内存溢出时转储堆栈,同时利用上述软件进行分析,或者 JVM 进程还没有退出的时候,用 jmap 等工具进行转储堆栈。

这里我想到的排查思路就是,看内存占用的分布,哪些代码占用了高内存,然后再去检查对应的代码。

这里拿 mat 来说,这里我们主要使用 dominator tree 这个工具,至于为什么接下来会说。

image.png

这里我们可以清楚的看到 MyBatis 相关代码占用了非常大的内存,应该是在启动的时候解析 XML,并且缓存相应的结果,通过展开树结果,可以一层层往下进行分析。

这里说下界面上的 shalldow heapretained heap,也是我主要想分享这篇文章的原因。

shalldow heap 是指只计算对象本身直接占用的内存,例如一个 int ,一个boolean,对于引用的对象,我们都知道对象其实就是一个指针,那就只占用一个指针的大小,通常是一个int;但是在 Java 中,String 也是一个对象,也就是说,无论一个对象包含了一个多么大的 String,反应到对象的统计里,也就是一个指针的大小,这个不是我想要的结果。

反应到工具里,像是 jvisualvm 这种工具只能查看 shalldow heap 这种内存,会根据对象类型,展示对象数量和占用内存,像是下面这样。

image.png

结果就是清一色的 byte[],因为 String 本身也是由 byte[] 组成,所以这种我觉得就没什么意义。

retained heap 这种才正是我一直再找得,当初就是像找一个工具,能递归式的获得一个对象占用的所有内存,包含子对象的占用,这样才能比较方便体现哪里占用的内存最大,所以就看到了 mat

dominator tree 这种就是按照 GC Root 的顺序,自上而下遍历所有的对象,计算他们占用的大小,然后以树的形式展示在我们面前。


不过,所谓 Heap Dump,当前就只有 Heap 的情况,Java 除了 Heap 区,也有 Non-heap 区,通常对于类的元数据等相关存储,就在相关 Non-heap 区,还有一些直接内存引用,这部分内存是不好进行分析的,虽然加上参数 -XX:NativeMemoryTracking=summary 也可以打印一些信息。

插件化的思考

2025-10-31 16:55:01

现在有点像是着了魔一样,又或是写 JAVA 写出啥毛病,无论搞什么都会想着扩展,整点插件化,留点扩展接口什么的。

之前,我给当时写的游戏面板按照插件化的思路,对不同游戏进行灵活配置,具体项目已经正式上线了,可以这里查看,虽然后面我没有在这继续开发,但这又是另外一回事了,后面可以展开说说。

最近我想写一个 JVM 工具,可以查看 JVM 情况,对内存进行分析,通过 Java Agent 对进程进行操作,Class 处理等等,能做的想想还挺多,就像是给 Arthas 做了一个图形界面一样。

一开始肯定不能实现全部的功能,所以我想通过插件的方式扩展,在此之前,我写过一个 jdbc-monitor,用于监控java应用的sql执行情况,也不完善就是。


之前的插件化多少有一点问题,就是他们每个插件都是一个单独的页面,在一个Web Iframe 中展示,能切入的点有点少,Iframe 还存在跨域问题。

我有想过能不能有一套插件,可以控制逻辑和显示,有一套多端可用的自定义 UI,然后通过接口暴露给插件,同时也可以控制插件的行为,限制权限。

所以我在想参考一下别的系统的插件设计。

Halo

halo 的插件还是有很多可以学习的,毕竟我也是搞 Java 的,Pl4j 也是从它这里或的了一些灵感,不过它的自定义数据结构我还是没搞懂,感觉挺有意思的,后面可以学学,在这个地方

我主要关注的还是 UI,他这个把 Vue 打包成单个 Js,把 Vue 的 Component 也都是放一起,然后留一个入口,注册 Component。

import { definePlugin } from "@halo-dev/console-shared";export default definePlugin({  components: {},  routes: [],  ucRoutes: [],  extensionPoints: {}});

但是这种没法对 Js 做权限限制吧,会不会有安全问题,例如一个恶意插件,是可以获取到 Token 修改页面等的。

懒猫微服

后台我又看了看这种 Nas 系统的,他们的文档在这,想看看他们怎么实现多个应用的,后来才发现,就是启动了多个 Docker 容器,页面用 Nginx 反代,然后应该还是每个用 Iframe 之类的隔离

Vscode

后来突然想到了 Vscode,Vscode可以自定义 UI,同时存在与多端,后来看到 vscode其实也是一个 setWebview 之类的 ,和我当初想到的差不多,所以还是用我之前的思路吧。

Zed

最后说一下 Zed , 一个新兴的编辑器吧,它的插件能实现的功能不算多,不能自定义 UI,不过由于是 Rust 写的原生 UI,速度非常快。它的扩展也是由 Rust 写的,最后编译成 Wasm ,由此就可以跨平台使用了,Wasm 真是个不错的主意,也能在 Web 上使用,如果能实现一套渲染 Api,可以在 Wasm内渲染 UI,就更好了。


这次写的有点乱,本身就是前段时间突然想到的折腾过程,后面也不一定搞这个东西,研究了一会,本来是打算把我的这个 TODO 事项划掉的,但是又想到,正所谓 '思绪来的快,去的也快',自己的思考虽然也没带来什么,但这样消失也是太可惜了,不放就让他永久留在我的博客里,这正是博客存在的意义。

Tailscale 支持了 Peer Relay

2025-10-31 14:29:36

前两天,看到 Tailscale 的公告邮件,支持了 Peer Relay,具体内容在这里

这里先说下,什么是 Tailscale

Tailscale 是一个 VPN 软件,可以用于异地组网或者内网穿透,不需要公网 IP,也有其他类似的软件,例如 netbird zerotier easytierTailscale 的文档应该是我见过写的最好的,也是因此我选择了它,例如这篇很有名的 NAT 打洞的介绍 how-nat-traversal-works

什么是 Peer Relay

Tailscale 通过 P2P 进行连接,有一个被称之为 DERP 的中继服务器,用于通知两个电脑对方的 IP, 然后双方进行打洞,在初期打洞还没成功,或者无法打洞的情况下,DERP 负责中转流量,打洞这个过程对于双方节点来说是无感的。

官方 DERP 中继服务器都在国外,延迟很高,要想低延迟只能自建,自建的话要有个服务器,有公网ip,另外还需要域名和证书,在国内,自然就少不了备案,虽然也有其他不需要域名的方案,这个我就没怎么深入了解,总之就是很蛮烦。

自建的 DERP 中继还得配置啥授权,防止别人也能连接你的服务器,但是这又导致了一个问题,要是你把自己的节点临时分享给别人,同时你又使用了自建中继,自建中继配置了认证,别人就没法连接你分享的机器,去掉认证又会导致自己的中继被陌生人薅羊毛,变成两头堵了属于是。

Peer Relay 一部分的解决了这个问题,只需要你的一个节点具有公网即可,其他节点可以通过这个节点进行数据中转,在成功打洞直连,节点中转,和中继服务器之间,tailscale会自动选择一条最优线路。

对于我来说就是访问不用看运气了,之前还是有一定概率打洞失败的,走中继服务器基本上只能浏览网页,还卡的要死,现在再不济走中转,也就 20ms 延迟变成了50ms,对于播放家里 NAS 的视频来说,基本没啥影响。

image.png
nat_route.png


之前访问有些服务,也可以使用 ssh 工具的跳板机 ,不过这个中转,也就相当于进行这个操作了,就可以省去了。

image.png


老家我也放了个 8100 的机子,上面部署了 frigate 进行录像监看

image.png

带宽消耗比我想象中的低很多,感觉这一套完全可以替代海康威视的录像机了,还差一个不错的 app 。

另外发现,Tailscale 还有个库,可以用于自行开发嵌入到 app 中,或许可以用这个做个文章。

旁边商场的超市终究还是关门了

2025-10-07 19:08:47

好像是上年年初,小区附近开了一个商场,当时人还是很多的,今年年初,因该是有些商铺的合同到期了,像是一些火锅餐饮店,在3楼的基本都关门走人了。
前段时间,1楼的手机店蛋糕店什么的也是都关闭了,-1层的快餐之类的感觉还没挺一年。

然后就是-1层还有个超市,我还是挺喜欢这个超市的,卖的比苏果便宜很多,饮料零食也是比楼下小卖部便宜一点点,品类也更丰富一点。国庆的时候,超市门口也是放了公告,快要关门了,低价清仓。昨天去买个茶杯,5折,零食什么的7-8折。

现在这个商城,也就剩一个电影院,肯德基,蜜雪冰城,好想来等,2楼的还有台球厅好像,然后就是教小孩子艺术的一些店还在。电影院我周末去过几次,希望它还是晚点关门吧,还是挺方便的,周末或者下班,我一个人包场,虽然荧幕不算大,也比自己家强不少,价格也算便宜,记得上个月去看电影的时候,大厅空调都没开,感觉也是不好过。

算是一个时代记录吧,之前也去老家的一些商场看过,感觉这种落魄商场最终都会变成各种教辅机构之类的,教小孩子画面武术各种东西的。

突然想起来,之前各种商场也搞那种类似夜市的摊位,最后很多都是不了了之

image.png

image.png

image.png