- 博客(286)
- 收藏
- 关注
转载 dubbo+zipkin调用链监控(二)
去年的时候写过dubbo+zipkin调用链监控,最近看到zipkin2配合brave实现起来会比我之前的实现要简单很多,因为brave将很多交互的内容都封装起来了,不需要自己去写具体的实现,比如如何去构建span,如何去上报数据。收集器抽象由于zipkin支持http以及kafka两种方式上报数据,所以在配置上需要做下抽象。AbstractZipkinCollect...
2018-10-08 23:32:00
542
转载 Kafka Manager
Kafka Manager这里记录下安装过程,以及当时遇到的一些问题。依赖项kafka manager依赖两个组件:java8最新的kafka manager依赖java8,低版本的我没有尝试过。这里不对配置java8做说明sbtsbt是一个scala项目的构建工具,我们通过下载kafka manager源码方式的话,就需要去构建工程。安装sb...
2018-08-15 14:01:00
444
转载 简易RPC框架-SPI
案例我们所熟悉的jbdc是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,提供了一种基准,据此可以构建更高级的工具和接口。如上图所示,任意的一个数据库厂商只要去实现jdbc的接口,就可以轻松的对接jbdc从而为应用开发人员所服务。SPI上面的jdbc的设计理念叫SPI,它的全名是Service Provider Interface。...
2018-05-20 02:45:00
514
转载 Spring Cache扩展:注解失效时间+主动刷新缓存(二)
目的之前在github上找了一个开源的项目,改了改缓存的扩展,让其支持在缓存注解上控制缓存失效时间以及多长时间主动在后台刷新缓存以防止缓存失效( Spring Cache扩展:注解失效时间+主动刷新缓存 )。示意图如下:那篇文章存在两个问题:所有的配置是建立在修改缓存容器的名称基础上,与传统缓存注解的写法有所区别,后续维护成本会增加;后台刷新缓存时会存...
2018-04-07 13:46:00
1237
转载 从头开始搭建一个Spring boot+ActiveMQ高可用分布式环境
背景目前公司项目中有用到activemq,两台机器上分别通过共享文件方式搭建了master-slave集群,但两台机器之间并未组建broker cluster,而是在客户端通过软负载的方式随机选择一组提供服务来达到集群扩展的目的。上面的方案主要问题在于需要通过软负载去实现分布式的负载均衡算法,需要解决一系列问题。下面的文章就在原有基础上组建broker c...
2018-01-01 11:58:00
425
转载 简易RPC框架-熔断降级机制
熔断与降级为什么在RPC环节中有熔断以及降级的需求,详细的原因这里不多解释,从网上搜索一张图做示意。熔断我理解熔段主要解决如下几个问题:当所依赖的对象不稳定时,能够起到快速失败的目的快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复比如产品详细页获取产品的好评总数时,由于后端服务异常导致客户端每次都需要等到超时。如果短时间内服务不能恢复,...
2017-12-02 17:07:00
592
转载 转:一篇讲线上优化查 CPU的脚本
原文链接:https://my.oschina.net/leejun2005/blog/1524687摘要: 本文主要针对 Java 服务而言0、背景经常做后端服务开发的同学,或多或少都遇到过CPU 负载特别高的问题。尤其是在周末或大半夜,突然群里有人反馈线上机器负载特别高,不熟悉定位流程和思路的同学可能登上服务器一通手忙脚乱,定位过程百转千回。对此,...
2017-11-08 08:13:00
300
转载 简易RPC框架-上下文
上下文记的学英语的时候,总是不记的某个词是什么意思,然后就看不下去了,只能问周围的同学或者老师或者去查词典,他们的建议是通过上下文去推测这个词大概的意思,反正我那会上学时没理解,所以英文一直比较差。现在英语水平也没提高多少,尽管有点领会。后来慢慢理解了一些,因为有些词有很多种意思,放在某个场景下可能是一个意思,放在另外一个场景下又是其它的意思,这里不举例子...
2017-10-29 02:01:00
359
转载 简易RPC框架-客户端限流配置
关键资源关键资源总是有限的,也就意味着处理能力也有限,所以当面对大量业务时,为了保障自己能够有序的提供服务最经济的做法就是限制同一时间处理的事务数。比如银行的工作人员,一个工作人员同时只能为一个客户服务,来多了根本处理不了,不光是一种浪费而且有可以造成混乱的局面导致工作人员无法工作。网络请求漏斗越上层的服务器处理的事务越轻,应付请求的能力也越强,也就意味着同一...
2017-10-23 02:38:00
200
转载 简易RPC框架-过滤器机制
过滤器字面义上理解的过滤器类似下图,从一堆物品中筛选出符合条件的留下,不符合的丢弃。GOF 职责链GOF中有一种设计模式叫职责链,或者叫责任链,常规的UML图如下:正统的职责链是将一个请求发给第一个接收者,接收者判断是否属于自己能处理的,如果能处理则执行操作并中止请求下发,流程到此为止。如果不能处理则将请求下发给下一个接收者一直到最后一个接收者。变体职...
2017-10-08 00:00:00
376
转载 简易RPC框架-心跳与重连机制
心跳就是告诉其它人自己还活着。在简易RPC框架中,采用的是TCP长连接,为了确保长连接有效,就需要客户端与服务端之间有一种通知机制告知对方的存活状态。如何实现客户端发送心跳消息在状态空闲的时候定时给服务端发送消息类型为PING消息。服务端接收心跳消息捕获通道空闲状态事件,如果接收客户端PING消息,则发送PONG消息给服务端。如果在一定时间内没有收到客...
2017-09-30 19:22:00
642
转载 简易RPC框架-私有协议栈
HTTP协议客户机与服务端之间的数据交互需要遵守一定的约定,比如协议版本,数据类型,是否有缓存,是否有压缩等,只有在这些约定的基础上才能相互之间愉快的工作。Netty通信过程中的编解码这时说的是基于TCP/IP的Netty之间的通信。TCP/IP协议下客户端与服务端之间要进行数据交互,一般需要将数据转换成二进制格式,直接传java bean是不能支持的。在RPC模...
2017-09-24 21:43:00
231
转载 自动化测试:behave
在系统开发过程中,我们一般个人参与的开发都是局部的,自己负责的一部分与其它团队成员的成果组合在一起才能实现用户的完整行为。比如常见的电商系统就有几个主要的流程商品搜索购物车订单支付物流这些模块复杂的足以形成各自的团队,不同团队相互之间依据一定的接口来配合协作。在开发阶段可以基于接口各自独立开发,对于依赖其它模块的接口可以通过接口mock来完成。...
2017-09-10 10:55:00
1268
转载 dubbo源码分析(二):超时原理以及应用场景
本篇主要记录dubbo中关于超时的常见问题,实现原理,解决的问题以及如何在服务降级中体现作用等。超时问题为了检查对dubbo超时的理解,尝试回答如下几个问题,如果回答不上来或者不确定那么说明此处需要再多研究研究。我只是针对个人的理解提问题,并不代表我理解的就是全面深入的,但我的问题如果也回答不了,那至少说明理解的确是不够细的。超时是针对消费端还是服务端...
2017-08-06 02:16:00
273
转载 简单RPC框架-业务线程池
Netty 线程模型Netty的线程模型主要是基于React,因为考虑到应用场景的不同所以演化出多种版本。单线程模式即接收服务请求以及执行IO操作都由一个线程来完成,由于采用的是IO多路复用这类无阻塞IO操作,所以在请求量不大的情况下单线程模式也是可以解决一部分场景问题的。单接收多工作线程模式当请求量增大后,原有的一个线程处理所有IO操作变得越来越无法支撑...
2017-07-02 19:15:00
259
转载 简单RPC框架-基于Consul的服务注册与发现
一般我们常见的RPC框架都包含如下三个部分:注册中心,用于服务端注册远程服务以及客户端发现服务服务端,对外提供后台服务,将自己的服务信息注册到注册中心客户端,从注册中心获取远程服务的注册信息,然后进行远程过程调用上面提到的注册中心其实属于服务治理,即使没有注册中心,RPC的功能也是完整的。之前我大多接触的是基于zookeeper的注册中心,这里基于cons...
2017-05-22 23:58:00
472
转载 简易RPC框架-学习使用
基于netty4,protostuff的出于学习目的的RPC框架,后续会完善功能。背景做微服务有不短时间了,单纯RPC框架呢生产环境上之前主要使用dubbo,出于学习了解过Spring Cloud以及其它的比如Finagle,grpc,thrift。看过dubbo部分源码,了解过RPC的基本原理,但不系统。写一个类似dubbo的有多难猛的一看d...
2017-05-16 00:53:00
181
转载 统一配置中心2
统一配置中心方案统一配置中心1中记录了我之前项目中如何处理多系统中的配置问题,对于统一配置中心组件一般分为两种做法:自建它的好外与缺点都非常明确。好处设计以及代码实现都由自己把控,可形成自己的知识积累设计可以足够简化,无需考虑过多场景能够快速适应项目的需求,无需考虑开源的是否支持缺点需要人力的投入,而且有重复造轮子的嫌疑,需要有足够...
2017-04-23 12:15:00
183
转载 dubbo+zipkin调用链监控
分布式环境下,对于线上出现问题往往比单体应用要复杂的多,原因是前端的一个请求可能对应后端多个系统的多个请求,错综复杂。对于快速问题定位,我们一般希望是这样的:从下到下关键节点的日志,入参,出差,异常等。关键节点的响应时间关键节点依赖关系而这些需求原来在单体应用中可以比较容易实现,但到了分布式环境,可能会出现:每个系统的技术栈不同...
2017-04-14 17:27:00
438
转载 Spring Cache扩展:注解失效时间+主动刷新缓存
Spring Cache 两个需求缓存失效时间支持在方法的注解上指定Spring Cache默认是不支持在@Cacheable上添加过期时间的,可以在配置缓存容器时统一指定:@Beanpublic CacheManager cacheManager( @SuppressWarnings("rawtypes") RedisTem...
2017-03-06 19:29:00
5950
转载 转:深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践。一,什么是垃圾回收首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。垃圾回收的基本步骤回收的步骤有2步:查找内存中不再使用的对象释放这些对象占用的内存1,查找内存中不再使用的对象...
2017-03-03 14:15:00
132
转载 dubbo源码分析(一)
阅读源码的作用提取设计思路,增强设计能力理解运行机制,便于快速解决问题以及功能扩展常见有关dubbo的问题dubbo的负载均衡是在哪个组件中处理的?dubbo默认的负载均衡算法是什么?如果注册中心挂掉了客户端是否能够继续调用dubbo?一个请求从调用端到服务端的处理流程是什么?如果你有仔细的研读dubbo的开发文档,大部分问题都是有...
2017-03-02 19:53:00
253
转载 理解WEB API网关
隐藏细节现实生活中有很多隐藏细节的案例,比如我们平时用的电脑,当我们按电源按钮后电脑就自动开始启动了,对用户来讲很简单只需要知道按按钮就行。但电脑内部的工作原理其实是很复杂的一个流程,这里不多说。如果不隐藏细节会怎样?我想可能的结果就是电脑只能是特别特别的专业人员才能操作,永远无法像现在一样成为大家的必备工具。对大多数用户来讲他们根本不知道知道什么CPU,...
2017-02-25 19:27:00
631
转载 理解zookeeper选举机制
zookeeper集群配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。这篇主要分析leader的选择机制,zookeeper提供了三种方式:LeaderElectionAuthFastLeaderElection...
2017-02-20 21:35:00
360
转载 从头开始搭建一个Spring boot+RabbitMQ环境
消息队列在目前分布式系统下具备非常重要的地位,如下的场景是比较适合消息队列的:跨系统的调用,异步性质的调用最佳。高并发问题,利用队列串行特点。订阅模式,数据被未知数量的消费者订阅,比如某种数据的变更会影响多个系统的数据,订单数据就是比较好理解的。之前有一个场景是商品数据在修改后需要推送到elasticsearch中,由于修改产品的并发量以及数据量均不大,所...
2017-02-18 21:23:00
175
转载 理解redis高可用方案
理解并从头搭建redis集群部分开发人员工作当中只是在应用中使用redis,比如用来做数据结果的缓存。而且现在有很多不错的redis客户端工具(redisson),基本上可以不用关注redis命令就可以完成相当部分的功能。所以可能会对如下这些问题关注点不够:如何容灾?即某个redis节点出了问题如何保证服务的高可用性如何横向扩容?当数据量特别大时,如何解决单个re...
2017-02-15 12:21:00
215
转载 理解volatile
理解volatile平时工作中对于多线程的应用并不太多,但是不能说工作中不应用就可以对此不去了解,至少要做的知道有这么个东西,主要是作什么的,这样有助于看其它人写的代码。提到这个volatile,一般都会想到并发,同步,锁之类,但要想搞清楚需要看看下面一些知识。处理器,高速缓存,主内存之间的关系高速缓存的作用是什么?由于处理器与主内存在处理数据的速度上有数...
2017-02-12 17:56:00
126
转载 redisson实现分布式锁原理
Redisson分布式锁之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看看redisson是如何实现锁的。不同版本实现锁的机制并不相同引用的redisson最近发布的版本3.2.3,不同的版本可能实现锁的机制并不相同,早期版本好像是采用简单的setnx,getset等常规命令来配置完成,而后期由于re...
2017-02-10 10:33:00
452
转载 计算两个字符串最大公有子串
背景对算法一直应用的比较少,最近看到一些典型的算法想练练手,想看看到底有多么让人讨厌。其实发现算法都有一定的套路,一般并不是临时凭空想出来的,大都建立在一些已经存在的经典算法知识以及数据结构上。换句话来说,如果某些玩法之前未接触过,那么让你在短时间内临时想出来还是有一定难度的。这有点类似项目经验,如果曾经做过一个CRM系统,下次再碰到它时你就轻松很多,如果你挑战的是一个你从未...
2017-01-23 13:03:00
117
转载 技术图谱
技能图谱技能总结:查漏补缺,做到极致开发语言工作语言Java,C#,JavaScript兴趣语言Shell,GoJAVA语言IOCAOPClassLoader集合泛型多线程异常JVM内存模型GCGC的种类及应用场景,典型GC算法监控(计划学习)优化借助jdk工具...
2017-01-22 13:59:00
129
转载 基于注解的锁
背景某些场景下,有可能一个方法不能被并发执行,有可能一个方法的特定参数不能被并发执行。比如不能将一个消息发送多次,创建缓存最好只创建一次等等。为了实现上面的目标我们就需要采用同步机制来完成,但同步的逻辑如何实现呢,是否会影响到原有逻辑呢?嵌入式这里讲的嵌入式是说获取锁以及释放锁的逻辑与业务代码耦合在一起,又分分布式与单机两种不同场景的不同实现。单机版本下面方法...
2017-01-19 21:50:00
179
转载 Spring MVC中的HandlerMapping与HandlerAdapter
Spring MVC中的HandlerMapping与HandlerAdapter的关系最近和同事讨论一个spring mvc的问题,问到HandlerMapping与HandlerAdapter有什么关系?虽然使用spring mvc时间也不短,但是瞬间能起来的只有两个关键词:@RequestMapping,这个经常用的,每个 Controller下面的action...
2017-01-12 15:02:00
171
转载 变通实现微服务的per request以提高IO效率(三)
效率变通实现微服务的per request以提高IO效率(二)遗留一个问题,如何正确的释放存储在ThreadLocal中的缓存,最理由就是在我们请求的方法执行完成后去清除缓存。Filter由于我的项目是基于dubbo的,所以可以利用dubbo提供的Filter机制去完成这件事情,可以看下filter的地位:最终的效果:创建ThreadLocalCach...
2016-12-02 15:00:00
151
转载 变通实现微服务的per request以提高IO效率(二)
效率变通实现微服务的per request以提高IO效率中提到的同一请求过程中对于同一个方法的多次读取只实际调用一次,其余的读取均从第一次读取的结果缓存中获取,以提高读取的效率。实现方案是引入了Context对象,可以理解成上下文的一个环境变量,业务方法在获取数据时先从Context中取,如果取不到从数据库中加载并将结果写入Context中,而Context是通过Thread...
2016-11-27 19:18:00
147
转载 变通实现微服务的per request以提高IO效率
效率同一次业务操作过程中,往往会出现某种操作被重复执行,逻辑上来讲如果只执行一次是最理想的。这里所指的操作特指一些IO操作,比如从数据库中获取登录人的信息,也就是说如果一次请求中包含5个小逻辑,这5个小逻辑包含3次获取用户信息的操作,理想的情况是3次只有一次是从数据库中加载,其余的两次从缓存中获取。多次调用,每个服务实现独自请求用户信息。 一次...
2016-11-26 03:57:00
198
转载 ZKUI中文编码以及以docker方式运行的问题
ZKUI中文编码问题上周有同事反馈,通过ZKUI这个工具去上传带有中文的节点值时会出现中文无法显示的问题。最终发现编码是NCR编码,全称是:Numeric Character Reference。什么是NCR?这里引入一段维基百科的描述。A numeric character reference (NCR) is a common markup constru...
2016-11-20 11:32:00
314
转载 回顾面试题:计算两个数组交集
背景工作多年,语言经历过C#,JAVA。但是做过的项目大多以业务系统为主,曾经做过一些基础架构的工作,但算法一直在工作中应用的比较少,导致多年之后基本都忘记完了。上一次面试过程中就有一个算法题,我能做对,但是感觉不是最优方案就放弃了。最近想想做为一个程序员,算法还是有必要再补习补习。案例有两个数组,int[] arrayA=new int[]{1,3,1.....},...
2016-11-06 01:11:00
309
转载 老生常谈:状态模式
背景做为一名使用高级语言的程序员,面向对象的设计一直都是体现程序员能力的重要标准之一,所以在我工作两年后也就是2008年我也开始了对于面向对象设计的学习,主要是拿GOF设计模式来练手,尽管实际项目中没有真正的使用过。常见的23种设计模式,我从2008一至到2009年将近一年的时间我基本上将这些模式都写了一篇Demo,但可能是当时的认识问题有少部分的模式我并没有写下笔记,比如这...
2016-10-29 12:47:00
123
转载 利用SCORE法则来总结一次偷懒的单元测试过程
最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家。 S:背景 代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到指定的最低覆盖率要求。 C:冲突,或者叫问题吧 项目结构与代码扫描工具的特殊关系导致需要额外写更多的单元测试,因为目前开发管理部门的代码描述配置的是按JAVA工程来扫描,并不能...
2016-10-15 15:57:00
379
转载 转:Java Web应用中调优线程池的重要性
不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍Java线程池的使用和如何正确的配置线程池。单线程我们先从基础开始。无论使用哪种应用服务器或者框架(如Tomcat、Jetty等),他们都有类似的基础实现。Web服务的基础是套接字 (socket),套接字负责监听端口,等...
2016-09-04 16:56:00
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人