- 博客(231)
- 资源 (50)
- 问答 (1)
- 收藏
- 关注
原创 那些年,我们写过的低级BUG,警钟长鸣
看下这段代码有哪些问题:public static MultiPriceInfo getMultiPriceInfo(List<MultiPriceInfo> multiPriceInfos, String code) { if(CollectionUtils.isEmpty(multiPriceInfos)){ return null; } for(MultiPriceInfo priceInfo : multiPric
2020-10-29 14:43:10
917
1
原创 Jackson Mixin 详解
Mixin 是 Jackson 提供的一种机制,允许你在不修改原始类源码的情况下,为其添加或覆盖 Jackson 注解。它通过"混入"的方式,将注解逻辑与实体类定义分离。核心概念分离关注点:序列化规则与领域模型分离无侵入式:不需要修改原始类,适用于第三方库的类运行时绑定:在 ObjectMapper 级别配置,不影响类本身。
2025-11-26 14:09:52
385
原创 Slf4j打印异常堆栈的正确姿势
Slf4j打印日志的时候,如果最后一个参数是 Throwable 时可省略占位符。Logback、Log4j2、JUL 绑定都遵循此规则。
2025-10-16 13:51:35
197
原创 spring-kafka的消息拦截器RecordInterceptor
KafkaClients提供了可以在消费消息之前对消息进行拦截,Spring-Kafka对消费拦截器做了增强,新提供了一个与之类似的,我们还是以传递TraceId来看下具体的使用方法。
2025-09-16 16:16:05
347
原创 spring-kafka的消息过滤器RecordFilterStrategy
运行机制:Spring Kafka的监听器容器(如ConcurrentMessageListenerContainer)poll()到消息以后,为每条消息创建一个ConsumerRecord并封装成Message,在调用@KafkaListener的方法之前,容器会先检查是否配置了RecordFilterStrategy,RecordFilterStrategy 的 filter 方法被调用,如果返回true,就不会调用listener。Offset的提交与消息的处理结果(包括被过滤) 是同步的。
2025-09-16 11:40:03
922
原创 spring-kafka消费异常处理
我们可以自定义一个@Bean// 最大的重试间隔,默认是30秒// 初始的重试间隔,默认是2秒// 间隔倍数,下一次间隔 = 当前间隔 * 间隔倍数,默认是1.5// 最大重试次数, 默认无限制重试,如果按照默认配置,首次重试隔2秒,下一次隔(2*1.5)3秒,以此类推。
2025-09-14 12:04:51
935
原创 Kafka如何配置生产者拦截器和消费者拦截器
生产者拦截器:在消息序列化和分区之前(onSend)以及确认之后(onAcknowledgement)调用。消费者拦截器:在消息反序列化之后、返回给用户之前(onConsume)以及提交偏移量之后(onCommit)调用。
2025-09-13 14:58:13
568
原创 Spring Boot如何配置Liveness和Readiness探针
当我们采用Kubernetes作为编排平台时,每个Pod节点上的kubelet都负责维持该节点内Pod的健康状态。例如,某些应用程序在启动后可能需要短暂准备时间才能开始接收请求。kubelet可以确保只有当应用准备就绪时才会向其转发流量。此外,如果Pod的主进程因任何意外原因崩溃,kubelet将自动重启容器。为履行这些职责,Kubernetes提供了两种健康检查机制:存活探针(liveness probes)和就绪探针(readiness probes)。
2025-08-20 16:25:47
692
原创 JDK的Stream API使用详解
把流中的元素收集到一个容器中去,比如:List、Set、Map、StringBuilder、StringJoiner等。primitiveStream.mapToObj(IntFunction) 转化成其他类型的流。stream.mapToInt(ToIntFunction)其他类型的流转化成基本类型流。注意:流只能遍历一次,就跟水从水管中流过一样,不能重复再从头遍历。primitiveStream.boxed() 转化成包装类型流。不利用已有的对象,而是利用某些规则去生成流中的元素。
2025-07-12 18:03:31
1062
原创 JDK的Closure闭包详解
闭包是指一个函数(或方法)能够访问并记住其词法作用域(lexical scope)中的变量,即使该函数在其原始作用域之外执行。可以捕获外部作用域的变量保持这些变量的生命周期即使外部方法执行完毕,闭包仍可访问这些变量。
2025-07-10 20:38:54
590
原创 JDK中Lambda表达式的内部运行原理解析
从字节码中我们可以看到,java编译器在编译这个源代码的时候,自动帮我们生成了一个 private static的名字叫lambda$main$0,参数是String.class返回是Integer.class的一个方法,方法中干的事情就是跟lambda表达式是一样的,调用String.length()方法,返回Integer的长度。lambda表达式实际上也是普通的类中的方法的调用,只不过,这个类是运行时动态生成的,方法是编译器在编译期动态生成的。首先,我们来下一个简单的lambda表达式的demo。
2025-07-06 19:01:03
320
原创 openapi-generator-maven-plugin自动生成HTTP远程调用客户端
Java开发中调用http接口的时候,有很多可选的技术方案,比如:HttpURLConnection、RestTemplate、WebClient、Feign、Retrofit、Okhttp等,今天我们来看一个更优的技术方案OpenAPI Generator(http://openapi-generator.tech/)
2025-06-22 14:58:23
1268
原创 SpringBoot实现简单的API代理服务器
提供一个API代理服务,前端访问的时候,添加统一的前缀比如/api进入代理服务的ApiController,ApiController需要识别出来这个请求要访问的是哪一个后端服务,在SpringCloud中我们可以借助Nacos来做,现在只能手动做配置,把服务名追加到url中。当ApiController收到请求的时候,首先从url中解析出来服务名,然后根据服务名查询配置文件找到实际的后端要访问的服务地址,拼接上url中剩余部分作为实际要转发的url,转发请求,返回响应。得到真正要访问的url是。
2025-05-15 10:23:47
656
原创 SpringBoot配置项名与Java属性名的映射规则
来自properties、yml、system property的属性,不管是snake_case还是kebab-case风格,最终都是转化成camelCase。来自OS环境变量的属性,仅支持UPPER_SNAKE转camelCase。
2025-04-27 11:04:43
442
原创 Cannot find module @rollup/rollup-win32-x64-msvc
【代码】Cannot find module ‘@rollup/rollup-win32-x64-msvc‘
2025-03-20 11:26:22
1170
原创 mapstruct入门
只需要在接口上添加@Mapper注解即可,mapstruct会创建一个具有相同方法的实现类,并自动生成所有的setter和getter.@Mapper.builder().build();
2025-01-27 11:05:50
526
原创 Mockito快速入门
SpringBootTest注解来加载整个Spring应用上下文, @MockBean@SpyBean注解用于在Spring应用上下文中注入一个模拟的Bean,它将在测试开始时自动添加到Spring应用上下文中。除了 mock()/@Mock,还可使用 spy()/@Spy,两者区别是 spy 是部分mock,如果不打桩,则执行的是真实的方法。@Mock 是 Mockito 中用的最多的注解,我们用它来创建并注入mock对象,而不用手动调用 Mockito.mock 方法。也可以使用 @Mock 注解。
2025-01-23 13:50:38
1232
原创 gRPC-集成Springboot
服务端首先添加相关依赖:添加相关的配置服务端service代码:客户端添加依赖添加配置客户端调用:完整的源码下载:https://github.com/xjs1919/learning-demo/tree/master/grpc-demo
2024-11-04 16:37:04
555
1
原创 gRPC-拦截器
在构建 gRPC 应用程序时,无论是客户端应用程序,还是服务器端应用程序,在远程方法执行之前或之后,都可能需要执行一些通用逻辑。gRPC 提供了简单的 API,用来在客户端和服务器端的 gRPC 应用程序中实现并安装拦截器。它是 gRPC 核心扩展机制之一,在一些使用场景中(如日志、身份验证、授权、性能度量指标、跟踪以及其他一些自定义需求),拦截器拦截每个 RPC 调用的执行,可以使用拦截器进行日志记录、身份验证/授权、指标收集以及许多其他可以跨 RPC 共享的功能。
2024-11-04 14:35:10
521
原创 gRPC-4种通信模式
比如:客户端向服务端发送了一个查询数据库的请求,服务端持续返回多次结果。客户端数据流模式:也称客户端流式 RPC,与服务端数据流模式相反,客户端持续向服务端发送数据流,在发送结束后,由服务端返回一个响应。比如:客户端有一万条数据 ,分批多次请求服务端,服务端接收后把这些数据都存到数据库,然后返回一次结果给客户端。比如:客户端有一万条数据 ,分批多次请求服务端,服务端每次接收后存到数据库后都发送一次结果给客户端。服务端数据流模式:也称服务端流式 RPC,即客户端发起一次请求,服务端可以连续返回数据流。
2024-11-04 12:05:16
913
转载 gRPC-入门案例
了解 gRPC 之前先来看看什么是 RPC。RPC 全称是 Remote Procedure Call,中文一般译作远程过程调用。RPC 是一种进程间的通信模式,程序分布在不同的地址空间里。简单来说,就是两个进程之间互相调用的一种方式。gRPC 则是一个由 Google 发起的开源的 RPC 框架,它是一个高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。gRPC 通过对负载均衡、跟踪、健康检查和身份验证的可插拔支持,有效地连接数据中心内和数据中心之间的服务。
2024-11-04 09:52:49
264
原创 SpringBoot集成SSE
例如可以在服务端将每次发送的事件ID值自动加 1,当浏览器接收到该事件ID后,下次与服务端建立连接后再请求的 Header 中将同时提交该事件ID,服务端检查该事件ID是否为上次发送的事件ID,如果与上次发送的事件ID不一致则说明浏览器存在与服务器连接失败的情况,本次需要同时发送前几次浏览器未接收到的数据。事件的唯一标识符,浏览器会跟踪事件ID,如果发生断连,浏览器会把收到的最后一个事件ID放到 HTTP Header。整数值,单位 ms,如果与服务器的连接丢失,浏览器将等待指定时间,然后尝试重新连接。
2024-10-23 17:26:14
7689
1
原创 Zookeeper占的那些端口 - 从Eclipse Jetty安全漏洞说起
起因系统扫描报Jetty漏洞,很奇怪,系统中明明没有使用Jetty! 后来发现是Zookeeper中会使用Jetty,因为有使用Kafka,所以也使用了Zookeeper。Zookeeper使用Jetty主要干2个事情:1)提供给Prometheus用来输出监控指标用,占用端口70002)提供给AdminServer用来查询系统配置项,占用端口8080也就是说,只要禁用这两个功能就可以了。1)禁用7000端口看下官方文档的描述:Since 3.6.0 ZooKeeper binary pa
2024-10-11 14:37:06
2512
1
原创 如何用Prometheus监控禁用了Actuator的SpringBoot?
换一个思路,还是照常引用actuator,但是把访问路径给禁用了,然后自己写一个controller,把actuator的内容原样输出出来不就行了,同时给这个接口加上权限认证,巧了,prometheus就支持抓取接口上加basic认证。问题是,actuator有安全风险,安全漏洞扫描会通不过,虽然改了端口号,改了访问路径,领导还是不同意啊,难不成自己写那么多的监控指标?prometheus中加上job,grafana中添加上dashboard,一个漂亮的监控页面就出来了。
2024-09-25 16:33:22
699
转载 prometheus实战---告警模板编写
Receiver: 接收器的名称.Status: 如果正在告警,值为firing,恢复为resolved.Alerts: 所有告警对象的列表,是一个列表,.Alerts.Firing: 告警列表.Alerts.Resolved: 恢复列表.GroupLabels: 告警的分组标签.CommonLabels: 所有告警共有的标签.CommonAnnotations: 所有告警共有的注解.ExternalURL: 告警对应的alertmanager连接地址。
2024-09-24 18:08:30
654
原创 茴香豆的茴的写法-SpringBoot接收客户端请求的几种方式
知道这些方式有啥用呢?有些时候,我们需要在starter中内置一些controller,但是又不想被其他的组件扫描到(比如swagger),这个时候用处就来了。
2024-09-21 15:57:11
362
原创 Integer是线程安全的吗?AtomicInteger呢?
不可变类简单来说是其实例不能被修改的类。包含在每个实例中的所有信息在对象的生命周期中是固定的,因此不会观察到任何变化。Java 平台类库包含许多不可变的类,包括 String 类、基本类型包装类以及 BigInteger 类和 BigDecimal 类。有很多很好的理由:不可变类比可变类更易于设计,实现和使用。Integer虽然是线程安全的,但是如果要实现i++这种操作,Integer就无法保证线程安全了,这正是AtomicInteger的用武之地。很明显,包装类Integer是线程安全的。
2024-08-16 11:57:42
801
原创 @Transactional如何在事务方法中正确开启异步任务?
这个时候因为发邮件是异步执行的,因此会先于注册方法执行,此时事务还没提交,因此根据id查询不到数据,导致抛出异常:user信息不存在。注解用于事务控制,用户注册完成以后,为了不阻塞主线程,使用异步的方式向用户发邮件,同时在用户注册方法的最后加了一个。以上代码的含义就是当事务提交以后会回调到这个监听方法中,因为事务已经提交,此时是可以正常查询到数据的。因为在发送邮件之前,已经把事务提交掉了,因此不会出现查不到数据的情况。这种方式可行,但是,代码的侵入性太高,不推荐。,但是注册完成以后,改成发。
2024-07-19 15:51:45
1124
前面部分可以编辑后面部分不可编辑的EditText
2014-02-25
Android-部分可编辑的EditText
2014-02-20
SharedPreferences帮助类
2013-12-31
Android-从页面右侧滑出通讯录
2014-02-22
ListView后台更新报错:java.lang.IllegalStateException
2013-12-13
Android-用ListView模仿ExpandableListView
2014-08-01
Android-Popupwindow和Dialog做弹出窗口
2014-05-04
Android-异步图片加载器
2014-05-09
Android-网络通信框架Volley使用详解
2014-03-12
Android-maven配置multidex打包
2014-12-18
maven+spring+mybatis配置
2015-12-17
Android-对ListView的Adapter的一种简单封装
2015-07-24
Android-加速传感器或者OrientationEventListener做横竖屏切换
2015-08-13
Android日期时间选择控件
2015-08-12
Nginx安装配置
2017-10-13
求一简单的正则表达式,用来验证用户的密码
2013-04-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