自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(588)
  • 收藏
  • 关注

原创 feign 报错 Connection reset executing POST

注意:由于 Spring的 @Retryable注解 的底层使用了AOP,如果是调用同一个类里带有@Retryable注解的方法,注解不会生效,Feign在默认情况下使用的是JDK原生的 URLConnection 发送HTTP请求,没有连接池。由于是在 使用 feign 进行网络连接时,发生了异常导致出错,因此也可以尝试 重试。可以尝试替换成 httpclient 或者 okhttp。在 feign 的接口,或者是其他服务的 接口,添加重试的注解,因此要放在不同的类里面。

2024-07-21 14:30:02 93

原创 ApplicationContext 源码

ApplicationContextApplicationContext 和 BeanFactory可以先简单了解下 ApplicationContext 和 BeanFactory。详情见: https://blog.csdn.net/sinat_32502451/article/details/140247662ApplicationContext 接口继承图:可以看到 Appli...

2024-07-21 13:52:00 99

原创 Spring源码(五)--ApplicationContext 源码

详情见: https://blog.csdn.net/sinat_32502451/article/details/140247662。可以看到 ApplicationContext 间接继承了 BeanFactory。可以先简单了解下 ApplicationContext 和 BeanFactory。

2024-07-21 13:51:42 128

原创 Spring源码(四) Aware 接口

可以参阅 org.springframework.context.support.ApplicationContextAwareProcessor 和org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。首先会判断对象是否属于 Aware接口类型,接着根据不同的Aware接口实现类,调用不同的实现类的逻辑。Aware 接口 表示bean可以通过回调方法从Spring容器接收特定框架对象的通知。

2024-07-14 23:06:52 158

原创 Spring源码(三) Spring IoC之BeanFactory创建bean和获取bean

bean 对象主要放在 map 里面,map 作为缓存。map 的key 是 bean对象的名称, value 是 bean 对象或者对象工厂。代码详情见: https://blog.csdn.net/sinat_32502451/article/details/140155044。详情见: https://blog.csdn.net/sinat_32502451/article/details/140247662。根据 bean 名称,返回已经注册的单例对象,如果没有注册,则创建并注册一个新对象。

2024-07-11 14:56:13 976

原创 Spring源码(二) refresh () 方法

refresh()方法的路径: org.springframework.context.support.AbstractApplicationContext#refresh。详情见: https://blog.csdn.net/sinat_32502451/article/details/140155044。详情见: https://blog.csdn.net/sinat_32502451/article/details/140247662。BeanFactory 是在这个方法生成的。

2024-07-10 22:36:38 418

原创 常见的系统设计

建一个任务表,当任务失败时,写入到任务表中。通过定时任务,扫描任务表,对逻辑进行补偿。一般用 mysql。数据量达到两千万以上的考虑分库分表。当业务逻辑执行失败时,可以做一些补偿处理。根据业务,设置重试的次数、重试的时间间隔。多次自动补偿,仍失败的,考虑人工补偿。高并发场景,考虑加入缓存。

2024-07-10 19:46:55 183

原创 Spring之 IoC、BeanFactory、ApplicationContext

Martin Fowler提出了DI(Dependency Injection,依赖注入)的概念用来代替IoC, 即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。

2024-07-07 16:07:26 400

原创 记一次接口超时

近期,收到线上告警,某个接口在中午12点时,突然超时了。

2024-07-07 00:10:40 192

原创 k8s 常用的命令

查找资源 kubectl get: 获取所有的资源,包括node、namespace、pod 、service、deployment等,可以展示一个或者多个资源。更新资源 kubectl apply :将配置更改应用于Kubernetes资源对象,适合进行部分更新。通过 shell 命令,进行容器。这个命令会显示 Deployment 的详细状态,包括它创建的 Pod 的信息。删除资源 kubectl delete:删除对应的资源。首先编辑 deployment-demo.yml ,

2024-07-04 00:05:24 500

原创 Spring源码(一) 如何阅读 Spring 源码

学习 Spring 的源码,也可以通过 SpringBoot 搭环境。不管是什么源码,最好写个 demo,跑起来,然后从常用的类和方法入手,跟踪调试。

2024-07-03 16:09:52 636

原创 PropertyDescriptor动态反射setter和getter设置对象属性

