- 博客(62)
- 收藏
- 关注
原创 RPC调用超时中断机制的实现
在如今互联网的架构趋势下,微服务已经成为一个不可或缺的服务架构了。将一个大的服务拆分若干子服务,然后远程调用,已应对大流量、高并发的系统场景,如今开源的优秀RPC框架很多,例如 thrift、dubbo 、grpc等本人公司也有两套自主研发的RPC框架,通读之后受益匪浅,下面分享一下,远程调用第三方服务超时中断机制的实现。在调用第三方服务时,如果服务提供方处理过于缓慢,会拖垮调用方,使调用方夯...
2019-11-19 21:53:44 2342
原创 兜底之副本兜底
兜底是服务高可用的有效手段之一,一般用于对业务要求较高,服务可用性较强的场景兜底常用的手段有:try catch捕获异常指定兜底逻辑;默认值兜底;缓存崩溃数据库兜底等等接下来介绍另一场兜底策略:副本兜底,被用在我们服务的核心链路上。副本兜底什么叫副本兜底呢,就是记录接口不同请求参数情况下,各自的最近的一次返回值,有且只记录最近的一次返回值。如果接口异常,直接返回对应请求参数的最近一次返回值。但是不可能记录所有参数的返回值,只记录热点参数的返回值,非热点参数执行接口的频率很低,允许少量的失败,
2020-06-18 23:06:43 1400 3
原创 整数二进制充当统计模型
最近项目中需要统计APP的最近几次的在线离线情况,因为有些商家的网络信号很差,需要根据最近的心跳在线离线情况做一些事情,例如统计商户APP最近10次的在线离线记录,如果最近10次有8次离线那就认识商家是网络比较差的商家,那么就去对这部分商家去做一些其他事情,那么怎么统计好呢?因为统计与计算是要同时记录的。传统的方式是新建一个在线离线状态记录表,然后从表里面就可以获取最近几次在线离线记录,这个方法比较简单,但是表以后的数据量会越来越大,查询也越来越慢,无用的数据也越来越多。那么先理清楚需求,只记录最近
2020-06-16 22:08:46 1057
原创 负载均衡之跑马竞赛算法
跑马竞赛算法是什么?是一种能良好感知服务端负载进行连接的负载均衡算法。当客户端与服务端进行长连接时,客户端需要选择合适的一台服务器节点起进行连接。客户端选择服务端的ip有多种方式,跑马竞赛算法相比于其他又有什么优点呢,怎么去实现,接下来一一讲解客户端与服务端进行长连客户端通过http请求服务端拿到服务端所有的ip节点后,开始要选择一个ip进行连接,怎么选择ip呢?方式1:hash取模首先获取到客户端的ip,对客户端ip的hash对服务端节点数进行取模,模的位置就是ip的位置//
2020-06-15 22:11:58 894 1
原创 kafka消息回溯
kafka支持两种方式回溯。一种是基于消息偏移量回溯,一种是基于时间点的消息回溯。要想讲清楚kafka回溯的原理,得先从kafka存储消息的文件格式开始讲。 kafka存储消息是以日志的形式存储的,每一个partition都对应一个日志,但是日志不是一个文件,是多个文件组成的。日志文件都存储在一个文件夹里面的,文件格式为: topic-0 。 ...
2020-04-12 11:50:26 5123
原创 kafka消息格式
我们都知道,kafka是以日志文件的方式来存储kafka消息的,日志消息的格式不仅关系功能维度 的扩展,还牵涉性能维度的优化。如果格式不恰当,会导致消息的大小偏大,占用内存更高 kafka经历了多代的演变,这里只讲重要的3代,v0、v1、v2版本 v0版本 v0版本的日志消息,分为两个部分,一个是由offset、message size...
2020-04-09 22:25:51 1170
原创 分布式环境生成唯一订单id方案
分布式环境生成一个唯一id从来不是一个容易的事,不同的节点都独立的各自生成id,高并发性场景下容易生成相同的订单id。方案1:数据库自增主键优点:全局唯一、不会重复缺点:订单id有序、容易被外界爬虫知道业务的订单量数据方案2:UUIDUUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-1...
2019-12-09 22:26:53 833
原创 ThreadLocal内存溢出(OOM)的原因
ThreadLocal是Java提供的一个线程安全类,其原理是每个线程都拥有各自的变量内存副本。其实就是每个线程Thread里都有一个ThreadLocalMap类,用于存储变量值。更新、删除操作时,都是操作各自线程里的hreadLocalMap类,互不影响,从而达到的线程安全ThreadLocal经常用于一次调用的上下文储存场景,例如一次调用的token、traceId,在调用的各个阶段都有...
2019-11-24 21:20:57 2687
原创 rpc基于netty异步调用后,捕获对应响应结果的实现
由于netty通信是异步的,客户端请求之后就不再阻塞等待服务端的结果返回了,客户端可以去做其他的事情,而服务端处理完之后会将响应结果输出给客户端,这些客户端并不知道这个响应结果是属于哪次请求的结果。所有需要一套机制去实现响应结果隶属于是属于哪次调用的结果。通过netty客户端请求服务端流程如下:下面用代码实现一次完整的,rpc通过netty调用之后,找到对应请求的response...
2019-11-17 00:16:39 1495 2
原创 基于多路复用IO的Reactor模型实现
对NIO的了解请看我上篇博客,此处不作过多叙述https://blog.csdn.net/CSDNzhangtao5/article/details/103023972Reactor模式是一种事件处理模式,单个或多个事件(Event)并发地投递到事件处理服务(Service Handler),事件处理服务将事件进行分离,同步的将他们分发到对应的事件处理器中去处理。把事件的产生于事件的...
2019-11-13 22:56:37 526
原创 NIO多路复用以及select/poll/epoll
IO多路复用机制:程序注册一组socket文件描述符给操作系统,监视这些fd是否有IO事件发生,有了就告诉程序处理。是一种触发式、批量式的解决方案。现在主流的中间件:netty、kafka都是采用的多路复用技术,来提升并发吞吐量首先我们先了解BIO当用read去读取网络的数据时,是无法预知对方是否已经发送数据的。因此在收到数据之前,能做的只有等待,直到对方把数据发过来,或者等到网络超...
2019-11-12 13:20:49 581
原创 CAS自旋原理
CAS是Java并发包工具类底层使用的算法,他有效的避免了并发,像AtomicInteger、Semaphore、ReentrantLock底层都采用了CAS算法cas即compare and swap(比较与交换),它涉及到三个操作数:内存值、预期值、新值。当且仅当预期值和内存值相等时才将内存值修改为新值 。 其中比较与交换是原子操作。下面对着例子来说: 分析AtomicInteger的add
2017-12-18 20:12:12 4485
原创 数据库主从延迟
为了实现数据库的高可用,一般需要搭建数据库集群,即所谓的一主多从的数据库结构。主库主要用作对数据库的写操作,然后再同步给从库;从库主要用作对数据的查询。对主库的数据的更新操作时,数据的变更会同步给从库。这段同步的时间就是主从延迟。主从延迟时间一般非常短,一般在1ms左右。主从延迟是不可控的,不能缩短,也不知道在同步过程会发生什么。如果主从同步过程中其他的请求进来查询从库取的就是脏数据。但是大部分业务
2017-10-19 19:09:09 1771 1
原创 项目启动一直报Could not resolve placeholder错误
项目启动一直报错,一直报Could not resolve placeholder错误 查了一下,说是spring xml中指定了多个,查看多个xml,确实在两个xml中都定义了一个全局属性placeholder。解决办法: 在其中一个placeholder 配置里加入如下属性:<property name="ignoreUnresolvablePlaceholders" value="true
2017-10-16 12:56:21 9060
原创 kafka消费者监听数据原理
kafka确实是一个很牛逼的消息中间件。基本上是消息中间件中数据最快吞吐量最高的分布式消息中间件了。 由于公司对kafka全封装了,直接调用api就可以了。但是本人对kafka很感兴趣,就先看了下kafka监听topic里的新增的消息。 看了下源码其实很简单。public class Consumer{ private static final KafkaConsumer<String,
2017-10-16 11:43:42 13466 1
原创 编译时出现java.lang.UnsupportedClassVersionError 异常
下午把beta上的代码合到我自己的分支,结果导致service启动报错。本来本地service是可以起来的,结果一合就挂了。启动时一直报错,是检查性异常。排除代码问题然后一直找问题啊,找问题。。。。。。。然后顺着堆栈信息找,是一个类报java.lang.UnsupportedClassVersionError。然后找到这个类属于合过来的pom依赖。查看源码,这个jar是用jdk1.8编译的。我本地的
2017-09-26 17:46:50 911
原创 try catch后spring 事物不显式提交
spring管理的事物,例如声明式事物或者是注解式事物默认是在抛出运行异常时,会被spring catch到然后回滚,如果你在需要事物管理的方法里就已经try,catch了。哪么spring就捕获不到这个异常,也就不会回滚了。例如:public void doSome(){ try{ update ..... delete ..... }c
2017-08-24 11:15:21 747 1
原创 git 所有撤销、回退命令
git add 后撤销:撤销所有add文件 git reset HEAD .撤销单个add文件 git reset HEAD -filenamegit commit 后撤销:只回退commit的信息,保留修改代码:git reset --soft head彻底回退到上次commit版本,不保留修改代码:git reset --hard head^说明:HEAD :当前版本HEAD^ :
2017-05-24 12:00:27 20423 2
原创 maven 将项目打成jar包加入依赖包
有时间我们需要将项目打成jar包生成在我们项目的target目录下。先来说一下maven instal与maven Package的区别:maven install是将你的maven项目按照packaging属性打包为制定类型到本地仓库中,可以给依赖它的其他项目调用,并自动建立关联。maven package是将打包文件放在项目target文件目录下,不能给其他项目依赖使用。要想将项目打成jar包
2017-05-24 10:55:03 10162 2
原创 java 获取jvm运行状态
在项目收集jvm运行状态信息并上传到监控平台是必要的,这样有利于我们分析服务器的运行情况,好让我们对一些潜在的威胁采取相关措施。首先要了解到ManagementFactory这个类,它是java.lang.Object包下的 java.lang.management.ManagementFactory类。它是ManagementFactory 类是一种工厂类,用于获取 Java 平台的管理 Bea
2017-05-22 11:44:22 5168 2
原创 项目中执行ArrayList.remove() 抛出java.lang.UnsupportedOperationException
项目中代码:if(attrEntity!=null && attrEntity.size()>0){ mdseCodes = new ArrayList<String>(); for(MdseAttributeVO entity:attrEntity){ if(StringUtils.isNotBlank(entity.g
2017-04-12 18:58:58 3453
原创 mysql事务隔离级别为Read uncommitted产生脏读原因
Read uncommitted是mysql innodb引擎的最低事务隔离级别。他并不能保证并发情况下的数据的安全性。例如使用jdbc事务模仿Read uncommitted隔离级别:import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sq
2017-04-10 14:00:27 2393 2
原创 java 并发包之Semaphore
Semaphore是java5之后并发包里的工具类。是用来在并发时控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。例如一个奶茶店,同时只能为5个人提供服务,其余的人必须等待其前面五个人服务完毕后才能接受服务,如果所有的人同时一窝蜂的去请求服务那会导致很多问题发生甚至奶茶铺崩溃。使用场景: 项目中某个核心接口需要频繁的访问数据库资源,频繁的io操作,如果高并发时,同时1
2017-04-04 22:37:32 539
原创 java 并发包之countDownLatch
countDownLatch是Java.util.concurrent里的并发工具包。它是让某个线程等待其他线程处理完再执行。所用场景:例如导出10万条的订单记录时,需要对每一条订单记录进行处理后再导出,这是由于数据量过大需要采用10个线程对这10万条数据进行处理,那么导出execel的这个动作或者线程需等待上面10个线程处理完再执行。构造方法:new CountDownLatch(int coun
2017-03-29 20:38:44 478 1
原创 JVM GC算法以及调优
jvm的垃圾回收器是jvm的重要组成部分。GC负责着整个jvm运行时堆中对象的回收,保证jvm的性能。由于Java执行GC垃圾回收时会阻塞其他所有的线程,这样是对用户极不友好的,即对GC的优化重点是降低阻塞的时间,对GC的调优也就是对jvm的性能调优的重点。jvm堆的内存模式(画的比较简陋,忘海涵) jvm为堆内存划分了几块区域如上图: 最左边的new generation是新生代,新生代分为3
2017-03-27 23:13:17 1403 2
原创 java 执行基础运算时内存调度过程
当我们执行i=i+1时;有没有想过i是怎么执行+1操作的,他的过程是什么? 我查过一些资料,虽然不是很深,但还是要分享一下我的理解。jvm的所有运算操作都是要依赖cpu进行的,当java中执行i=i+1时,首先是jvm将i=i+1操作的过程生成cpu能执行的指令,然后cpu来执行i=1+1的操作。cpu将i所在的内存中的值读到高速缓存区中。然后再从高速缓存区读取i的值到主存中。然后cpu执行
2017-03-27 16:16:27 530 1
原创 项目中执行lock.unlock()出现java.lang.IllegalMonitorStateException
项目中代码,这段代码是判断excel是不是正在导出中,并发量只允许为1,因为excel导出很占cpu资源@RequestMapping("excelOrderExportCheck.json") @ResponseBody public AjaxObj excelOrderExportCheck(){ AjaxObj ajaxObj=new AjaxObj(); //防止重复exce
2017-03-27 12:21:02 11301 2
原创 Java 实现插入排序
插入排序就像起扑克牌一样,当起到第二张比第一张比较如果比第一张小就放在第一张的位置,当起到第三张牌的时候与前两张进行比较插入适当位置,依次类推。。。用Java实现: 例一:package test;public class insetSort{ static int[] array={1,0,0,3,9,8,6}; //插入排序 static int[] sort(int[]
2017-03-22 22:27:14 375
原创 java实现单链表
在Java中,java就是采取的是一个对象里面存储着相对类型的另一个对象,另一个对象里面又存在又一个相同类型的同对象,逐渐递归下去形成单链表。Java伪代码实现单链以及单链的查询package test;public class SingleLink<K,V> { Entry entry = new Entry(); int size; public static void mai
2017-03-21 22:08:13 372
原创 高并发下接口核心业务方法限流
高并发下,为防止某个接口的主要方法被高频率的反复调用甚至是竞争伙伴恶意请求服务器导致服务器爆掉,获取接口处理业务效率缓慢。需要对接口的核心业务方法进行限制,比如说1分钟之内只允许调用1000次改接口。超过1000次的线程被阻塞,直到1分钟结束或者其他线程处理完毕。java伪代码实现(1分钟之类方法只能被调用10次,剩余线程阻塞)package com.hbut.inspiration.control
2017-03-21 14:46:11 2876 1
原创 CyclicBarrier 高并发的使用
CyclicBarrier是Java中java.util.concurrent并发包里的一个工具类。作用就是控制多个线程同时等待某个事件的执行才会一起执行。使用场景:多用于多个子线程等待主线程执行完毕后执行的场景。两个重要构造方法:new CyclicBarrier(int)int为等待的线程的个数。 new CyclicBarrier(int,Runnable)Runnable为等待的线程被触发
2017-03-19 21:07:11 586
原创 blockingQueue实现消费-生产模式
blockingQueue实为阻塞队列,数据由消费者线程、生产者线程共享。消费者产生数据放入阻塞队列,倘若阻塞队列已满,则生产者线程被阻塞直到消费者线程取出数据或者是直接返回失败,若队列数据为空,则消费者线程阻塞直到生产者线程放入数据或者直接返回失败。且阻塞队列的数据为先进先出的规则。常用apioffer(E e) 向阻塞队列放入数据,倘若阻塞队列已满,则直接返回false。offer(E e,
2017-03-19 16:55:12 782
原创 分布式系统session同步
分布式系统由于有多台服务器,用户在一次会话里有可能访问不同的服务器,这是由于每次请求都由负载均衡服务器通过算法去选择访问的服务器。那里用户可能第一次访问服务器时web容器如tomcat新建了一个session保存在了服务器里。再次访问服务器时可能就访问另外一台服务器了就取不到这个session了。这会导致很对问题,例如有可能登入系统之后需要再次登入。session是由首次访问服务器的时候,由web容
2017-03-13 16:22:45 4593
原创 Java 获取绝对路径与相对路径
绝对路径也就是一个文件的所在位置的完整路径 例如:C:\ABC\2 这就是绝对路径,指明2文件在C盘ABC文件下,从最大的目录C盘开始表示出来.相对路径是说在某个目录下,相对于这个目录下,我的文件的位置 例如:我在C盘目录下,那2文件的相对路径为ABC\2 获取项目的绝对路径: request.getSession().getServletContext().getRealPath(“/”
2017-01-09 13:56:40 1153
原创 http页面执行https跨协议请求的解决办法
有时候,我们需要在弹层中使用跨域跨协议去访问某个服务器获取视图,楼主就在项目中遇到了这个问题。在一次pos机项目的开发中需要访问我公司不同项目的服务器,我们两个部门的域名、协议都是不一样的。我需要在https协议下去访问不同域名的http协议地址,当然在浏览器新开一个窗口(window.open(“http://”))就不会有问题,但是这在ajax的回调函数中弹窗使用就遇到了很大麻烦。要支持跨域的弹
2017-01-09 11:40:05 23100 2
原创 window.open()窗口参数对不同浏览器的支持程度的差异
各浏览器对window.open()的窗口特征sFeatures参数支持程度存在差异 上表中为各个浏览器对 features 各参数选项的支持程度,其中需要特殊说明的如下: 【标注1】:IE7 IE8 Firefox Chrome Safari 中,当”menubar”选项为”yes”时,默认不显示菜单栏,需要按ALT键后菜单栏才可显示;相反当 “menubar”选项为”no”时,即使按了ALT键也
2017-01-06 14:46:21 1525 1
原创 bufferedinputstream 不阻塞原理
bufferedinputstream是fileInputstream的子类,它继承自fileInputstream,所以它是在fileInputstream上的封装,自然而然效率肯定比fileInputstream好。我们通过代码分析,来看为什么bufferedinputstream比fileInputstream效率高 File file=new File("D:/text.txt
2016-12-21 16:12:44 1611 2
原创 jsonp 跨域请求
一般的我们在js里用ajax动态的请求服务器数据,ajax底层其实是使用的是XmlHttpRequest对象,但是它只允许请求当前域名的资源,这一过程是同域的,即ajax请求的服务器与当前的页面的url处于同一台服务器中,但是有时候我们需要请求另一台服务器获取json数据,或者调用第三方接口获取json数据,例如我发送一个城市地址,获取第三方服务的天气数据。为了实现跨域请求,可以通过script标
2016-12-15 15:06:29 534
转载 freemarker(ftl)标签用法
FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} ${book.name?if_exists } //用于判断如果存在,就输出这个值 ${book.name?default(‘xxx’)}//默认值xxx ${book.name!"xxx"}//默认值xxx ${book.date?string('yyy
2016-12-02 10:31:53 8638
原创 SpringMVC前台提交参数绑定list时大小超过256 java.lang.IndexOutOfBoundsException解决办法
springMVC框架提交参数list时,springmvc默认只能接收到255个数据,当你前台传的数据长度大于255位的时候就会报错 例如我在前台传输的solutionModelList的长度有364位,在chrome控制台可以看到 然后在后台接收 @RequestMapping("/saveFinance.json") @ResponseBody public AjaxObj sa
2016-11-30 18:25:10 6071 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人