- 博客(41)
- 收藏
- 关注

原创 高可用服务设计|如何应对缓存穿透|玩转布隆过滤器
一、背景用户中心是授权逻辑与用户信息相关逻辑构建的应用。分布式系统中,大多数业务都需要和用户中心打交道,为了保证用户中心服务的高可用,避免不了做缓存、导入搜索引擎从而降低数据库的压力。然而有些不经过用户中心授权的业务场景查询用户中心的数据,可能引发大量无效的查询,发生缓存穿透,直接对搜索引擎和数据库造成压力。如何解决用户中心缓存穿透的问题呢?接下来就着重说一下布隆过滤器是怎么“隔档”这些无效查询...
2020-04-13 20:23:24
312

原创 Java分布式IP限流和防止恶意IP攻击方案
前言限流是分布式系统设计中经常提到的概念,在某些要求不严格的场景下,使用Guava RateLimiter就可以满足。但是Guava RateLimiter只能应用于单进程,多进程间协同控制便无能为力。本文介绍一种简单的处理方式,用于分布式环境下接口调用频次管控。如何防止恶意IP攻击某些暴露的接口呢(比如某些场景下短信验证码服务)?本文介绍一种本地缓存和分布式缓存集成方式判断远程IP是否为...
2020-03-29 19:35:38
1832
1

原创 SpringMvc @Validated注解执行原理
@Validated和@Valid对比Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。在检验Controller的入参是否符合规范时,使用@Validated或者@Val...
2020-03-25 23:39:02
2673

原创 HttpClient连接池的一些思考
前言使用apache的httpclient进行http的交互处理已经很长时间了,而httpclient实例则使用了http连接池,想必大家也没有关心过连接池的管理。事实上,通过分析httpclient源码,发现它很优雅地隐藏了所有的连接池管理细节,开发者完全不用花太多时间去思考连接池的问题。Apache官网例子CloseableHttpClient httpclient = Htt...
2019-10-08 00:09:44
1700

原创 Redis分布式锁实战
什么是分布式锁在单机部署的情况下,要想保证特定业务在顺序执行,通过JDK提供的synchronized关键字、Semaphore、ReentrantLock,或者我们也可以基于AQS定制化锁。单机部署的情况下,锁是在多线程之间共享的,但是分布式部署的情况下,锁是多进程之间共享的。那么分布式锁要保证锁资源的唯一性,可以在多进程之间共享。分布式锁特性保证同一个方法在某一时刻只能在一台机...
2019-08-03 20:03:25
293

原创 安全优雅的RESTful API签名实现方案
安全优雅的RESTful API签名实现方案1、接口签名的必要性在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改,数据是否已经过时,数据是否可以重复提交等问题。其中我认为最终要的还是数据是否被篡改。在此分享一下我的关于接口签名的实践方案。2、项目中签名方案痛点每个接口有各自的签名方案,不统一,维护成本较高。没有对消息实体进行签名,无法避免数据被篡改。无法...
2019-06-20 23:31:53
2753
1

原创 基于zookeeper实现分布式配置中心(二)
上一篇(基于zookeeper实现分布式配置中心(一))讲述了zookeeper相关概念和工作原理。接下来根据zookeeper的特性,简单实现一个分布式配置中心。配置中心的优势1、各环境配置集中管理。2、配置更改,实时推送,jvm环境变量及时生效。3、依靠配置变更,动态扩展功能,减少二次上线带来的成本。4、减少开发人员、运维人员修改配置带来的额外开销。...
2019-06-06 16:33:00
492