BeanWrapper和BeanWrapperImpl是 Spring的接口和类,可以通过BeanWrapper和BeanWrapperImpl获取 PropertyDescriptor。使用传统的反射 Method、Field等类去处理,需要对方法名进行大量拼接,比较麻烦。我们在开发的过程中,有时会需要动态地设置属性,也就是动态getter、 setter。可以使用 PropertyDescriptor.

2024-06-26 14:43:39 317

原创 后端如何减少生产问题以及如何处理生产问题

后端如何减少生产问题以及如何处理生产问题。

2024-06-26 11:08:12 567

原创 windows 安装 Kubernetes(k8s)

如果启动不了,删除 .minikube (路径一般是 C:\Users\Administrator\.minikube )这个文件,再重新启动。详情见: https://blog.csdn.net/sinat_32502451/article/details/133026301。通过 docker 安装 kicbase,启动 minikube。下载地址:https://github.com/kubernetes/minikube。启动 minikube之后,就可以使用 kubectl 的命令了。

2024-06-26 00:04:39 428

原创 优惠券核销业务

优惠券核销业务,包含 买券,券核销,退券,退款,过期自动退。

2024-06-21 16:54:25 363

原创 接口异步回调

比如 , 系统A 的 A1接口调用 系统B 的 B1接口, 系统B在完成功能后,系统B 回调系统A 的 另一个接口 A2。如果先调用系统 B,有可能系统 B 回调太快, 系统 A的数据表还没插入成功,导致数据没有更新成功。如果系统A 需要在数据表插入数据, 最好先插数据,再调用 系统 B,最后根据回调结果更新数据表。比如逻辑更新成功,返回一个特定的响应码code,这样第三方系统就不再回调了。执行逻辑成功后终止回调,可以减少对系统的网络连接,节省系统的资源。有些系统会要求在逻辑成功后,终止回调。

2024-06-21 13:54:02 174

原创 k8s容器启动不了,一直重启, 报红提示Not Ready

k8s容器启动不了,一直重启, 报红提示Not Ready容器启动不了,一直重启,报红提示 Not Ready。反复多次重启后,才能够启动成功。发现是 启动时间过长,不断达到了失败阈值,于是会不断重启。将 failureThreshold、 initialDelaySeconds、periodSeconds 这几个参数设置大一些,就可以启动了。

2024-06-20 16:47:46 296

原创 k8s探针类型及探针配置

用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,则kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。如果启动探针失败,kubelet 将杀死容器,容器服从其重启策略进行重启。

2024-06-20 16:45:23 256

原创 如何提高工作效率?

像飞书一类的办公软件,可以设置 状态为 “请勿打扰” ,在一小时内,屏蔽消息。不是所有的事情都必须做的,有些鸡毛蒜皮,没有价值的事情,可以不做。依赖他人的事情先做。不是所有的事情,都必须由你来做。没有价值的事情,可以拒绝。重要的事情,比如有利于个人成长的事情,可以多做,优先做。在时间非常紧张时,可以屏蔽所有消息,专心做事。在工作中,时间紧张时,及时交付才是最重要的。不重要的事情,组织要求做,那就快速做完。轻重缓急,优先做高优先级的事情。不相干的工作群消息,屏蔽。优先级低的,先放一边。过多的消息,影响专注。

2024-06-10 00:14:09 184

原创 使用Redis缓存需要注意的地方

缓存击穿(Hotspot Invalid),是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到数据库。缓存雪崩 (Cache Avalanche) :是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。如果更新数据库的数据之后,没有处理缓存,那么在查询时,查到的还是缓存中的旧数据,这就会导致缓存和数据库的不一致。如果不设置过期时间,缓存的内存就会越占越多,最后内存用完了,就没法缓存了。

2024-06-08 12:35:30 611

原创 java开发常用代码

详情见: https://blog.csdn.net/sinat_32502451/article/details/139417740。详情见: https://blog.csdn.net/sinat_32502451/article/details/133039513。详情见: https://blog.csdn.net/sinat_32502451/article/details/138199660。

2024-06-05 22:54:29 300

原创 java类型转换

类型转换虽然很简单,但是还是有些小细节要多注意。

2024-06-03 16:07:25 396

原创 系统稳定性概览

