- 博客(1395)
- 资源 (6)
- 收藏
- 关注

原创 合格程序员每天每周每月每年应该做的事
程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢 4、考虑自
2009-11-18 12:45:00
2145
7
原创 科普文:软件架构设计之应用安全【身份验证(Authentication):2FA双因素认证详解】
前面我们详细梳理了OTP一次性密码,这里再看看双因素认证(2FA):2FA是结合两种不同的认证因素(如密码和OTP),增强安全性的身份验证方法。双因素认证,英文名称, 简称2FA。常规密码验证码使用2FA的主要目的是增强账户的安全性,提供额外的保护层,以防止未经授权的访问和潜在的安全威胁。降低了密码盗窃的风险弱密码尽管2FA并,但它是一种非常有效的方法,可以显著提高账户的安全性。通过多因素验证,即使密码泄露,攻击者也难以轻松进入您的账户。
2025-05-06 12:48:14
230
原创 科普文:软件架构设计之应用安全【身份验证(Authentication):OTP一次性密码 TOTP详解】
一次性密码(OTP,One-Time Password)是一种用于身份验证的安全机制,通常用于提高用户账户的安全性。前面我们一步一步地分析一下OTP的工作原理。这种机制能有效防止重放攻击和钓鱼攻击,因为每个密码只使用一次且是短暂有效的。在这里我们再继续看看OTP的另一种方式RFC 6238(TOTP)。
2025-05-06 12:25:01
444
原创 科普文:软件架构设计之应用安全【身份验证(Authentication):OTP一次性密码 HOTP详解】
动态口令(OTP)有一个同名确不同翻译的前辈,一次性密码(OTP, One-Time Pad),也叫密电本,是一种应用于军事领域的谍报技术,即对通信信息使用预先约定的一次性密电本进行加密和解密,使用后的密电本部分丢弃不再使用,能够做到一次一密。可以做到一次一个动态口令,使用后作废,口令长度通常为6-8个数字,使用方便,与通常的静态口令认证方式类似,使用方便与系统集成好,因此OTP动态口令技术的应用非常普遍,可以应用于多种系统渠道使用,如:Web应用、手机应用、电话应用、ATM自助终端等。
2025-05-06 11:38:18
308
原创 科普文:软件架构设计之应用安全【身份验证(Authentication):OTP一次性密码 TOTP和HOTP小结】
OTP生成方式:通常基于算法生成,包括TOTP和HOTP两种方式。 生成过程不依赖外部网络,具有更高的独立性。TOTP(基于时间的 OTP,计时使用):根据当前时间和共享密钥生成,基于RFC6238协议。HOTP(基于事件的 OTP,计次使用):根据计数器值和共享密钥生成,基于RFC4266 协议。
2025-05-05 19:30:20
580
原创 科普文:软件架构设计之应用安全【身份验证(Authentication):短信验证、图片验证、TOTP一次性密码、2FA双重身份验证等小结】
为了确保应用程序的安全性和保护用户数据的隐私,开发者需要使用一些必备的身份验证应用安全技术。身份验证(Authentication)是网络安全的核心组成部分,指的是确认用户或系统的身份是否有效的过程。通过身份验证,可以确保只有授权用户才能访问敏感数据或系统资源。随着网络攻击手段的不断演进,传统的身份验证方式面临越来越多的挑战,因此多种身份验证机制相继出现,以应对日益复杂的安全威胁。
2025-05-05 16:21:23
1049
原创 科普文:一文搞懂Spring中常用的注解【@EventListener 注解的原理、核心类、应用场景】
EventListener 标记方法作为事件监听器,用于处理应用程序事件。通过松耦合方式实现事件驱动编程,适用于多组件协作场景。需注意同步/异步控制及条件表达式优化,结合具体业务合理设计事件链。我们继续梳理@EventListener的原理、核心类、优缺点、应用场景和注意事项。
2025-05-04 18:16:55
420
原创 科普文:一文搞懂Spring中常用的注解【@Profile、@PropertySource/ @PropertySources、@ConfigurationProperties】
@Profile 多环境隔离 切换开发/生产环境数据源@PropertySource 自定义配置文件加载 加载独立模块配置(如 redis.properties)@ConfigurationProperties 结构化配置映射 封装数据库连接参数对象@ImportResource 传统 XML 配置迁移 整合遗留系统的 XML 配置文件注意事项总结配置优先级:@PropertySource 默认优先级低于 application.properties,可通过 @Order 调整加载顺序。
2025-05-04 14:52:47
652
原创 科普文:一文搞懂Spring中常用的注解【@PostConstruct、@DependsOn、@Order注解嵌套使用解决Bean加载优先级问题】
解决Bean加载优先级问题@PostConstruct、@DependsOn、@Order注解嵌套使用解决Bean加载优先级问题。注解作用域分析注解 作用层级 核心用途 生效阶段@DependsOn Bean 定义级别 显式声明依赖的 Bean,确保被依赖的 Bean 先初始化 Bean 实例化前 @Order Bean 注入/执行顺序 控制同类 Bean 在集合中的排列顺序或组件执行优先级(如拦截器链) Bean 注入时或组件调用时 @PostConstruct Bean 实例级别 标记初
2025-05-04 11:22:22
861
原创 科普文:一文搞懂Spring中常用的注解【@Component、@Order、@DependsOn 三个注解的原理、核心类、应用场景】
DependsOn和@Order是用来解决Bean加载顺序问题的。同时,@Component是用于将类标记为Spring容器的组件,让Spring能够自动扫描并注册为Bean。@Order的使用场景,比如拦截器、过滤器、监听器的执行顺序,以及集合排序的情况。
2025-05-04 11:00:36
528
原创 科普文:一文搞懂Spring中常用的注解【@lazy注解的原理、核心类、应用场景】
前面有对java注解、spring注解做过梳理,这里我们再看看Spring框架中@Lazy注解的原理、核心类、应用场景。
2025-05-04 10:26:31
964
原创 实战:软件架构设计之【Spring Boot 动态注册Controller:实现Mock Server】
例如,提供一个REST接口,允许用户发送一个POST请求来创建一个新的Mock端点,包括路径、方法、响应体等信息。或者使用配置文件,在启动时加载多个预定义的Mock接口。Mock Server在测试过程中快速创建临时的API端点,模拟各种响应,而不需要预先在代码中定义这些Controller。前面梳理了Spring Boot 动态注册Controller,这里我们来实现一个Mock Server,体验一下动态注册Controller。在单元测试或集成测试中动态创建接口,验证系统对不同响应的处理逻辑。
2025-04-29 15:41:41
1421
原创 科普文:软件架构设计之【Spring Boot 动态注册Controller】
Spring Boot 动态注册 Controller 的核心原理是 在运行时通过编程方式向 Spring 容器注册 Bean,并利用 Spring MVC 的 RequestMappingHandlerMapping 动态添加请求映射。传统静态注册:通过 @Controller/@RestController 注解在启动时扫描并注册 Bean。动态注册:绕过注解扫描,手动创建 Controller 的 Bean 定义,并 实现运行时灵活性,适用于插件化、多租户等动态场景。其核心依赖。
2025-04-29 14:48:08
847
原创 科普文:软件架构设计之【Spring MVC小结】
SpringMVC 注解通过简化配置和增强语义,显著提升了开发效率。在 Spring 的基本架构中, Spring Web MVC 也就是SpringMVC,它是属于Spring基本架构里面的一个组成部分,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,所以我们在后期和 Spring 进行整合的时候,几乎不需要别的什么配置。
2025-04-29 10:23:11
676
原创 科普文:HTTP协议【GET、DELETE一定没有请求体RequestBody吗?】
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.可以看到,RFC7231规范并没有说明GET请求不能携带body(A payload within a GET request message has no
2025-04-29 09:18:42
752
原创 科普文:Java基础系列之【线程和线程池伪共享:ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal小结】
ThreadLocal:单线程数据隔离(如 Spring 的 RequestContextHolder)。InheritableThreadLocal:简单父子线程数据传递(如单次任务拆分)。TransmittableThreadLocal:线程池、异步任务、分布式链路跟踪(如日志 traceId 透传)类别 优点 缺点ThreadLocal 轻量级、线程隔离性强、无锁性能高 父子线程无法传递数据、线程池场景失效、内存泄漏风险需手动清理InheritableThrea
2025-04-28 20:33:13
1092
1
原创 科普文:软件架构设计之【国内最好的Java 权限认证框架Sa-Token】
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。官方地址:Sa-Token最新版本:sa-token-doc/start/new-version.md · dromara/Sa-Token - Gitee.com
2025-04-28 13:11:19
1078
原创 科普文:OAuth 2.0认证框架小结
OAuth 2.0 是一种 ,也是一个开放标准,允许第三方应用在用户授权下访问其资源服务器的数据,而无需直接获取用户凭据(如密码)。例如:用户把照片、视频、联系人数据存储在内容托管云服务R(Resource)中的Picture、Video、Contact三个模块中;用户使用在线照片打印服务P(Printer),用户需要让P服务读取R服务中的照片进行打印,但不想让P服务读取R服务中的其他数据。
2025-04-28 12:51:00
911
原创 科普文: Java web应用性能分析【Java性能优化:Java高效NIO之IO模型和零拷贝】
传统IO模式,在处理数据流过程中,线程处于阻塞状态,直到流处理(读取后写入)完毕,所以一个线程只能处理一个IO任务,如果IO未准备就绪无数据(或不可写)线程只能一直等待,直到可以有数据(或可写);NIO模式,采用IO多路复用技术,使用选择器(Selector)监控一组IO,虽然Selector线程也处于阻塞状态,但一个线程可以同时处理多个IO任务,当IO就绪时,Selector返回就绪的IO并由程序进行处理。
2025-04-26 14:32:18
752
原创 科普文: Java web应用性能分析【Java性能优化:Java高效NIO之直接内存映射】
通过用户缓存和Kernel缓存的共享,用户程序的操作直接作用到Kernel内存,无需进行内存拷贝。使用内存映射文件处理磁盘上的文件时,无需对文件执行IO操作,也不需要再为文件进行内存分配、加载和释放等管理工作,因此此模式在处理大量数据的文件时能起到高效的作用。例如,对于数据库服务等比较复杂的应用,程序根据业务更懂如何使用内存,为了提高性能,希望绕过内核缓存区,由自己在用户空间管理IO缓存,包括缓存机制和写延迟机制等,以支持事务、提高查询缓存命中率等。才是提供实际功能的其直接子类,他同时实现了。
2025-04-26 14:14:27
630
原创 科普文: Java web应用性能分析【Java性能优化:Undertow踩坑小结】
关于Undertow,前面已经做了梳理,这里整理一下用Undertow碰到的三个坑。1.spring.mvc.servlet.load-on-startup=1 对undertow 无效2.文件上传报错MultipartException3.静态资源报错404
2025-04-26 14:06:24
1258
原创 科普文: Java web应用性能分析【Java性能优化:Undertow性能调优小结】
性能调优效果对比优化项 默认配置 优化后配置 QPS提升Worker线程数 CPU*8 CPU*4 +15%~20%直接内存缓冲区 堆内存 直接内存 +30%HTTP/2支持 关闭 启用 +25%响应压缩阈值 无压缩 >10KB启用 带宽减少40%Undertow的优势:轻量级和高性能:Undertow基于非阻塞I/O模型,具有低资源消耗和高并发处理能力。支持HTTP/2和WebSockets:开箱即支持HTTP/2和WebSockets,无需重写启动类路径。可嵌入式:只
2025-04-26 13:12:34
540
原创 科普文: Java web应用性能分析【Java性能优化:传统IO、堆外内存 ByteBuffer.allocateDirect、MappedByteBuffe的io操作】
传统 IO、堆外内存 (直接内存 ByteBuffer.allocateDirect、内存映射MappedByteBuffer)的IO操作。如果你的应用主要涉及小文件处理或者需要频繁的随机访问,传统的IO可能就足够了。对于大文件或者需要高速数据传输的应用,直接内存的ByteBuffer或内存映射的MappedByteBuffer可能是更好的选择。直接内存更适合于需要频繁读写操作的场景,而内存映射更适合于大文件的随机访问。三种方式都有其独特的优势和适用场景。
2025-04-26 10:01:02
840
原创 科普文: Java web应用性能分析【Java性能优化:堆外内存 ByteBuffer.allocateDirect、MappedByteBuffe的io操作】
在Java中,内存管理主要通过垃圾回收器(Garbage Collector)进行,也就是jvm的运行时区Runtime Data Area。然而,有时我们需要直接管理内存,以实现更高效的性能或满足特定需求。这就是堆外内存的用武之地。堆外内存是Java堆内存之外的内存空间。与堆内存不同,堆外内存的分配和释放不由Java的垃圾回收器管理。这意味着,一旦你分配了堆外内存,就意味着你放弃了java自带的内存管理机制GC,所以需要你手动释放,否则可能会导致内存泄漏。
2025-04-26 09:34:24
1003
原创 科普文: Java web应用性能分析【Java性能优化:纯java编程的优化方法论小结】
switch 优化: 使用 switch 代替多个 if-else,提高分支预测效率。合理配置容器: 设置合适的初始容量,减少扩容带来的性能损耗。并行处理: 利用多线程和 Fork/Join 框架,充分利用多核 CPU。锁粒度优化: 使用细粒度锁和读写锁,减少线程竞争。池化资源: 使用线程池、数据库连接池、对象池,减少资源创建和释放的开销。直接内存: 使用 ByteBuffer.allocateDirect() 进行高效 I/O 操作。日志优化: 使用 isDebugEnabled 检查、占位符
2025-04-25 17:25:21
854
原创 实战: Java web应用性能分析之【springboot自定义Starter 】
前面我们梳理springboot自动装配的starter原理,并分析springboot如何支持tomcat、jetty、undertow三款内嵌web服务器。这里我们一起看看如何自定义一个starter。Starter 的核心目标是简化依赖管理和自动配置逻辑,我们可通过自定义 Starter 实现通用功能的模块化封装。当然其核心原理spi,这里就不再展开。我们这里还是以springboot2.X为例,构建一个自定义的starter,核心代码实现MyServiceAutoConfiguration
2025-04-25 13:11:51
968
原创 科普文: Java web应用性能分析之【springboot2.6、2.7、3.0的starter自动装配小结】
关于springboot2.6、2.7、3.0、3.5等的历史和特性,有兴趣的可以去看看前面的文章,这里我们做一个小结。即使2.6的支持已经到期,Spring Boot的自动装配主要通过@注解触发,其中是关键。稳定性与性能:Spring Boot 3.x版本因其对Java 17的支持和优化对Spring Framework 6的支持,被认为是当前最稳定的版本,适合需要高性能和长期维护的项目。社区支持:尽管2.x版本仍然有一定的市场占有率,但3.x版本因其最新的功能和性能优化,逐渐成为社区和企业
2025-04-25 11:33:25
870
原创 科普文: Java web应用性能分析之【java线程池中线程共享数据总结】
常见的并发问题竞态条件(Race Condition):多个线程同时访问和修改同一数据,导致结果依赖于线程的执行顺序。内存一致性错误(Memory Consistency Errors):一个线程写入的值可能在另一个线程中看不到,除非使用适当的同步机制。死锁:两个或多个线程相互等待对方释放资源,导致程序无法继续执行。java线程池中线程共享数据分类在分析并发问题前,我们有必要对java线程池中线程共享数据做一个分类,以便于更好的理解线程池和并发问题。下面从 “共享方式”(如显式同步
2025-04-24 22:26:15
725
原创 实战:Java web应用性能分析之【死扣代码性能:日志输出为什么要用isDebugEnabled() 】
当你在用Arthas、JPfofile等性能分析工具分析服务端应用性能时可以看到应用运行时的状态,耗时,从而及时发现性能瓶颈。以我们可以看到trace监控下,每个方法内部的耗时情况。可以明显的观察到:加了isDebugEnabled判断,在info级别时,只做了debug判断,并未执行日志拼接操作;而不加isDebugEnabled判断,info级别时,没有做debug判断,并执行日志拼接操作。至此我们再去看看开发手册,是不是就能理解为什么要这么规定。
2025-04-24 10:59:44
668
原创 实战:Java web应用性能分析之【为什么springboot的restful接口第一次访问很慢,第二次之后就快很多】
如题:为什么springboot的restful接口第一次访问很慢,第二次之后就快很多?如上日志所示:第一次访问耗时【763ms【528ms【329ms】】】第二次访问耗时【70ms【11ms【6ms】】】访问controller,第一次和第二次访问相差10-50倍,是哪里出了问题?当前环境:springboot2.6.8 + JDK11.0.2 同时用undertow替换了内置Tomcat。
2025-04-23 22:23:46
923
原创 实战:Java web应用性能分析之【spring boot 高性能日志:UDP+异步日志log4j2+logstash】
通过 Log4j2异步日志 + UDP传输 + Logstash聚合 的三层优化,可实现百万级TPS的日志处理能力,同时将主线程日志记录耗时控制在微秒级。Log4j2的异步日志机制,如AsyncAppender或AsyncLogger,能够减少日志记录对主线程的影响,提升应用性能。而UDP协议相比TCP,传输速度快,但不可靠,不过对于日志这种允许部分丢失的场景,UDP是合适的选择。Logstash作为日志收集工具,需要配置对应的输入插件来接收UDP传输的日志。
2025-04-23 18:34:49
718
原创 科普文:Java web应用性能分析之【UDP+异步日志log4j2,性能马上飞】
Log4j2 凭借无锁队列、零 GC 和动态异步策略,在吞吐量和稳定性上全面领先;Logback 适用于轻量级场景但需严格调优;Log4j (1.x) 已不推荐使用。选型需结合业务负载和运维成本综合考量。
2025-04-21 19:27:21
821
1
原创 实战:Java web应用性能分析之【springboot日志log4j2.xml中获取配置文件application.yaml中的配置】
继续前面的细节,springboot日志log4j2.xml中如何获取配置文件application.yaml中的配置?springboot都不是单点部署,那么在集群环境下如何区分同一个服务多点部署时,如何区分日志?其实这两个问题是一个问题,多点部署时,服务名、服务IP、服务端口这三要素是唯一的。如上面application.yaml配置示例,服务名=Ecommerce、服务IP=0.0.0.0、服务端口=8080。只要服务启动时将这些打印到日志中,即可完成服务多点部署时的日志区分。
2025-04-21 19:02:56
1178
1
原创 实战:Java web应用性能分析之【异步日志:性能优化的金钥匙】
前面提到了Log4j2的高可扩展性,同时Log4j2的性能也是极高的,下面是Log4j2官方的benchmark数据,仅供参考:Log4j2之所以性能如此之高,其中一个很重要的原因就是其基于Disrupter的环形缓冲区的无锁化结构Ringbuffer设计。Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,基于Disruptor开发的系统单线程能支撑每秒600万订单。目前,包括Apache Strom、Log4j2在内的很多知名项目都应用了Disruptor来获取高性能。
2025-04-20 21:08:54
945
原创 实战:Java web应用性能分析之【VO/BO/DTO间的对象拷贝】
问题:BeanUtils.copyProperties()在getDetail中耗时51ms(16.95%),在add1中耗时4.7ms,反射拷贝效率低。优化方案:使用MapStruct(编译时生成代码)或BeanCopier(动态字节码)替代Spring的BeanUtils。手写get/set,效果最好最明显,只是维护时,代码量多一点。
2025-04-20 16:23:00
849
原创 科普文:Java基础之算法系列【链表之缓存:2Q(Two Queues)两队缓存替换算法详解】
2Q缓存实现:结合FIFO队列和LRU队列的缓存替换策略。* 适用场景:存在短期重复访问的数据(如Web请求路径缓存)* - 淘汰时优先淘汰FIFO队列中的旧数据。* - 二次命中后晋升到LRU队列。* - 新数据进入FIFO队列。FIFO、LRU实现方式。LRU实现方式二: 。对于高并发场景,可将。实现更细粒度的锁控制。
2025-04-20 15:27:56
1006
原创 科普文:Java基础之算法系列【链表之缓存:ARC(Adaptive Replacement Cache)自适应替换缓存算法详解】
结合 LFUCacheWithHeap(LFU) 和 DynamicLRUCacheWithSkipList(LRU) 实现 ARC(Adaptive Replacement Cache) 算法的完整代码。详细参见前面LRU和LFU的文章。即通过结合 跳表(LRU) 和 最小堆(LFU) 的优势,该实现能在保证并发安全性的同时,动态适应不同的数据访问模式,是 ARC 算法的高效工程实践。* ARC(自适应替换缓存)实现:* - T1(LRU列表):用跳表维护最近访问数据*
2025-04-20 14:53:14
770
原创 科普文:Java基础之算法系列【链表之缓存:LFU(Least Frequently Used)最不经常使用算法详解】
LFU实现方式一: TreeMap + 哈希表+synchronizedLFU实现方式二: 最小堆 + 哈希表+ReentrantReadWriteLockLFU(Least Frequently Used):概念:最不经常使用算法。原理:记录每个缓存项的使用频率,定期清除使用频率最低的项。优点:适用于那些有部分热点数据的场景,因为这些热点数据会被频繁访问,从而kromah地留在缓存中。缺点:实现相对复杂,需要维护频率计数器;对于一些突发性的高频访问,LFU可能会频繁地替换缓存项。
2025-04-20 13:41:48
887
原创 科普文:Java基础之算法系列【链表之缓存:LRU(Least Recently Used):最近最少使用算法详解】
LRU实现方式一: 双向链表 + 哈希表+读写锁LRU实现方式二: 跳表 + 哈希表+分段锁最近最少使用算法(Least Recently used -LRU):这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。
2025-04-20 13:12:34
620
原创 科普文:Java基础之算法系列【链表之缓存:三种方式实现FIFO】
概念:先进先出算法。原理:按照缓存项的进入时间顺序进行替换,最早进入的项会被优先移出。优点:实现简单,不需要额外的记录结构。缺点:无法区分不同项的重要性,可能会导致热点数据被移出,影响缓存性能。记住它的核心原则:如果一个数据最先进入缓存,则应该最早淘汰掉。下面用三种方式来实现FIFO:实现方式 插入/淘汰时间复杂度 内存占用双向链表 + 哈希表 O(1) 较高队列 + 哈希表 O(1) 较低LinkedHashMap O(1) 最低
2025-04-20 11:29:41
935
El caso de las hojas de ruta seguras para la memoria
2024-11-03
jsp+servlet+javabean.ppt
2010-04-02
Devexpress学习篇(请大家多多指教)
2009-07-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人