原创 基于zookeeper的分布式配置中心(一)
最近在学习zookeeper,发现zk真的是一个优秀的中间件。在分布式环境下,可以高效解决数据管理问题。在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具。本文首先对zk的工作原理和相关概念做一下介绍,然后带大家做一个简单的分布式配置中心。zookeeper介绍 zookeeper是一个分布式协调框架,主要是解决分布式应用中经...
2019-05-19 02:39:24
988
原创 Appium和Python实现蚂蚁森林自动化收取能量
准备环境 Window10系统 Appium1.21.0 AndroidSDK r24.1.1 Python3.7.5 支付宝apk文件查看支付宝apk包信息使用android sdk aapt命令查看支付宝apk包信息,后面会用到,如下。Android Asset Packaging ToolUsage: aapt l[ist] [-v] [-a] file.{zip,jar,apk} List contents of Zip-compati.
2021-07-24 20:09:51
1339
6
原创 畅谈一下告警
一、为什么要告警一个业务系统维护了很长时间了,指不定什么时候会出现问题。不过有些系统也是依赖微信、支付宝平台的,大平台都有自身的监控和告警能力帮忙分析和定位商户系统问题,但并不是所有场景都能涵盖到。所以个人负责的业务模块需要制定合理的告警机制,系统发生故障要第一时间知道,而不是被通知。二、告警指标常见的指标有请求量、失败量、平均耗时等,其他指标可以根据业务自身的特点来提取上报。三、告警阈值告警的目的是出问题了,能够马上主动发现问题,简单的问题甚至可以在被投诉和其他人发现前就能修复了。.
2021-04-05 14:58:31
1408
原创 彻底理解Spring如何解决循环依赖
一、Spring bean生命周期可以简化为以下5步。1、构建BeanDefinition2、实例化 Instantiation3、属性赋值 Populate4、初始化 Initialization(BeanPostprocessor -> Aware,init)5、销毁 Destruction二、Spring 三级缓存作用2.1、一级缓存/** Cache of singleton objects: bean name to bean instance..
2020-12-21 00:52:59
699
原创 快速掌握Java8 Stream函数式编程技巧
函数式编程优势“函数第一位”,即函数可以出现在任何地方。 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值。 让代码的逻辑更清晰更优雅。 减少了可变量(Immutable Variable)的声明,程序更为安全。 支持惰性计算。Lambda语法三部分一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数 一个箭头符号:-> 方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例
2020-10-18 15:46:10
364
原创 灵感来袭,基于Redis的分布式延迟队列(续)
背景上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于JavaDelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟Java DelayQueue是占用内存的。针对现用方案的不足,于是利用Redis的Sorted Set数据结构简单实现分布式延迟队列。Sorted SetRedis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis.
2020-10-04 19:12:38
334
原创 灵感来袭,基于Redis的分布式延迟队列
一、延迟队列延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费。比如1分钟之后发送短信,发送邮件,检测数据状态等。二、RedissonDelayed Queue如果你项目中使用了redisson,那么恭喜你,使用延迟队列将非常的简单。基于Redis的Redisson分布式延迟队列(Delayed Queue)结构的RDelayedQueueJava对...
2020-03-28 19:43:45
680
原创 【赶快收藏】Hystrix实战,优雅提升系统的鲁棒性
目录背景Hystrix简介Hystrix功能健康状态系统请求被阻塞系统舱壁隔离模式(Bulkheads)服务雪崩隔离架构降级-触发fallback隔离策略熔断器请求结果cacheHystrix设计点自助服务系统查询改造方案参考链接背景最近接手了一个系统,其功能都是查询。...
2019-09-23 01:35:35
219
原创 Springboot国际化信息(i18n)解析
国际化信息理解国际化信息也称为本地化信息 。 Java 通过 java.util.Locale 类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 。举个例子吧,比如在发送一个具体的请求的时候,在header中设置一个键值对:"Accept-Language":"zh",通过Accept-Language对应值,服务器就可以决定使用哪一个区域的语言,找到相...
2019-09-14 23:35:27
11411
1
原创 Springboot源码——应用程序上下文分析
前两篇(Spring MVC源码——Root WebApplicationContext和Spring MVC源码——Servlet WebApplicationContext)讲述了springmvc项目创建上下文的过程,这一篇带大家了解一下springboot项目创建上下文的过程。SpringApplication引导类SpringApplication类用于启动或者引导spr...
2019-05-13 01:18:16
396
转载 Spring MVC源码——Servlet WebApplicationContext
上一篇笔记(Spring MVC源码——Root WebApplicationContext)中记录了下 Root WebApplicationContext 的初始化代码.这一篇来看 Servlet WebApplicationContext 的初始化代码DispatcherServlet是另一个需要在web.xml中配置的类, Servlet WebApplicationContex...
2019-05-07 13:24:03
196
转载 Spring MVC源码——Root WebApplicationContext
Spring MVC源码——Root WebApplicationContext 打算开始读一些框架的源码,先拿 Spring MVC 练练手,欢迎点击这里访问我的源码注释, SpringMVC官方文档一开始就给出了这样的两段示例: public class MyWebApplicationInitializer implements WebApplicationInitial...
2019-05-06 22:57:26
1807
原创 线程池优化之充分利用线程池资源
一、前言 最近做了电子发票的需求,分省开票接口和发票下载接口都有一定的延迟。为了完成开票后自动将发票插入用户微信卡包,目前的解决方案是利用线程池,将开票后插入卡包的任务(轮询分省发票接口,直到获取到发票相关信息或者轮询次数用完,如果获取到发票信息,执行发票插入微信卡包,结束任务)放入线程池异步执行。仔细想一想,这种实现方案存在一个问题,线程池没有充分的利用。为什么没有充分的利用?下面详细的分...
2019-04-06 23:11:07
612
原创 Spring异步调用原理及SpringAop拦截器链原理
一、Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AsyncConfigurationSelector.class)public @interface EnableAsync { ...
2019-03-18 17:34:30
709
原创 使用PdfBox实现pdf转图片,解决中文方块乱码等问题
一、引入依赖<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.13</version></dependency>
2019-03-10 23:54:18
5659
2
原创 Spring BPP中优雅的创建动态代理Bean
一、前言 本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean。通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFactoryBean创建的代理Bean的区别。二、基本测试代码 测试实体类,在BPP中创建BppTestDepBean类型的代理Bean。@Componentpublic stat...
2019-03-03 00:55:05
237
转载 转载:ThreadPoolExecutor 源码阅读
前言 之前研究了一下如何使用ScheduledThreadPoolExecutor动态创建定时任务(Springboot定时任务原理及如何动态创建定时任务),简单了解了ScheduledThreadPoolExecutor相关源码。今天看了同学写的ThreadPoolExecutor 的源码解读,甚是NB,必须转发一下。读了一下 ThreadPoolExecutor 的源码(JDK 11...
2019-02-12 14:18:04
260
原创 Springboot定时任务原理及如何动态创建定时任务
一、前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝。分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件。因为是多省份,服务器、文件名规则、数据规则都不一定,所以要做成可配置是有一定难度的。数据规则这块必须强烈要求统一,服务器、文件名规则都可以从配置中心去读。每新增一个省份的配置,后台感知到后,动态生成定时任务。二、Springboot引入定时任务核心配...
2019-02-07 22:06:08
11745
7
原创 SpringSecurity整合JWT
一、前言 最近负责支付宝小程序后端项目设计,这里主要分享一下用户会话、接口鉴权的设计。参考过微信小程序后端的设计,会话需要依靠redis。相关的开发人员和我说依靠Redis并不是很靠谱,redis在业务高峰期不稳定,容易出现问题,总会出现用户会话丢失、超时的问题。之前听过JWT相关的设计,决定尝试一下。二、什么是JWT JSON Web Token(JWT)是一个开放标准(RFC ...
2019-01-19 23:55:59
1234
原创 SpringMvc接口中转设计(策略+模板方法)
一、前言 最近带着两个兄弟做支付宝小程序后端相关的开发,小程序首页涉及到很多查询的服务。小程序后端服务在我司属于互联网域,相关的查询服务已经在核心域存在了,查询这块所要做的工作就是做接口中转。参考了微信小程序的代码,发现他们要么新写一个接口调用,要么新写一个接口包裹多个接口调用。这种方式不容易扩展。由于开发周期比较理想,所以决定设计一个接口中转器。二、接口中转器整体设计 ...
2019-01-10 18:43:34
882
转载 HashMap 源码阅读
前言 之前读过一些类的源码,近来发现都忘了,再读一遍整理记录一下。这次读的是 JDK 11 的代码,贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解。Map 接口 这里提一下 Map 接口与1.8相比 Map接口又新增了几个方法: 这些方法都是包私有的static方法; of()方法分别返回包含 0 - 9 个键值对的不可修改的Map; ofEnt...
2019-01-07 00:00:08
281
4
原创 支付宝敏感信息解密
支付宝官方解密文档:https://docs.alipay.com/mini/introduce/aesString response = "小程序前端提交的";//1. 获取验签和解密所需要的参数Map<String, String> openapiResult = JSON.parseObject(response, new TypeRef...
2018-12-27 13:21:00
4980
原创 java接口签名(Signature)实现方案续
一、前言 由于之前写过的一片文章 (java接口签名(Signature)实现方案 )收获了很多好评,此次来说一下另一种简单粗暴的签名方案。相对于之前的签名方案,对body、paramenter、path variable的获取都做了简化的处理。也就是说这种方式针所有数据进行了签名,并不能指定某些数据进行签名。二、签名规则 1、线下分配appid和appsecret,针对不同的调用...
2018-12-26 13:24:38
18235
47
原创 Nginx配置以及域名转发
工程中的nginx配置#user nobody;worker_processes 24;error_log /home/xxx/opt/nginx/logs/error.log;pid /home/xxx/opt/nginx/run/nginx.pid;events { use epoll; worker_connections 102...
2018-12-14 13:28:43
1121
原创 RedisCacheManager设置Value序列化器技巧
CacheManager基本配置 请参考博文:springboot2.0 redis EnableCaching的配置和使用RedisCacheManager构造函数/** * Construct a {@link RedisCacheManager}. * * @param redisOperations */@SuppressWarnings("rawtypes"...
2018-12-10 15:46:28
2367
原创 kafka告警简单方案
一、前言 为什么要设计kafka告警方案?现成的监控项目百度一下一大堆,KafkaOffsetMonitor、KafkaManager、 Burrow等,具体参考:kafka的消息挤压监控。由于本小组的项目使用的kafka集群并没有被公司的kafka-manager管理,所以只能自己简单做一个告警。二、告警方案 首先需要两个定时任务,之间的通信依靠延迟队列。 左边的定...
2018-12-04 15:46:58
2787
原创 kafka-manager配置和使用
kafka-manager配置 最主要配置就是用于kafka管理器状态的zookeeper主机。这可以在conf目录中的application.conf文件中找到。kafka-manager.zkhosts="my.zookeeper.host.com:2181" 当然也可以声明为zookeeper集群。kafka-manager.zkhosts="my.zookee...
2018-11-20 00:07:38
2174
1
原创 高效使用hibernate-validator校验框架
一、前言 高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑。接下来会介绍一下常用一些使用方式。二、常用注解说明限制 说明 @Null 限制只能为null @NotNull 限制必须不为null @AssertFalse 限制必须为false @AssertTrue 限制必须为tr...
2018-11-13 19:15:42
1272
原创 Springboot集成ES启动报错
报错内容None of the configured nodes are availableelasticsearch.yml配置cluster.name: fansnode.name: node-72node.master: truenode.data: truenetwork.host: 112.122.245.212http.port: 39200transp...
2018-11-12 18:39:59
2213
原创 springmvc controller动态设置content-type
springmvc RequestMappingHandlerAdapter#invokeHandlerMethod 通过ServletInvocableHandlerMethod#invokeAndHandle调用目标方法,并处理返回值。 如果return value != null,则通过returnvalueHandlers处理,内部会调用MessageConverter...
2018-11-10 11:15:37
9381
原创 log4j平稳升级到log4j2
一、前言 公司中的项目虽然已经用了很多的新技术了,但是日志的底层框架还是log4j,个人还是不喜欢用这个的。最近项目再生产环境上由于log4j引起了一场血案,于是决定升级到log4j2。二、现象 虽然生产环境有多个结点分散高并发带来的压力,但是消息中心上一周好多接入方接入,导致并发量一下就增多了,导致服务卡死。在堆栈信息中看到大量的BLOCK异常,如下。"http-nio-...
2018-11-09 20:45:58
3256
原创 Springmvc借助SimpleUrlHandlerMapping实现接口开关功能
一、接口开关功能 1、可配置化,依赖配置中心 2、接口访问权限可控 3、springmvc不会扫描到,即不会直接的将接口暴露出去二、接口开关使用场景 和业务没什么关系,主要方便查询系统中的一些状态信息。比如系统的配置信息,中间件的状态信息。这就需要写一些特定的接口,不能对外直接暴露出去(即不能被springmvc扫描到,不能被swagger扫描到)。三、Simple...
2018-11-04 00:00:18
688
原创 spring注解工具类AnnotatedElementUtils和AnnotationUtils
一、前言 spring为开发人员提供了两个搜索注解的工具类,分别是AnnotatedElementUtils和AnnotationUtils。在使用的时候,总是傻傻分不清,什么情况下使用哪一个。于是我做了如下的整理和总结。二、AnnotationUtils官方解释 功能 用于处理注解,处理元注解,桥接方法(编译器为通用声明生成)以及超级方法(用于可选注解继承)的常规实用程序方...
2018-10-20 08:42:31
8982
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人