如果存在大量的永久key,会占用过多的redis内存空间。慢sql会长时间占用 数据库连接数,如果项目中有大量的慢sql,那么可用的数据库连接数就会变少,进而会影响业务。系统在同一时间,能处理的请求数量是有限的,高耗时接口会长时间占用请求数量,影响系统可用性。微服务,通过traceId 链路追踪,分析在各个服务的耗时。阿里云告警、webhook推送告警、接口错误率告警、接口超时告警、错误日志告警。对于要求低延时的业务,及时关注 kafka的消息堆积。系统稳定性,包括:监控、 告警、慢sql、耗时接口。

2024-05-30 22:18:43 391

原创 限流及限流算法

限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。滑动窗口算法:将时间窗口分为多个小窗口,每个小窗口都有自己的计数器。随着时间的滑动,过期的小窗口数据被删除,这样可以更精确地控制流量。滑动窗口所允许通过的请求数:当前窗口的请求数 + 之前窗口的请求数* 滑动窗口和之前窗口的重合率。缓存:缓存的目的是提升系统访问速度和增大系统处理容量。漏桶算法,有一个固定容量的漏桶。限流是高并发的处理方法之一。

2024-05-27 00:11:30 167

原创 Mysql自增id、uuid、雪花算法id的比较

雪花算法生成的 id,包括 符号位(1位),时间戳( 41位) ,数据中心ID (5位), 机器ID(5位), 序列号(12位)。序列号 (12位) :对于某个机器/进程, 每生成 一个ID,序列号就加1,这个数字每毫秒开始时都会被重置 为0。雪花id 的生成依赖于机器的时钟,如果时钟回拨或者时钟不同步,可能会导致生成的id不唯一。雪花id 占用的存储空间较大,通常为64位,如果作为主键,会占用更多的存储空间。雪花算法,可以生成唯一id,id 只包含数字, 长 64位。1.不适用于分布式系统。

2024-05-24 23:47:00 417

原创 系统之间的一致性问题 -- 支付成功显示未支付

支付之后,主动查询,如果查询到的支付状态是未支付,那么服务端可以把订单放到延时队列中,1秒后再次查询,如果1秒后还是未支付,再次放入延时队列。如果付款之后,展示 “未支付”, 用户可能会投诉,但是如果 付款之后,展示的是 “支付中”, 用户或许会主动刷新页面,等待最新的支付结果。客户端重试,不需要做太多次,可以每隔一秒查询一次支付结果,如果是未支付就继续查询,最多三次。用户支付之后,如果第三方系统的支付状态还是未支付,当前系统可以展示 为 “支付中”。接入第三方系统的支付接口,支付成功后,却显示未支付。

2024-04-26 16:04:13 297

原创 java8 日期Date、LocalDate、LocalDateTime、字符串String的转换

【代码】java8 日期Date、LocalDate、LocalDateTime、字符串String的转换。

2024-04-25 21:06:31 318

原创 java8 LocalDateTime

LocalDateTime: 可以设置含年月日时分秒的格式 , 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的。LocalDate: 只能设置仅含年月日的格式,表示没有时区的日期, LocalDate是不可变并且线程安全的。LocalTime: 只能设置仅含时分秒的格式,表示没有时区的时间, LocalTime是不可变并且线程安全的。Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔。after 只在大于(>)情况下才为true (相等时不会)

2024-04-25 21:04:33 608 1

原创 intellij idea 使用git的 cherry pick 摘取其他分支的comment

如果想把 feature_v1.0 分支的comment 摘到 feature_v1.0_new 分支上,

2024-04-04 11:37:58 514

原创 intellij idea 使用git ,快速合并冲突

可以选择左边的远程分支上的代码,也可以选择右边的代码,而中间是合并的结果。

2024-04-04 11:28:40 390

原创 dubbo 统一异常处理

指定切入点,进行环绕通知。如果有异常,就捕获后处理。

2024-04-03 23:42:56 428

原创 intellij idea 使用git撤销(取消)commit

Soft 回退到某个版本,只回退了 commit 的信息,不撤销git add ,不删除工作空间的改动代码。如果还要提交,直接 commit。点击 Git 分支,选择 Remote 的分支, Reset Current Branch To Here。Hard 彻底回退,本地源码也会变成上一个版本内容,不保留之前 commit 的代码。Git,选择分支后,右键 Undo Commit ,会把这个 commit 撤销。选中分支, 新建 分支,避免后续因为操作不当,导致内容丢失。接着选择 是否保留本地的代码。

