Q & A
文章平均质量分 85
对开发中越到的问题及解决的一种记录
carl-zhao
I never grew up, but i never stop growing.
展开
-
Spring Boot 项目启动指定 HTTP 端口的几种方式
Spring 项目当中,可以通过来获取到WebServer.Tomcat 的实现类是。在这个对象里面,可以通过属性它是一个。可以指定容器启动暴露的端口。自定义 TomcatConnectorCustomizer}不仅仅实现了,同时他也实现了。而且 Spring Boot 来提供了这个接口来定制化,同时也是实现了的子接口。这个接口是可以对 WebServer 进行配置化,包括 Web 容器的端口。自定义 WebServerFactoryCustomizer} };}其实自定义它的起始类是通过。原创 2022-09-22 18:17:59 · 7502 阅读 · 0 评论 -
Spring Webflux 构建响应式 Restful Web 服务
本指南将引导您完成创建“Hello, Spring!”使用Spring WebFlux的rest式web服务(Spring Boot 2.0的新版本),然后使用WebClient使用该服务(Spring Boot 2.0的新版本)。原创 2022-07-30 20:03:34 · 957 阅读 · 0 评论 -
Spring 集成嵌入式数据库方便单元测试
``org.springframework.jdbc.datasource.embedded `` 包提供了对嵌入式 Java 数据库引擎的支持。本机提供了对HSQL、H2 和 Derby 的支持。还可以使用可扩展API插入新的嵌入式数据库类型和 DataSource 实现。嵌入式数据库在项目的开发阶段非常有用,因为它具有轻量级的特性。优点包括易于配置、快速启动时间、可测试性以及在开发期间快速演变SQL的能力。...原创 2022-07-30 10:23:30 · 798 阅读 · 0 评论 -
解决 @RefreshScope 导致定时任务注解 @Scheduled 失效
之前在一个技术微信群看到一个伙伴提了一个问题。那就是 Spring Cloud 项目在标注了 @RefreshScope 与 @Configuration 类中 @Scheduled 的方法。当配置中心修改了配置时,这个定时调度会失效。下面我们来看一下案方现场。...原创 2022-07-26 13:11:53 · 4528 阅读 · 1 评论 -
Mysql 由于 Java 日期 LocalDateTime 数据精度引发的线上问题
最近在公司开发的项目是对账系统,其中就包括每日(T+1)对账。每日对账就是对前一日期产生的数据对于核对。举个具体的例子就是:在第三方支付公司,里面会产生支付里面的支付订单与下载渠道(微信、支付或者其它第三方支付)的每日交易账户需要进行对比。关于微信支付的 下载交易账单 地址。支付宝或者其它的下载交易单内容类似,只是文件格式不一样。原创 2022-05-10 02:47:22 · 1413 阅读 · 1 评论 -
使用 Spring AnnotationUtils 解决代码获取类元数据信息
昨天有一个小伙伴遇到一个问题。他最开始是通过在类上面添加注解(这个类纳入了 Spring 容器的管理),然后再通过继承 Spring 容器的扩展类 ApplicationObjectSupport 找到 Spring 容器中所有标注了之前提到的注解。后面解析这个注解,然后把这个注解标注的唯一值和当前对象实例放到一个 MAP 当中。通过这样的方式就实现了策略模式,通过注解上面的标注唯一的值到 ApplicationObjectSupport 的继承类里面获取需要的实例。上面就是出现问题的前提,后面在策略类上原创 2022-05-06 23:06:01 · 2335 阅读 · 0 评论 -
Java Google Sheet API
完成本页其余部分描述的步骤,创建一个简单的Java命令行应用程序,向 Google Sheets API发出请求。原创 2022-04-20 17:17:12 · 2304 阅读 · 6 评论 -
MySQL 根据某一个或者多个字段查找重复数据
之前上线了一个类似于微信或者支付宝账单的功能,其中有一张统计表。里面根据用户ID、年、月查询出来当月的订单数以及订单总金额。当时在创建索引的时候,是根据用户ID、年、月字段创建的联合索引。原创 2022-01-04 21:31:59 · 2704 阅读 · 0 评论 -
嵌套模板设计模式优雅解决通用调用第三方服务方案
最近公司正在服务化,因为公司是建筑行业的产业互联网。所以对于工人进出场考勤或者核心链路上都是需要用户进行证明“我是我”这个问题。那么就涉及到调用 ``实名认证``、``人脸比对``、``人脸质量``、``身份证OCR`` 等第三方服务。原创 2021-12-24 23:50:27 · 1114 阅读 · 0 评论 -
雪花算法(snowflake)容器化部署支持动态增加节点
先简单的介绍一下雪花算法,雪花算法生成的Id由:1bit 不用 + 41bit时间戳+10bit工作机器id+12bit序列号,如下图:不用:1bit,因为最高位是符号位,0表示正,1表示负,所以这里固定为0时间戳:41bit,服务上线的时间毫秒级的时间戳(为当前时间-服务第一次上线时间),这里为(2^41-1)/1000/60/60/24/365 = 49.7年工作机器id:10bit,表示工作机器id,用于处理分布式部署id不重复问题,可支持2^10 = 1024个节点序列号:12bit,用原创 2021-12-12 05:52:11 · 5091 阅读 · 6 评论 -
通过 MDC 让你方便的跟踪你的定时任务日志
当我们程序出现了 debug 的时候,我们一般的解决方法就是查看日志。在开发环境还好,我们本地启动服务一般只会有一个请求,查看日志或者本地 debug 都非常方便。但是如果我们是线上发生了问题,这个时候请求量就比较多。如果我们的调用链比较长的话,要把整个日志关联起来就不太方便。这个时候我们就需要使用到日志当中的 MDC 了。原创 2021-11-30 23:20:12 · 1415 阅读 · 0 评论 -
使用 fastjson 解决字段串对象空值返回空数组问题
我们系统当中地理信息使用高德的 城市编码表。项目的新需求就是输入地址能够返回找到对应的城市,其实高德开放 API 提供了一个 地理/逆地理编码 接口是满足这个需求的。但是它我们使用这个接口的时候遇到了一个问题。就是一个属性如果有值就会返回字符串,如果没有值就会返回空数据。比如:{ "status": "1", "info": "OK", "infocode": "10000", "count": "1", "geocodes": [ {原创 2021-08-08 10:39:26 · 2391 阅读 · 1 评论 -
Spring EL 表达式隔离不同环境的 RocketMQ
项目之前使用的是 RabbitMQ 作为消息中间件用来解耦服务之间的调用,现在需要对消息中间件进行升级决定采用 RocketMQ。RocketMQ 相比 RabbitMQ 更具有优势,当然大家可以在网上查找到相关资料。这里就不在赘述了。今天主要是讲如何使用 Spring EL 表达式来隔离不同环境的 RocketMQ 的。因为在非生产环境我们为了优化资源的效果,只部署了一套 RabbitMQ 环境。但是非生产环境有多套环境:dev(开发环境)、test(测试环境)、pre(预生产环境)。所以我们在使用 R原创 2021-08-06 00:45:02 · 2047 阅读 · 1 评论 -
让定时任务 xxl job 里面的任务灵活起来
在项目当中使用定时任务进行业务补偿是一种很常见的需求。对于一个任务,我们常常把开始时间或者结束时间固定在代码里面。如果出现了定时任务漏掉了数据。比如:定时任务:查询 1 天前到当前系统时间遗漏的数据:在 3 天前有一些数据还没有执行完成如果你没有把开始时间设置成动态变量这个问题就无法解决。你可以通过把开始时间配置在注册中心当中,查询时间就是:3天前 ~ 系统当前时间。这个 SQL 的查询系统就比较低下了。还有一种方式就是开始时间与结束时间都设置成变量配置在注册中心当中,这样就可以动态定制你的任务原创 2021-06-30 21:11:15 · 1753 阅读 · 0 评论 -
Spring Boot 自定义 Hibernate 验证器优雅验证枚举类型的请求参数
当我们后端 restful 开发的时候,可以使用原创 2020-11-25 21:33:21 · 806 阅读 · 0 评论 -
Spring Boot 中使用 MDC 追踪一次请求全过程
MDC 的全称是 Mapped Diagnostic Context,映射诊断上下文(MDC)。本质上是由日志框架维护的映射,其中应用程序代码提供键-值对,然后日志框架可以在日志消息中插入这些键-值对。MDC数据在过滤消息或触发某些操作方面也非常有用。管理开销。SLF4J支持MDC,即映射的诊断上下文。如果底层日志框架提供MDC功能,那么SLF4J将委托给底层框架的MDC。注意,此时,只有log4j和logback提供MDC功能。如果底层框架不提供MDC,例如java.util。日志记录后,SLF4J仍将原创 2020-10-31 22:16:13 · 11742 阅读 · 0 评论 -
由 RedisTemplate 事务 enableTransactionSupport 引发的血案
在最近的项目当中因为使用了类似字典表的数据所以我使用的 Spring Farmework 当中的 Cache 抽象,通过 Redis 来做为缓存。因为原有项目当中配置了 Redis,而且项目是基于 Spring Boot 构建的,并没有去除 Redis 的自动依赖(RedisAutoConfiguration)。导致有些 Redis 的有些类是基于项目中自己配置的 RedisTemplate,而有些又是引用的 Spring Boot 中 Redis 的自动配置生成的 RedisTemplate。所以我就把原创 2020-09-16 21:55:01 · 3204 阅读 · 0 评论 -
Spring Cloud Gateway 自定义 ReadBodyPredicateFactory 实现动态路由
在互网企业当中网关的重要性我就不再赘述了,相信大家都比较清楚。我们公司网关采用的是 Spring Cloud Gateway。并且是通过自定义 RouteLocator 来实现动态路由的。路由规则是请求参数里面的 bizType,比如接收 JSON 格式体的请求对象并且业务方请求的是创建支付订单接口,下面就是业务方需要传递的参数:{ "bizType" : "createOrder", .... 其它业务参数 }下面就是读取 requestBody 里面的主动参数,然后解析请求对象里面的 biz原创 2020-08-27 09:42:13 · 4890 阅读 · 5 评论 -
Spring Boot 通过 Mvc 扩展方便进行货币单位转换
由于公司是支付平台,所以很多项目都涉及到金额,业务方转递过来的金额是单位是元,而我们数据库保存的金额单位是分。一般金额的流向有以下几个方向:- 外部业务方请求我们服务,传递过来的金额单位是元,需要把元转换成分。比如:下单接口。- 内部系统之间的流转,不管是向下传递还是向上传递系统间的流程都是分,不需要扭转。比如:调用支付引擎(向下传递),支付引擎回调收单业务(向上传递)。- 向业务方返回数据,这个时候需要把分转换成元。比如:商户调用查询订单接口。原创 2020-08-20 23:30:19 · 1201 阅读 · 3 评论 -
AWS 服务报 502 错误排查结果
如下是8月18日 系统报错502 Bad GateWay问题定位、追踪、方案确认等:一、现象:1点25分左右系统报警5xx错误;二、定位:排查过程查看ELB日志确认错误来源于(商户API:查询支付结果及创建跨境支付单);查询Pinpoint、Grafana及日志系统各项指标正常;三、跟踪及分析:查看ELB监控面板发现,502错误一直都存在,分布比较零散(大概的发生概率:万分之一(一万个请求约1次502错误)]);确认调用链路确认错误区域:商户 —> ELB —> 业务系统;原创 2020-08-19 22:36:51 · 2427 阅读 · 0 评论 -
Spring Boot Cache 集成 Spring Data Redis 1.x 与 2.x 的差异
自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,在此之前一般通过AOP实现。通过 Spring Cache 可以很方便的管理我们的缓存。使用Spring Cache的好处:提供基本的Cache抽象,方便切换各种底层Cache;通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;提供事务回滚时也自动回滚缓存;支持比较复杂的缓存逻辑;内存缓存 Redis 由于它支原创 2020-08-13 22:41:32 · 1001 阅读 · 1 评论 -
Spring Cloud Gateway 之 Filter 不调用过滤链直接返回结果
Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。网关提供API全托管原创 2020-07-23 08:59:08 · 8161 阅读 · 3 评论 -
优雅的进行线上数据订正
在系统开发上线过程中,难免会遇到在测试过程中没有覆盖到的场景,而且还有可能生成脏数据。这个时候就需要对错误数据进行一一修改了。如果遇到需要修改的数据量比较少,那么可以进行手动的编辑 SQL。如果数据量过大的时候,进行手动编辑 SQL 不仅耗时还很容易出现错误。做为一个 coder 我们可以使用程序来解决这个问题。原创 2020-07-08 22:46:43 · 1171 阅读 · 0 评论 -
Spring Boot 通过 ThreadLocal、HandlerInterceptor、RequestBodyAdvice 优雅解决项目公共参数问题
因为公司是做境外第三方支付,所以涉及到国际化问题。页面不变的值可以由前端进行处理,对于后端如果遇到异常信息需要产品经理提供对应的显示信息。这个显示信息可以根据不同的异常定义不同的异常码,然异常信息显示国际化信息保存到数据库。根据用户不同的国家请求动态的去数据库获取这个值。原创 2020-04-26 23:45:52 · 2473 阅读 · 0 评论 -
Spring Boots 集成 Sharding Jdbc 使用复合分片
随着业务的逐渐增大,原有保存在单表的数据量也日益增强。数据库数据会随着业务的发展而不断增多,因此数据操作,如增删改查的开销也会越来越大。再加上物理服务器的资源有限(CPU、磁盘、内存、IO 等)。最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。换句话说需要合理的数据库架构来存放不断增长的数据,这个就是分库分表的设计初衷。目的就是为了缓解数据库的压力,大限度提高数据操作的效率。原创 2020-04-25 13:13:17 · 2301 阅读 · 7 评论 -
RabbitMQ 延迟队列实现订单自动关闭
1、延迟队列延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。在电商系统中,当用户提交订单超过 30 分钟未支付就是自动取消。一般的解决方案是使用定时任务来轮训数据库,然后找到过期的订单来修改订单状态。当系统的数据量小的时候下没有什么问题。但是如果数据量一大这种方式就会特别消耗资源。并且这...原创 2020-04-22 23:33:45 · 3375 阅读 · 0 评论 -
模仿 Spring 注解事务写出优雅多数据源切换代码
随着公司业务的不断扩大,核心业务的数据量也是爆炸性增长。因为数据库选用和大多数据互联网公司一样使用的是 Mysql 很多表的数据量都超过了 1 kw,所以决定对大表进行数据扩容。并且在容量扩容的时候决定使用双写方案。在调研的时候,有三个方案可以选择:Sharding-jdbc:模仿分片处理,继承 AbstractShardingPreparedStatementAdapter 重写 jdbc...原创 2020-03-29 12:56:18 · 1194 阅读 · 1 评论 -
最佳实践 -- Dubbo 服务化进程的一点思考
最近主要负责公司的 dubbo 服务改造。在改造过程中,涉及到很多核心系统的编码。改造的系统涉及到核心系统,并且改造的系统一多,难免会产生一点胡思乱想。下面我就分享一下我在项目改造过程中的一点胡乱的想法。需要对大家有帮助:1、统一的打包方式对于之前项目中使用 restful 进行交互,项目的发布就没有版本这个概念。但在使用 dubbo 服务化就依赖版本这个概念。在项目中我们打包的方式和项目的版...原创 2020-03-19 08:42:04 · 672 阅读 · 4 评论 -
利用 Spring 自动类型转换与回调模式写出优雅的代码
当我们使用 dubbo 或者 feign 进行 RPC 调用用时,通常的调用模板方式如下:public BizResponse method(BizRequest request){ RpcRequest rpcRequest = buildRpcRequest(); RpcReponse reuslt = xxxFacade.invoke(rpcRequest); // 判断...原创 2020-03-14 18:08:57 · 1148 阅读 · 0 评论 -
多环境测试遇到的问题及解决方案
最近新到的公司由于在服务化,领导叫我调研并使用 apache dubbo 做微服务改造。因为之前的公司基本上都是使用的 dubbo,所以对于服务改造过程并不复杂。而且我还把自己的改造指南分享到公司内网 wiki。这次主要是和大家分享一下在服务改造之后在本地测试遇到的问题。因为我们使用的环境是 aws ,并且使用了 aws 提供的 redis 服务。主要是用来做分布锁及缓存作用,但是在本地调度的时...原创 2020-03-14 16:06:40 · 700 阅读 · 0 评论 -
Spring FactoryBean 创建的 Advisor 无法应用于增强
最近的工作重心是帮助公司做日志统一格式方面的工作。也就是规范日志,之前的日志文件只分为了 error.log 和 info.log。现在要把它更为细为分以下几种:more business log:细粒度的业务日志文件区分(Dao、Manage、Service、Web)method digest log:方法级别的日志摘要(对应业务日志的摘要日志)a call chain profile ...原创 2020-03-01 15:55:47 · 802 阅读 · 0 评论 -
Spring 无法代理 Mybatis 接口问题
最近公司正在开始平台化,需要统一打印日志格式。由于领导对于我的认可,把这件事情交给我来做。所谓统一日志格式主要是做以下几件事:more business log:细粒度的业务日志文件区分(Dao、Manage、Service、Web)method digest log:方法级别的日志摘要(对应业务日志的摘要日志)a call chain profile log:当前系统一次整个完整调用的层...原创 2020-02-29 21:09:11 · 872 阅读 · 1 评论