- 博客(364)
- 资源 (12)
- 收藏
- 关注
转载 使用Guava RateLimiter限流以及源码解析
前言在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开 限流 限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理常用的限流算法漏桶算...
2020-04-10 20:16:19
633
转载 限流算法
一、限流的作用由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机。限流 (Ratelimiting) 指对应用服务的请求进行限制,例如某一接口的请求限制为 100 个每秒, 对超过限制的请求则进行快速失败或丢弃。限流可以应对:热点业务带来的突发请求; 调用方 bug 导致的...
2020-04-10 20:07:08
829
原创 ThreadLocal弱引用与内存泄漏分析
本文对ThreadLocal弱引用进行一些解析,以及ThreadLocal使用注意事项。ThreadLocal首先,简单回顾一下,ThreadLocal是一个线程本地变量,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。其实现原理这里就不做详细阐述,其数据结构是每个线程Thread类都有个属性ThreadLocalMap,...
2020-04-10 19:40:52
1046
转载 单一职责原则
https://blog.youkuaiyun.com/king123456man/article/details/81591792?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2020-03-22 11:48:58
318
转载 依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。面向对象的开发很好的解决了这个问题,一般情况下...
2020-03-22 11:40:22
351
转载 软件设计七大原则实战(二)-开闭原则
1 开闭原则的定义开闭原则是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统,先来看开闭原则的定义:Software entities like classes,modules and functions should be open for extension but closed for modifications定义初看到这个定义,可能会很迷惑...
2020-03-22 11:27:53
592
原创 比较两个实体类的属性值工具
public static Map<String, CompareDTO> compareFields(Object source, Object target, List<String> comparedPropertyList) { try { Map<String, CompareDTO> map = Map...
2019-10-10 19:23:44
841
原创 通过itext合并PDF工具类
maven坐标:<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> <dependen...
2019-08-22 14:09:15
805
转载 JVM命令使用演示
之前推送了一本jvm相关的书籍【JVM Troubleshooting Guide】书籍推荐及下载,个别小伙伴反馈说关于jvm看了不少资料,有些印象,但是不知道如何使用那些命令。就着这个前提,简单演示一下jvm一些命令的使用。(温馨提示,由于jvm命令返回的字符串偏长一些,手机上效果差一些,建议在电脑上看)首先,先准备一段代码,直接运行一个java程序也可以,比如:@Sl...
2019-07-28 11:16:39
308
转载 JVM性能调优监控工具jps、jmap、jstack、jstat使用详解
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 ...
2019-07-28 11:11:12
1190
转载 JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解
jps查看所有的jvm进程,包括进程ID,进程启动的路径等等。我自己也用PS,即:ps -ef | grep javajstack观察jvm中当前所有线程的运行情况和线程当前状态。系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发...
2019-07-28 11:04:41
722
转载 通过jstack与jmap分析一次线上故障
一、发现问题 下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。二、排查思路简单分析下可能出问题的地方,分为5个方向:1.系统本身代码问题2.内部下游系统的问题导致的雪崩效应3.上游系统调用量突增4.http请求第三方的问题5.机器本身的问题三、开始...
2019-07-28 11:00:28
391
原创 为什么Map桶中个数超过8才转为红黑树
被问及的一个问题,应该不少人看到这个问题都会一面懵逼。因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什么当链表长度为8的时候才做转换动作。笔者第一反应也是一样,只能初略的猜测是因为时间和空间的权衡。 要弄明白这个问题,我们首先要明白为什么要转换,这个问题比较简单,因为Map中桶的元素初始化是链表保存的,其查找性能是O(n),而树结构能将查找性能提升...
2019-07-24 11:38:45
472
转载 LinkedHashMap 源码详细分析(JDK1.8)
https://www.imooc.com/article/22931作者:田小波链接:https://www.imooc.com/article/22931来源:慕课网本文原创发布于慕课网 ,转载请注明出处,谢谢合作...
2019-07-24 10:49:31
242
转载 HashMap 源码详细分析(JDK1.8)
https://www.imooc.com/article/30668作者:田小波链接:https://www.imooc.com/article/22931来源:慕课网本文原创发布于慕课网 ,转载请注明出处,谢谢合作
2019-07-24 10:45:42
325
原创 BASE理论
什么是BASE理论BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的简写,由 eBay 架构师 Dan Pritchett 于 2008 年在《BASE: An Acid Alternative》(论文地址点这里)论文中首次提出。BASE 思想与 ACID 原理截然不同,它满足...
2019-07-23 21:02:43
1388
转载 Java开发体系(转)
今天,就为大家整理一份目前互联网公司最主流的技术选型:阅读源码程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这也造成了很多错误看源码的方式。那要如何正确的分析源码呢?分布式架构随着我们的业务量越来越大和越重要,单体的架构模式已经无...
2019-07-16 13:45:29
206
转载 微服务--分布式事务的实现方法及替代方案(转)
概念事务补偿机制: 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务. CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面, 只能同时择其二进行实现. 常见的有CP系统, AP系统. 幂等性: 简单的说,业务操作支持重试, 不会产生不利影响. 常见的实现方式...
2019-07-16 11:39:14
417
原创 Java中CAS原理详解
前言在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是vol...
2019-07-14 12:02:32
363
原创 缓存替换策略
替代策略的具体实现就是缓存算法,这里简要介绍一下主流的缓存算法:(1)Least-Recently-Used(LRU)替换掉最近被请求最少的对象,这种传统策略在实际中应用最广。在CPU缓存淘汰和虚拟内存系统中效果很好。然而在直接应用与代理缓存中效果欠佳,因为Web访问的时间局部性常常变化很大。浏览器就一般使用了LRU作为缓存算法。新的对象会被放在缓存的顶部,当缓存达到了容量极限,底部...
2019-07-09 09:50:58
3636
1
转载 从分布式一致性到共识机制
从分布式一致性到共识机制(一)Paxos算法从分布式一致性到共识机制(二)Raft算法从分布式一致性到共识机制(三)拜占庭问题
2019-07-06 16:00:32
283
转载 Spring @Transactional 失效 和 传播行为(转)
Spring @Transactional 失效 和 传播行为:https://www.jianshu.com/p/9966938e5667
2019-07-02 14:21:41
304
原创 volatile的艺术
前言 Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比sy...
2019-07-01 22:36:38
166
原创 AtomicBoolean介绍与使用与compareAndSet原理
AtomicBoolean介绍 AtomicBoolean是Java.util.concurrent.atomic包下的原子变量,这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待...
2019-06-30 13:39:31
10112
2
转载 MySQL主从复制介绍:使用场景、原理和实践
MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具,而且,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到MySQL数据库中。1.1.1 MySQL主从复...
2019-04-10 20:38:36
1343
转载 深度探索MySQL主从复制原理
概要MySQL Replication (MySQL 主从复制) 是什么?为什么要主从复制以及它的实现原理是什么?MySQL 主从复制概念MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的...
2019-04-10 20:31:48
213
原创 VNC远程连接树莓派报错问题解决-- “由于目标计算机积极拒绝,无法连接”
Problem: “由于目标计算机积极拒绝,无法连接”第一次搞树莓派,因为树莓派不能直接连接显示器,所以使用远程连接,这里,我使用网线对连的方式,笔记本和树莓派用一根网线连接,具体参考:http://shumeipai.nxez.com/2013/10/15/raspberry-pi-and-a-network-cable-directly-connected-laptop.html之后...
2018-12-23 20:29:22
10047
1
转载 Java 的枚举类型:枚举的线程安全性及序列化问题
写在前面:Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。本文将深入分析枚举的源码,看一看枚举是怎么实现的,是如何保证线程安全的,以及为什么用枚举实现的单例是最佳方式。枚举是如何保证线程安全的要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enu...
2018-06-05 10:25:50
809
原创 Guava——Function
一、实例Function<Double, Double> sqrt = new Function<Double, Double>() { public Double apply(Double input) { return Math.sqrt(input); }}; 使用:sqrt.apply(4.0); //2.0二、简介Fu...
2018-05-09 17:18:37
510
原创 Java并发编程:Lock
synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁会有三种情况: 1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有; 2)线程执行发生异常,此时JVM会让线程...
2018-04-06 23:01:42
1390
1
转载 JAVA回调机制(CallBack)详解
序言最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教!开始之前,先想象一个场...
2018-04-06 22:07:56
381
转载 Netty笔记4-如何实现长连接
前面三章介绍了Netty的一些基本用法,这一章介绍怎么使用Netty来实现一个简单的长连接demo。Netty入门教程——认识NettyNetty入门教程2——动手搭建HttpServerNetty入门教程3——Decoder和Encoder关于长连接的背景知识,可以参考《如何使用Socket实现长连接》 一个简单的长连接demo分为以下几个步骤:长连接流程创建连接(Channel)...
2018-03-27 10:49:21
1332
转载 Netty入门教程3——Decoder和Encoder
https://www.jianshu.com/p/fd815bd437cd Netty强大的地方,是他能方便的实现自定义协议的网络传输。在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器。在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务器。要做到这点,第一步要做的,就是要自定义编码器和解码器,这就是我们这一章主要讲的内容。Netty入门教程——认识Nett...
2018-03-27 10:47:33
6026
转载 Netty入门教程2——动手搭建HttpServer
https://www.jianshu.com/p/ed0177a9b2e3在上一章中我们认识了netty,他有三大优点:并发高,传输快,封装好。在这一章我们来用Netty搭建一个HttpServer,从实际开发中了解netty框架的一些特性和概念。netty.png认识Http请求在动手写Netty框架之前,我们先要了解http请求的组成,如下图:HTTP request component p...
2018-03-27 10:44:54
565
git、gitlab以及SourceTree介绍
2016-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人