02 2021 档案
摘要:最近一个服务上线一个月后出现某个时间段响应延迟的问题,先看下监控数据: 这里有一点,单台实例的并发最高达到200是因为没修改spring boot中tomcat默认的最大线程数(默认是200)。 从上图可以看出21点—24点以及第二天08点—11点服务的延迟已经达到s级别,甚至严重时已经达到30多s
阅读全文
摘要:对于RPC的性能收集,以微博的motan和阿里的dubbo为例,也是通过intercept去做的。 motan的性能指标收集:使用的是motan中的扩展机制 //此处的spi使用的是weibo.com中的扩展 @SpiMeta(name = "pepperProfiler") @Activation
阅读全文
摘要:所有的性能收集其实都是基于aop的,对于jedisCluster性能(jedis的一样)的收集,因为其并没有提供类似于mybatis的intercept机制,所以只能手动实现可供收集性能数据的切面。 说到切面,第一个就会想到代理,接下来就通过cglib实现对jedisCluster的代理。 动态代理
阅读全文
摘要:mybatis的性能指标统计与Http类似,也是基于aop的方式,利用mybatis提供的intercept机制。直接看下Interceptor的定义: @Intercepts( value = { @Signature (type=Executor.class, method="update",
阅读全文
摘要:这一篇主要是介绍一种使用Prometheus收集服务健康状态指标的案例,以常用的Druid数据源为例。 先看几个公共类的定义: HealthStats:其中定义了MeterRegistry和namespace(用来区分不同的统计对象) public class HealthStats { priva
阅读全文
摘要:1、ImportBeanDefinitionRegistrar接口 该接口用来实现动态注入Bean,可以实现该接口,但是还要利用@Import进行导入才能实现Bean的注入。使用示例如下: 定义一个注解: @Retention(RetentionPolicy.RUNTIME) @Target(Ele
阅读全文
摘要:一、springBoot生命周期伴随的事件 springBoot的启动过程就是通过事件机制驱动的,可以通过监听这些事件做一些定制化的功能。因为springBoot已经成为众多中间件和框架的基础,所以了解其整个生命周期是很必要的,接下来就从源码的角度去分析它的整个启动流程。 二、源码分析 1、实例化S
阅读全文
摘要:这一篇看一下Prometheus对http请求的指标收集,先来看两个指标定义: (1)使用的指标类型: 这三种指标类型的特性在之前推荐的一篇关于Prometheus介绍的文章里有详细说明,这里简单回顾一下,gauge可以进行加减操作,反映指标的当前状态;counter只能增不能减,反映指标的计数,如
阅读全文
摘要:因为Prometheus是通过http接口的形式来采集数据的,所以需要向Prometheus server暴露端点。spring boot2.x版本在Actuator中集成了Prometheus,此外也可以手动向其暴露端点。接下来就说第二种。 @Spi public interface MeterR
阅读全文
摘要:这是一篇非常好的关于Prometheus的介绍文章,包括其架构、工作模式、数据模型等。 https://www.ipyker.com/2019/01/12/prometheus.html
阅读全文
摘要:java也有自己的SPI实现,但是有很多小毛病,比如:会一次性加载所有扩展实现,不能支持一些复杂的元数据表达,据说多了类加载器同时加载会有并发问题(没有考证过)。所以很多框架都提供了SPI机制供使用者自己扩展,例如Dubbo,使用SPI还可以实现按需加载扩展点。之前看过Dubbo的SPI实现,其实它
阅读全文
摘要:Motan是新浪微博研发并开源的一个RPC框架,与Dubbo相比,他更轻量级一些,代码也更少一些,但也五脏俱全。 Motan在GitHub上的项目地址:https://github.com/weibocom/motan 关于Motan的使用,可以看官方Wiki:https://github.com/
阅读全文
摘要:业务需求:为了防止业务中关键接口被刷(对于网赚类业务,提现和收益类接口属于关键接口),客户端和服务端采用非对称加密进行安全校验。 思路:1、为不影响产品使用体验,仅对关键接口(关键接口一般非频繁操作)进行加密 2、将时间戳作为加密项之一,防止同一个签名可以使用多次 3、服务端对定义的关键接口请求做校
阅读全文
摘要:场景:前端在request body中传了多个参数,为了方便使用@RequestBody映射成相应的参数对象。 @PostMapping(value = "/game/sync") public WebMessage gameMsgReport(UserInfo userInfo,@RequestB
阅读全文