2024-04-01 23:22:43 1398

原创 dump文件分析OOM及线程堆栈

可以看到,在出现 OutOfMemoryError 异常错误时进行了堆转储,导致 OutOfMemoryError 异常错误的线程 是哪一个。点击 Profiler ,再点击 Open Snapshot ,选择 上面的 dump 文件 D:/heapdump.hprof。打开 VisualVM 后,点击左上角的图标 ,装入, 文件名选择 之前的 dump 文件 D:/heapdump.hprof。这里的 D:/heapdump.hprof ,就是 dump 文件保存的路径。

2024-03-27 22:52:52 934

原创 SonarBug修复

解决方法:不要直接抛Error,RuntimeException/Throwable/Exception这样的通用的异常,使用更具体的异常代替。解决方法:使用BigDecimal.valueOf()代替。解决方法: 重写equals()必须重写hashCode()。IDEA可以通过Alt+Insert自动生成。解决方法:使用(long)类型转换,或者在数字后面加上L转换类型。解决方法: logger.error(“错误提示字符串:”,e);解决方法: 浮点数不应该用==去比较,可能会精度丢失导致不准确。

2024-03-26 14:28:22 1404

原创 feign设置超时时间

调用 feign ,会调用 FeignClientFactoryBean 类的 feign() 方法,再用 configureFeign() 配置 feign。feign的 本质是 调用 http请求,如果不设置超时时间,请求长时间连接着,占用系统资源,影响用户体验。feign设置超时时间,可以通过 Request.Options 来设置。

2024-03-20 17:54:13 731

原创 feign请求添加拦截器

在 configuration 属性中,指定配置为 以上设置的 FeignInterceptorConfigDemo 即可添加拦截器。Feign 注解 @FeignClient 的 configuration 属性,可以对 feign 的请求进行配置。feign 的拦截器,需要实现 RequestInterceptor 接口,重写 apply() 方法。feign 请求添加拦截器,也可以通过这个 configuration 属性 来指定。apply() 方法参数为 RequestTemplate。

2024-03-18 10:37:33 1255

原创 策略模式代码示例(二)

策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式 ,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。

2024-03-01 15:45:21 598

原创 统一异常处理@ControllerAdvice及参数校验@Validated

直接throws Exception,抛的异常太过宽泛,最好能抛出准确的异常,比如throws IOException之类。Controller层的参数通常都需要检验,经常会看到大量的判空,然后返回错误提示,比如"名字不能为空"之类的提示。但是,如果在Controller层进行大量的捕获异常,可能会出现大量的非常多的try catch代码块。阿里巴巴的java规范中有一条,“最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。而且,异常一直向上抛,上层的类还是得处理这些异常。

2024-02-28 14:23:02 452

原创 电商业务知识总结(三)--退货退款

退款单号,订单号,子订单号,退款状态,退款金额,用户id,用户名称,支付方式,退款的银行流水号,退款原因,退款完成时间。必须做好事务处理,订单状态、退款单状态等状态同时成功,或者同时失败,避免出现 退货不退款的客诉,或者 退款不退货的资损。做好风控,针对账号和ip进行记录和监控,发现有异常行为的账号或者ip,及时做名单限制,避免黑产。一般情况,不建议有 退款失败 的状态,可以用 退款处理中。产品需要明确,退款是否存在时间限制,像支付宝,过了交易期限,是不支持退款的。退款可以分为 仅退款、退货退款。

2024-02-22 00:03:47 476

原创 电商业务知识总结(二)--订单和支付

最好设置冷库和热库,时间比较久远的订单,可以归档,放到冷库,避免数据越积越多,影响查询和更新等业务的响应速度。调用第三方的支付,添加支付单后,会返回支付要素,用户输入密码确认,之后系统会收到第三方系统的支付回调。支付成功,收到回调通知,修改订单状态,执行业务逻辑,需要保证事务性,要么全部成功,要么全部失败。调用第三方添加支付单,返回支付要素,用户输入密码后,再根据支付回调,更新订单状态。订单号,用户id,支付流水号,支付状态,支付方式,支付金额,支付回调时间。取消订单,或者退款后,订单变为关闭状态。

2024-02-22 00:02:44 664

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除