Dubbo SPI机制
发表于|更新于|后端
|浏览量:
Dubbo SPI 机制

文章作者: 褚成志
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 褚成志的分享站!
相关推荐
2026-04-09
异步任务的坑
Spring Boot 中编写异步任务两个注解: @EnableAsync:开启当前项目的异步功能 @Async:当前方法标记为异步方法 注意一个规则:有没有返回值。 没有返回值的例子: 返回值实现了 Future 接口: 下 异步任务的线程池配置默认情况下,异步任务的线程池是怎么配置的,是否满足我们的需求呢? 配置线程池参数默认是启动下面的线程池: 线程池对应的自动配置类如下: 可以使用下面的参数配置异步任务线程池相关的参数: 异步任务返回超时对于异步任务有返回的情况,如果获取结果超时怎么办呢? get 有重载方法可以设置超时的时间,超时之后就会抛出 TimeOut 异常: 没有返回值的异步任务抛异常对于异步任务没有返回的情况(有返回的直接 get 的时候就会抛异常),但是下面的异步任务执行的时候抛出异常,但是没有任何的其他返回: Spring 默认的异步任务异常处理器,会将对应的异常打印到日志里面: 自定义异步线程池和异常处理器 自定义异步线程池的实现: 自定义异常处理器
2026-04-09
时间格式不能正常转换?
@DateTimeFormat 注解前台到后台的时间格式转换,对于GET 请求参数可以正常工作。对于 POST 请求会报反序列化错误 POST 请求会使用 JSON 反序列化,不会使用 @DateTimeFormat 注解。 POST 表单(body)实现时间格式转换的方法使用 @JsonFormat 注解但是这种代码侵入性强,可维护性差 实现自定义格式转换器 @JsonDeserialize可以支持多种时间格式的转换: 指定反序列化器 定义全局配置类避免冗余代码 指定转换器做Date类型的反序列化: 在对象中就不需要指定对应的注解了。
2026-04-09
自定义通用异常处理
生产级别的通用异常处理所有的异常都抛出,统一在表现层处理,其余直接抛出就好。 spring定义的错误响应方式如图所示。 使用Java提供的异常类抛出的时候只可以传递string,所以需要自定义一个异常类,继承RuntimeException,抛出的时候同时包含信息和状态码 新建通用异常处理类相当于aop里面的通知,起到拦截的作用,要做到通用,状态码不可以写死,这里的设计不对,后面会改进 src/main/java/com/deltaqin/common/advice/CommonExceptionHandler.java 12345678910111213141516171819package com.deltaqin.common.advice;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annot...
2026-04-09
NIO零拷贝
java的 transformTo transformFrom java是平台无关的,但是JVM是平台相关的。 磁盘上文件拿出来发给用户最原始的实现(c实现)内核空间系统调用–上下文切换–直接内存访问DMA 数据**拷贝到内核空间缓冲区(页缓存)–上下文切换–又拷贝**到了用户空间的缓冲区 内核空间系统调用–上下文切换–用户空间 数据**拷贝到内核空间缓冲区(页缓存)–又拷贝**到了网卡的socket缓冲区–上下文切换–返回用户空间 用户空间没有对数据修改 4次上下文切换 2次系统调用 4次数据拷贝 零拷贝(c实现)完全依赖操作系统的,不会有数据在用户内核之间拷贝 sendfile() 内核空间系统调用–上下文切换–直接内存访问DMA 数据**拷贝到内核空间缓冲区(页缓存)–数据拷贝**到目标socket的缓冲区–缓冲区到DMA网卡发送–上下文切换–返回用户空间 真正的零拷贝(c实现)文件描述符可以描述数据的一些大小偏移,socket缓存里面只是存这些, DMA 拷贝内核缓冲区(页缓存)之后–Linux 2.4 之后,文件描述符gather操作,数据不会kernel...
2026-04-09
主流中间件选型-RPC
发生服务循环消费时候关闭服务启动检查默认情况下,若服务消费者先于服务提供者启动,则消费者端会报错。因为默认情况下消费者会在启动时查检其要消费的服务的提供者是否已经注册,若未注册则抛出异常。**在消费者端的 spring 配置文件中添加 ****check="false"**属性,则可关闭服务检查功能。 在循环消费场景下是必须要使用的。A 消费 B 服务,B 消费 C 服务,而 C 消费 A 服务。必须至少有一方要关闭服务检查功能,否则将无法启动任何一方。 多版本控制实现灰度发布系统升级采用的**“灰度发布(又称为金丝雀发布)” 是在低压力时段,让部分消费者先调用新的提供者实现类,其余的仍然调用老的实现类,在新的实现类运行没有问题的情况下,逐步让所有消费者全部调用成新的实现类。** 1234567<!--指定消费0.0.1版本,即oldService提供者--><!--<dubbo:reference id="someService" version="0.0.1"--> ...
2026-04-09
IDE热加载与热部署
热加载则是在运行时通过重新加载class改变类信息,直接改变程序行为。 **主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。**对比反射机制,反射是在运行时获取类信息,通过动态的调用来改变程序行为; 热部署就是在服务器运行时重新部署项目, 直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。 JRebel 加载的速度优于 devtools JRebel 不仅仅局限于 Spring Boot 项目,可以用在任何的 Java 项目中。 devtools 方式的热部署在功能上有限制,方法内的修改可以实现热部署,但新增的方法或者修改方法参数之后热部署是不生效的。 JRebelJRebel 可实现热加载,节省了大量重启时间,提高了个人开发效率。 虚拟机插件,即时分别看到类和资源的变化,直接反应在部署好的应用程序上,从而跳过了构建和部署的过程 激活安装之后会提示输入license激活。使用下面的网址生成服务器地址GUID https://www...
公告
👋 你好,我是褚成志,一名专注于云原生与后端架构的工程师。
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
热爱 Java、Kubernetes、Linux、Redis、Spring 等技术领域,持续探索 AGI 与智能化运维的边界。
这里记录我的技术思考与实践总结,欢迎交流!
