- 博客(122)
- 收藏
- 关注
原创 Netty私有协议栈开发
几个基本功能描述消息协议定义,消息编解码,连接认证,链路有效性校验机制,链路的断开重连机制。主要设计消息协议设计:消息头+消息体。消息头定义了基本协议字段定义,添加attachment方便扩展。Object编解码使用Marshaller。链路交互设计:链路什么时候建立,什么时候关闭,握手请求与相应。可靠性设计:心跳检查机制,重连机制,重复登录保护,消息缓存重发。安全性设计:本章使用基于...
2019-12-28 09:28:00
273
原创 消息中间件的核心作用及能力
1、系统解耦假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要这个数据。那简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了。整个过程,如下图所示:但是现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统慢慢的都需要这份核心数据呢?如下图所示:大家可别以为这是开玩笑,一个大规模系统,往往会拆分为几十个甚至上百个子系统,每个子系统又对应...
2019-12-26 21:41:25
1095
原创 Java程序员数量即将超过百万?Java还香吗?
数据指出,Java程序语言已经成为世界第一大编程语言。Java源自1995年,在经历了20多年的发展至今,十分受大家欢迎,每年仍有数十万人加入Java开发大潮中来。可以看出,Java很受大众欢迎。我们来了解一下,Java程序员在世界上以及在中国的数量以及程序员占比。来自2014年的数据分析报告显示,2014年全球的软件开发者3数量已经达到1850万人,其中1100万是专业的开发人员,还有750...
2019-12-25 17:49:36
1389
原创 如何在Java中使用本地缓存提升Redis
本地缓存是提高Redis等数据库性能的最有用的策略之一。希望在Java中进行本地缓存的Redis开发人员会发现Redis不支持这一功能。在本文中,我们将讨论如何使用第三方redis java客户机利用java和redis中的本地缓存什么是本地缓存?缓存是内存缓冲区,用于将数据存储在一个方便的位置,以便以后对该数据的请求能够更快地执行。在本地缓存中,数据库中最常用的数据在物理上存储在离访问它的...
2019-12-20 20:55:33
859
原创 Java详解之Nginx 虚拟主机
什么是虚拟主机虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供 www 服务,这样就可以实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的。通过 Nginx 可以实现虚拟主机的配置,Nginx 支持三种类型的虚拟主机配置基于 IP 的虚拟主机基于域名的虚拟主机基于端口的虚拟主机Nginx 配置文件的结构...
2019-12-18 22:24:46
258
原创 Java深入剖析之JVM
Java运行时数据区:Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。2、虚拟机栈:虚拟机栈是Java执行方法...
2019-12-16 21:33:48
226
原创 Java NIO之tcp粘包拆包
一 ByteToMessageDecoder1.1 实例ByteToMessageDecoder,用于把一个byte流转换成一个对象,实例:public class StringDecoder extends ByteToMessageDecoder { protected void decode(ChannelHandlerContext ctx, ByteBuf in, Lis...
2019-12-16 21:19:09
884
原创 深入剖析HashMap应用原理
Hashing(散列法或哈希法)的概念散列法(Hashing)是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。HashMap概念和底层结构HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作...
2019-12-14 21:23:36
221
原创 Java架构进阶之Redis内存回收策略
1、背景作为时下热门的存储系统,Redis在系统扮演重要角色。不管是 session 存储还是热点数据的缓存,还是其他场景,都会用到 Redis。在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?2、Redis 内存设置我们都知道如果我们要设置 Redis 的最大内存大小只需要在配置文件redis.conf 中配置一行 maxm...
2019-12-14 21:11:58
461
原创 数据库分库分表策略的具体实现方案
MySQL扩展具体的实现方式随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。关于数据库的扩展主要包括:业务拆分、主从复制,数据库分库与分表。文章主要讲述数据库分库与分表(1)业务拆分业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构。随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越来越低,并且对资源的...
2019-12-12 20:15:15
313
原创 java分析—异常与处理机制
异常机制自定义异常异常机制Throwable类Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。Throwable又派生出Error类和Exception类。错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能...
2019-12-11 20:31:34
160
原创 Hystrix断路器在微服务架构SpringCloud场景中应用详解
Hystrix是什么?在分布式环境中,许多服务依赖项中的一些将不可避免地失败。Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止其间的级联故障以及提供回退选项,从而提高系统的整体弹性。文章篇幅过长。感兴趣的朋友可以提前收藏加关注,后续会有类似文章更新。分享一下个人整理的架构进阶学习路线以及学习资料,需要的朋友可以...
2019-12-09 21:01:15
492
原创 java架构之微服务架构—雪崩效应
前言微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,比如:服务的自动扩充,熔断和限流等,随着业务的扩展,服务的数量也会随之增多,逻辑会更加复杂,一个服务的某个逻辑需要依赖多个其他服务才能完成。一但一个依赖不能提供服务很可能会产生雪崩效应,最后导致整个服务不可访问。微服务之间进行rpc或者http调用时,我们一般都会设置调用超...
2019-12-06 20:07:52
253
原创 Java高并发网络编程
一、OSI网络七层模型因特网是一个极为复杂的网络,分层有助于我们对网络的理解 。分层也是一种标准,为了使不同厂商的计算机能够互相通信,以便在更大范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。ISO组织制定了OSI网络七层模型而因特网只用到了五层低三层:屏蔽底层网络的复杂性物理层:使原始的数据比特流能在物理介质上传输。数据链路层:通过校验、确认和反馈重发等手段...
2019-12-05 19:20:20
331
原创 Java高并发--CPU多级缓存与Java内存模型
CPU多级缓存为什么需要CPU缓存:CPU的频率太快,以至于主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费了资源。所有缓存的出现是为了缓解CPU和主存之间速度不匹配的问题——将运算所需数据复制到缓存中,使得运算能快速进行;当运算结束后再将缓存同步回内存中,这样处理器无需等待缓慢的内存读写。缓存并非存储了所有的数据,那么它存在的意义是什么?时间局部性:如果某个数据被访问,...
2019-12-04 20:57:58
563
原创 Java高并发- 锁的优化及 JVM 对锁优化所做的努力
在高并发环境下,激烈的锁竞争会导致程序的性能下降,所以我们有必要讨论一下有关 锁 的性能问题及注意事项。如:避免死锁,减小锁粒度,锁分离等。一、锁优化1.1 减小锁持有时间在锁竞争过程中,单个线程对锁的持有时间与系统性能有着直接的关系,如果线程持有锁的时间很长,那么相对地,锁的竞争程序也就越激烈。示例代码:public void syncMethod(){fun1();mutextM...
2019-12-03 19:34:45
428
原创 2019大厂面试真题之消息中间件—kafka
kafka:1.消息分类按不同类别,分成不同的Topic,Topic⼜拆分成多个partition,每个partition均衡分散到不同的服务器(提⾼并发访问的能⼒)2.消费者按顺序从partition中读取,不⽀持随机读取数据,但可通过改变保存到zookeeper中的offset位置实现从任意位置开始读取3.服务器消息定时清除(不管有没有消费)4.每个partition还可以设置备份...
2019-12-02 19:07:18
1149
原创 分布式事务
目录:1.什么是事务?2.换个角度看事务3.Java中的事务4.啥又是分布式事务?5.分布式事务的几种实现思路6.总结写在前面在分布式、微服务大行其道的今天,相信大家对这些名词都不会陌生。而说到使用分布式,或者拆分微服务的好处,你肯定能想到一大堆。比如每个人只需要维护自己单独的服务,没有了以前的各种代码冲突。自己想测试、想发布、想升级,只需要care自己写的代码就OK了,很方便很...
2019-11-28 19:44:28
137
原创 在 Java 中利用 redis 实现分布式架构的全局唯一标识服务
获取全局唯一标识的方法介绍在一个IT系统中,获取一个对象的唯一标识符是一个普遍的需求。在以前的单体应用中,如果数据库是一个单数据库的结构。通常可以利用数据库的自增字段来获取这个唯一标识。例如,在 Mysql 数据库中,我们可以通过 sql 语句创建一个自增长的 int 字段类型的表。如下所示。CREATE TABLE student( id INT NOT NULL AUTO_IN...
2019-11-27 20:07:49
331
原创 分布式唯一ID服务架构
一、背景介绍在大型互联网应用中,随着用户数的增加;为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代我们可以完全依赖于数据库的自增ID来唯一标识一个条数据。但是当我们对数据库进行了分库分表之后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。因为自增的ID不能在分库分表的场景下准确的路由到正确的数据。因此我们需要提供一个全局唯一的ID生成策略来支持分库分表的应用环境;...
2019-11-26 19:08:42
205
原创 分布式容错架构很难?一篇给你讲清楚
虽然定位是有“分布式”、“容错架构”等看起来略显复杂的字眼,但是咱们还是按照老规矩:大白话 + 手绘数张彩图,逐步递进,让每个同学都能看懂这种复杂架构的设计思想。咱们就用分布式存储系统举例,来聊一下容错架构的设计。首先,我们来瞧瞧,到底啥是分布式存储系统呢?其实特别的简单,咱们就用数据库里的一张表来举例。比如你手头有个数据库,数据库里有一张特别大的表,里面有几十亿,甚至上百亿的数据。更进一...
2019-11-26 18:42:53
729
原创 Spring AOP(二) 修饰者模式、JDK Proxy以及源码分析
在上边一篇文章中我们介绍了Spring AOP的基本概念,今天我们就来学习一下与AOP实现相关的修饰者模式和Java Proxy相关的原理,以及AOP的源码分析。修饰者模式Java设计模式中的修饰者模式能动态地给目标对象增加额外的职责(Responsibility)。它使用组合(object composition),即将目标对象作为修饰者对象(代理)的成员变量,由修饰者对象决定调用目标对象的...
2019-11-26 13:46:53
158
原创 分布式、微服务服务架构剖析
一、RPCRPC(Remote Process Call),即远程服务调用,被广泛地应用在很多企业应用中,是早期主要的服务治理方案,其流程较为简单,客户端consumer携带参数发送RPC请求到服务提供方provider,provider根据参数路由到具体函数,方法,并将执行获得的结果返回,至此一次RPC调用完成。 随着业务的发展,大数据时代的到来,服务提供方的压力也日益增大,单机应用的处...
2019-11-25 21:16:17
298
原创 JAVA分布式架构之kafka日志队列实战
架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了。kafka介绍Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个...
2019-11-25 20:55:50
445
原创 到底选择SQL还是NoSQL?看这里!
你是否在为系统的数据库来一波大流量就几乎打满 CPU,日常 CPU 居高不下烦恼?你是否在各种 NoSQL 间纠结不定,到底该选用哪种最好?今天的你就是昨天的我,这也是我写这篇文章的初衷。作为互联网从业人员,我们要知道关系型数据库(MySQL、Oracle)无法满足我们对存储的所有要求,因此对底层存储的选型,对每种存储引擎的理解非常重要。同时也由于过去一段时间的工作经历,对这块有了一些更多的思...
2019-11-22 21:54:26
723
原创 java实现socket连接方法封装详解
Java实现socket连接技巧Socket通信几乎无时不在, 当然能够搜集到的信息也大量存在, 为了避免重复的劳作, 抽取了关于客户端和服务端的Socket, 并将其应用到适合JVM(LInux/Windows)或者DVM(Android)平台. 这个封装好的API具有以下优势:1.满足具有Socket客户端需求的基本应用。2.满足具有Socket服务端的基本应用。具备并发能力, 能满足...
2019-11-21 19:58:53
1970
原创 Netty实战入门详解——让你彻底记住什么是Netty
一、Netty 简介Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Nett...
2019-11-20 18:35:56
816
原创 【分布式】缓存穿透、缓存雪崩,缓存击穿解决方案
一、什么样的数据适合缓存二、缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案:1)有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据...
2019-11-20 17:37:35
147
原创 分布式—缓存击穿
先了解一下定义:什么是缓存击穿?在讲解缓存击穿之前,我们先来看下从缓存中加载数据的逻辑,如下图所示因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。这就是缓存击穿。场景图如下所示:我们正常人在登录首页的时候,都是根据userID来命中数据,然而黑客的目的是破坏你的系统,黑客可以随机生成一堆use...
2019-11-19 18:51:53
115
原创 Spring AOP(一) AOP基本概念
Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清...
2019-11-19 17:09:01
172
原创 java定时任务框架elasticjob详解
前言Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。 ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX。 项目开源地址:https://github.co...
2019-11-18 21:02:28
1978
原创 Redis还有淘汰策略?一篇文章让你搞懂淘汰策略的实现!
1 配置文件中的最大内存删除策略在redis的配置文件中,可以设置redis内存使用的最大值,当redis使用内存达到最大值时(如何知道已达到最大值?),redis会根据配置文件中的策略选取要删除的key,并删除这些key-value的值。若根据配置的策略,没有符合策略的key,也就是说内存已经容不下新的key-value了,但此时有不能删除key,那么这时候写的话,将会出现写错误。1.1 最...
2019-11-16 18:17:43
429
原创 Java实现Redis的发布订阅
redis的应用场景实在太多了,现在介绍一下它的几大特性之一 发布订阅(pub/sub)。特性介绍: 什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)...
2019-11-16 17:49:52
464
原创 redis源码分析—集群--哨兵模式
redis在启动时,如果进程名是"redis-sentinel",或者参数中带了"–sentinel",这时redis便以哨兵的方式运行。一个sentinel可以监控多个master。sentinel的配置如下// 当前Sentinel节点监控 127.0.0.1:6379 这个主节点// 2代表判断主节点失败至少需要2个Sentinel节点节点同意// mymaster是主节点的别名s...
2019-11-15 18:17:02
285
原创 redis源码分析—基本数据结构
redis中使用的数据结构有:dict 字典,就是个哈希表,实现和HashMap类似,不做阐述;不同的是在哈希表resize()的时候是分步执行的,后续篇幅再说明。sds 很多项目都对自己的字符串进行了封装,作用类似于leveldb的slice。linkedlist 双端链表,迭代器的实现是通过链表的pre和next实现的,是个BidirctionalIterator。代码中只实现了For...
2019-11-15 17:54:03
206
原创 Nginx rewrite正则匹配重写的方法示例
Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向。这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1.org/mp3进行访问,而现在服务器上mp3目录已经被使用music目录替换,那rewrite这个功能则能够轻松实现。其次如可以将site1.org强制调整到www.site1.org,反之亦可。这个...
2019-11-14 19:27:00
1149
原创 Window搭建部署RocketMQ步骤详解
序以前简单用过ActiveMQ但是公司项目上使用的是RocketMQ,所以准备多花点时间在这上面,搞懂项目的配置使用。看了很多资料,先说说我自己对RocketMQ的简单理解。不管是我们写的消费者还是生产者都属于客户端,而我们需要安装RocketMQ,这是属于服务端。和ActivieMQ、zookeeper类似,消费者、生成者、服务端(NameServer)之间是采取观察者模式实现。在操作系统...
2019-11-13 20:07:34
627
原创 消息中间件这么多,到底应该如何选型?
消息队列已经逐渐成为企业应用系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能。当前使用较多的消息队列有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分数据库如 Redis、MySQL 以及 PhxSQL 也可实现消息队列的功能。消息队列概述消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据...
2019-11-12 20:24:13
1030
原创 消息中间件之ActiveMQ
一、为什么需要MQ?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。RPC和消息中间件的不同很大程度上就是“依赖性”和“同步性”。RPC方式是...
2019-11-12 19:49:05
288
原创 一篇文章揭秘Redis的磁盘持久化机制
前言Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RD...
2019-11-11 19:39:22
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人