时光星图 Time Atlas:把本地照片变成一片可以探索的 3D 记忆星河
前言相册工具通常会把照片排成时间线、瀑布流或文件夹列表。这样的方式足够高效,但总觉得少了一点“重新进入那段记忆”的仪式感。 时光星图 Time Atlas 想做的是另一种体验:把本地照片目录变成一片可以探索的 3D 记忆星河。一个文件夹是一座星系,一张照片是一颗星辰,用户可以在星图全貌、焦点航行、星系内部和照片浏览之间层层进入,把一次旅行、一个纪念日、一段日常重新展开。 访问地址:https://junly.top/time-atlas 它解决什么问题时光星图不是为了替代系统相册,也不是为了做云端照片管理。它更像一个专注“沉浸式回看”的本地记忆浏览器。 它适合这些场景: 想把旅行、纪念日、家庭日常等照片按主题重新组织。 想在大屏、投影或触控设备上用更有氛围的方式展示照片。 想体验摄像头手势浏览照片,但又不希望照片上传到服务器。 想把文件夹里的照片快速变成一个可演示、可分享思路的 3D 互动页面。 核心设计原则很简单:照片留在本地,交互变得更有空间感。 核心功能1....
Web接口业务数据加密传输方案:算法选型与落地实践
前言在 Web 项目中,接口安全最基础的一层一定是 HTTPS。HTTPS 已经通过 TLS 解决了传输过程中的窃听、篡改和中间人攻击问题。对于大多数普通业务接口来说,HTTPS 加登录态认证已经足够。 但在一些敏感场景中,比如实名认证、银行卡绑定、支付确认、修改手机号、修改密码、隐私资料提交等,仅依赖 HTTPS 有时还不够。原因不是 HTTPS 不安全,而是业务系统里还可能存在日志落盘、代理转发、网关调试、内部链路暴露、前后端错误处理等额外风险。 这时可以在 HTTPS 之外,再对敏感业务数据做一层应用层加密。本文就从算法对比开始,介绍一套比较通用的接口业务数据加密传输方案。 常见加密算法对比在设计接口加密方案之前,先要理解几类常见算法的特点。很多安全方案不是靠某一个算法完成的,而是多种算法各自负责一部分能力。 对称加密算法对称加密的特点是:加密和解密使用同一把密钥。 常见算法有 AES、ChaCha20、SM4、DES、3DES...
估值君 —— 一个帮你实时追踪基金估值的小工具
前言作为一名基金投资者,你是否也有过这样的困扰:交易日盘中想看看自己持有的基金大概涨了多少,却只能反复刷新各种 App,而且大多数行情软件只展示基金的上一日净值,盘中的实时估值要东找西找。 为了解决这个痛点,我利用业余时间开发了 估值君 —— 一个专注于基金盘中实时估值追踪的 Web 工具。输入基金代码即可添加,盘中自动刷新估算净值,让你对自己的持仓盈亏一目了然。 访问地址:https://junly.top/fund/ 或 https://fund.junly.top/fund/ 功能介绍实时估值追踪估值君的核心功能就是盘中实时估值。在交易日的 9:30-15:00 期间,系统会自动刷新每只基金的估算净值,并记录为时间序列数据,生成盘中走势折线图。收市后,你可以在估值走势图上清晰地看到当天估值的变化轨迹。 添加基金也非常简单,只需要输入基金代码(如...
分层架构、DDD、整洁代码与重构
前言架构设计的价值不在于堆砌分层和模式,而在于让业务规则、外部依赖和团队协作能够随需求演进保持清晰。本文从分层、DDD、依赖倒置到渐进式重构,讨论企业 Java 服务在复杂业务中保持可维护性的实践方法。 架构题考察长期演进能力企业 Java 服务的难点往往不在第一次实现功能,而在规则增加、团队扩张、依赖变多后如何保持可修改性。面试回答分层、DDD 或整洁架构时,应结合真实边界:Controller 不承载交易规则,Service 不直接散落 SQL 和第三方 SDK,领域规则不依赖 HTTP/ORM 框架,跨系统事件要可追踪和可补偿。 分层的目的与边界一个实用的分层可以是:接口层负责协议与输入校验,应用层编排用例和事务边界,领域层表达核心规则,基础设施层实现数据库、MQ、Redis、第三方渠道。不是每个小项目都必须有四层目录,而是依赖方向应清晰:业务规则不应依赖外部细节。 层 应承担的职责 不应承担的职责 Interface/Controller DTO、协议转换、输入校验、HTTP 状态 核心状态机、复杂事务和直接拼...
Java:JDK8到21升级、兼容性与生产验证
前言从 JDK 8 升级到 JDK 17 或 21 是一次覆盖编译、依赖、容器、运行参数和性能基线的生产变更。本文以兼容性审计、灰度验证和回滚准备为主线,说明如何在利用新特性的同时控制升级风险。 升级 JDK 是一次生产变更本文范围与延伸阅读本文的重点是升级实施,包括兼容性审计、容器与 GC 验证、灰度和回滚,不重复解释每个语言特性或收集器原理。语言特性的整体对比见Java基础:从语法、集合、并发到JDK 8/17/21新特性的系统梳理,JVM 内存和 GC 原理见JVM:从内存结构、类加载、GC到JDK 8/17/21演进的系统梳理。 JDK 8 到 17/21 的升级不只是把镜像基础版本替换掉。它涉及编译目标、第三方依赖、反射与内部 API、字节码 agent、TLS、安全策略、GC、容器资源识别、启动参数和性能基线。正确方式是先完成兼容性审计,再分环境灰度验证,最后逐步扩容,而不是线上报错后不断增加 --add-opens。 版本 面试应掌握的代表能力 升级关注点 JDK...
日志、指标、链路追踪、告警与 SLO
前言可观测性的核心是让团队能够根据日志、指标和链路等外部信号解释系统状态,并在故障时形成证据链。本文说明三类信号的分工、告警与 SLO 的设计边界,以及如何避免高基数、无效告警和链路上下文丢失。 可观测性不是“多打日志”可观测性让团队能根据外部信号理解系统内部状态,并在故障时建立证据链。日志回答“某一次请求发生了什么”,指标回答“系统整体趋势如何”,链路追踪回答“这次请求跨服务花在哪里”。三者应使用统一的 traceId、服务名、环境和版本关联。 信号 最适合回答的问题 常见陷阱 Logs 某订单为何失败、异常栈是什么 日志无结构、敏感信息泄露、无界量导致成本失控 Metrics P99 是否升高、错误率和队列是否饱和 用 userId/orderId 做 label 导致高基数 Traces 哪个服务/SQL/HTTP 调用耗时 全量采样成本高、异步链路丢失上下文 Profiles CPU/锁/分配热点在哪里 只在需要时低开销采样,避免长期高开销探针 指标、RED/USE...
单元测试、集成测试、Testcontainers与质量保障
前言自动化测试的目标是让业务变更能够快速验证并安全交付,而不是单纯追求覆盖率数字。本文按测试金字塔梳理单元、集成、契约和端到端测试,并说明 Testcontainers、测试数据隔离和 CI 质量门禁在生产研发流程中的用法。 测试目标是降低变更风险高覆盖率不等于高质量。测试应快速发现业务规则回归、接口契约破坏、数据库/MQ/缓存集成问题和发布环境差异。健康的结构通常是大量快速单元测试,适量集成测试,少量关键端到端测试,而不是所有测试都启动完整 Spring 容器。 层次 验证内容 成本 典型工具 单元测试 单个类的规则、边界、异常 最低、最快 JUnit 5、Mockito Slice 测试 MVC/JPA 等局部 Spring 层 中等 @WebMvcTest、@DataJpaTest 集成测试 真实数据库、Redis、MQ、事务和配置 较高 @SpringBootTest、Testcontainers 契约/E2E 服务间 API...
SpringSecurity:认证、授权、JWT与接口安全
前言接口安全不是只在登录接口签发一个 Token,而是覆盖身份确认、访问控制、数据范围、凭证保护和攻击防护的完整链路。本文以 Spring Security 的过滤链为主线,说明 Session、JWT、OAuth2 及接口安全治理在企业系统中的职责边界。 认证、授权与数据权限不是一回事认证回答“你是谁”,授权回答“你能访问哪个接口或动作”,数据权限回答“你能访问哪些具体订单、租户或部门数据”。Spring Security 主要提供认证和授权框架能力,数据权限仍要在查询条件与业务服务中落实。 flowchart LR A[HTTP Request] --> B[SecurityFilterChain] B --> C[Authentication Filter] C --> D[AuthenticationManager] D --> E[AuthenticationProvider] E --> F[SecurityContext] F --> G[AuthorizationFilter] G -->...
Java:类加载、反射、SPI、动态代理与模块化
前言类加载、反射和动态代理常在框架集成、插件隔离和线上兼容故障中同时出现。本文从类的生命周期和 ClassLoader 边界出发,解释 SPI、代理和模块化的运行原理,并提供定位类冲突与访问限制问题的思路。 类加载问题本质是“哪个类、由谁加载”同名类被不同 ClassLoader 加载后,在 JVM 看来是不同类型。排查 ClassCastException、NoSuchMethodError、SPI 实现找不到、容器插件隔离问题时,必须同时看类全名和 ClassLoader,不能只看 Maven 依赖树。 类的完整生命周期可概括为:加载、连接(验证、准备、解析)、初始化、使用、卸载。准备阶段给静态字段分配内存并赋默认值;初始化阶段才执行静态变量赋值和静态代码块。new、访问非编译期常量静态字段、反射主动使用、启动类等会触发初始化。 双亲委派与自定义加载常规类加载器按“先委派父加载器,父找不到再自己尝试”的方式加载。它的主要价值是保证核心类唯一,例如避免业务 jar 自己定义 java.lang.String 替代 JDK...
Java:NIO、网络编程、零拷贝与 Netty
前言网络服务的性能和稳定性不仅取决于协议,也取决于 I/O 模型、事件循环、缓冲管理和连接治理。本文区分 TCP、HTTP、BIO/NIO 与 Netty 的职责,进一步说明粘包拆包、零拷贝、背压和连接异常等生产问题的处理思路。 先区分网络协议、IO 模型和框架TCP 解决可靠字节流传输,HTTP 定义应用层请求响应语义,BIO/NIO 描述 Java 的 IO 编程模型,Netty 是基于 NIO 的网络应用框架。面试中不要把“非阻塞”误说成“没有线程”或“没有等待”。 层次 关注点 TCP 连接、可靠传输、流控、拥塞控制、字节流无消息边界 HTTP 方法、Header、状态码、Body、Keep-Alive/HTTP2 等语义 Java IO 阻塞/非阻塞读写、内核事件通知、缓冲区与通道 Netty EventLoop、Pipeline、编解码、连接管理、背压和业务线程隔离 BIO、NIO 与 SelectorBIO 的 accept()、read()...
