自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

代码改变世界

  • 博客(27)
  • 收藏
  • 关注

原创 无锁编程的原理和应用

一、基于锁的编程的缺点在传统的多线程编程中,多线程之间一般用各种锁的机制来保证正确的对共享资源进行访问和操作。只要需要共享某些数据,就应当将对它的访问串行化。比如像++count(count是整型变量)这样的简单操作也得加锁,因为即便是增量操作这样的操作,实际上也是分三步进行的:读、改、写(回)。在使用锁机制的过程中,即便在锁的粒度、负载、竞争、死锁等需要重点控制的方面解决的很好,也无法彻...

2018-02-25 10:04:19 1373

原创 Java从基础到架构总结

一、数据结构和算法常用数据结构 数组:大小固定的数据结构。顺序存储,随机访问。链表:链表存储,顺序访问。主要有循环单链表,双向链表,循环双向链表。堆:二叉堆。栈:又叫LIFO表,后进先出。限制插入和删除只能在栈顶进行操作。队列:又叫FIFO表,先进先出。限制删除只能在对头进行操作,插入只能在队尾进行操作。二叉树算法思想 算法分析:按照时间复杂度和空间复杂度。算法思想:递推、...

2018-02-24 12:58:13 684

原创 关系型数据库设计总结

一、设计阶段流程规划阶段:主要工作是对数据库的必要性和可行性进行分析。确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。概念阶段:主要工作是收集并分析需求。识别需求,主要是识别数据实体和业务规则。对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流...

2018-02-23 17:34:27 2164

原创 Java并发包之Lock锁和Condition条件

一、Synchronizedsynchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1. 获取锁的线程执行完该代码块,然后线程释放对锁的占有。 2. 线程执行发生异常,此时JVM会让线程自动释放锁。...

2018-02-23 15:00:37 1418

原创 Java并发包之闭锁/栅栏/信号量

一、Java多线程总结:描述线程的类:Runable和Thread都属于java.lang包。内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/notifyAll()属于java.lang包。提供内存可见性和防止指令重排的volatile属于jvm关键字。而java.util.concurrent包(J.U.C)中包含的是...

2018-02-23 12:08:11 2910

转载 Java异常的设计原则

原文地址:https://www.jianshu.com/p/1e0199e3c34e每个软件都可能遇到异常,所以从设计阶段就要考虑异常处理的问题,纳为业务流程的一部分。异常是需要妥善处理的,但是处理的前提是发现异常,而发现异常的前提的对异常有清楚的认识,我们要先认识到程序中都有什么样的异常(定义异常),然后在程序结构中检测和抛出异常(捕获异常),最后用恰当的业务流程去分别处理(处理异常)...

2018-02-23 10:19:51 358

原创 spring原理总结

Spring中的Scope的作用Scope为对象在Spring容器中的创建方式,也可以理解为对象在容器中的生命周期。Scope的类型有:Single、Prototype、Request、Session、Global Session五种: Single:单例模式,从容器启动到第一次getBean被实例化后,就一直存在于容器中,知道容器退出或销毁。Prototype:多例模式,每次getB...

2018-02-12 14:09:49 338

原创 系统设计总结

不好的设计的几个特性:僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的改动。脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性:很难解开系统的纠结,使之成为一些可在其他系统重用的组件。粘滞性:做正确的事情比做错误的事情要困难。不必要的复杂性:设计中包含有不具任何直接好处的基础结构。不必要的重复:设计中包含有重复的结构,而该重复的结...

2018-02-12 10:47:13 1615

原创 大流量和高并发应对手段总结

大流量和高并发的常规应对手段扩容、动静分离、缓存、服务降级和限流。限流的常用算法和实践思路目前主流的算法主要有三种:令牌桶算法、漏桶算法和计数器算法。 令牌桶算法:主要限制流量的流入速率,允许出现一定程度的突发流量。Nginx的限流模块就是使用的这种算法实现的。 每秒会有r个令牌按照固定速率放入桶中。桶的容量是固定不变的,如果桶满了再放入令牌,则溢出。若桶中的可用令牌不足...

2018-02-12 10:25:44 4926

原创 导致系统性能卡又慢的原因汇总(不断补充)

系统的配置参数没有正确配置,如数据库,redis等。具体可以参考:项目性能优化参数配置汇总TCP的配置,在特定的场景中,有可能会遇到延迟的ACK,它会限制链路上所发送的数据包,每秒钟只会有2-5个数据包。这是因为TCP两个算法所引起的死锁:Nagle以及TCP Delayed Acknowledgement。在200-500ms的超时之后,会打破这个死锁,但是微服务之间的通信却会分别受到影响。...

2018-02-11 17:35:06 1760

原创 项目性能优化参数配置汇总

nginx(在nginx.conf配置文件里面)worker_processes:启动进程,跟CPU核数相同。worker_connections:单个进程的最大并发数,所以nginx的最大并发数即worker_processes*worker_connections。tomcat(server.xml)protocol:服务器协议,目前我们使用的是Http11AprPro...

2018-02-11 17:07:35 510

原创 netty原理总结(未完、待续)

UNIX提供了5中I/O模型阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,期间会一直阻塞等待。非阻塞I/O模型:recvfrom从应用层到内核的时候,如果缓冲区没有数据,就返回一个EWOULDBLOCK错误,然后一直轮询检查这个状态,看内核是不是有数据到来。I/O复用模型: select/poll:进程通过将...

2018-02-11 16:53:54 281

原创 mysql总结

MySQL Query Optimizer基本工作原理当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调...

2018-02-11 16:48:30 251

原创 java虚拟机JVM总结

内存模型:程序计数器、虚拟机栈、本地方法栈、堆、方法区(永久代)程序计数器(counter) 线程私有。是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域。虚拟机栈(VM stack) 线程私有,使用连续的...

2018-02-11 15:54:51 241

原创 nginx原理总结

nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,惰性检测。ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next_up...

2018-02-11 09:51:31 352

原创 《亿级流量网站架构核心技术》总结

nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,属于惰性检测。 ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next...

2018-02-10 15:45:35 6330 1

原创 《人人都是架构师》总结

警惕Dubbo因超时和重试引起的系统雪崩超时时间一定要设置,要根据业务场景而定,设置太短容易引发重试,设置太长容易引发请求堆积。超时设置过短的后果:Dubbo默认失败重试2次,所以假设有1000个并发,都超时了,则会重试2次,变成3000个请求,导致请求流量翻了3倍。重试设置:写服务一般要考虑幂等性,所以失败后不进行重试。Dubbo重试的集中容错方案: failover(失败重试其他...

2018-02-10 15:30:30 1008

原创 《JAVA程序性能优化》总结

设计优化单例模式:延时加载(内部类)。反射和序列化会破坏单例代理模式:延时加载 静态代理:包括主题接口、真实主题、代理类、main。初始化时使用代理,真正使用时再通过代理加载真实主题。动态代理:jdk动态代理、CGLIB、javassist基于动态代码的代理、ASM。动态加载过程(以CGLIB为例): 根据指定的回调类生成class字节码,并保存在byte数组中。通过反射,调用C...

2018-02-10 15:23:28 621

原创 《构建高性能web站点》总结

数据发送的过程(从主机到线路的过程)应用程序首先将数据写到该进程的地址空间中。应用程序通过系统函数库接口向内核发出系统调用,系统内核将这些数据从用户态内存复制到内核缓冲区中。(内核缓冲区大小有限,所有数据都以队列的方式进入这里)。数据写入内核缓冲区后,内核通知网卡控制器来取数据,将数据复制到网卡的缓冲区中。网卡缓冲区将要发送出去的数据进行字节到位的转换(二进制),然后依次发出。...

2018-02-10 14:53:11 323

原创 消息队列原理总结

消息队列应用的场景业务解耦:消息队列要解决的最本质问题,实现设计的单一性原则,不耦合其他模块的业务。最终一致性:用来处理延迟不那么敏感的“分布式事务”场景或者不重要的业务。广播:下游有很多系统关心你的系统发出的通知的时候。错峰和流控:上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”。在下游有能力处理的时候,再进行分发。为什么消息队列需要broker(消息队列...

2018-02-09 17:40:30 7634 1

原创 redis原理总结

redis单点吞吐量单点TPS达到8万/秒,QPS达到10万/秒。redis的5中存储类型string、list、set、map(hash)、stored-setredis的string类型能表达3中类型:字符串、整数和浮点数。根据场景相互间自动转型,并且根据需要选取底层的承载方式value内部以int、sds作为结构存储。int存放整型数据,sds存放字节/字符串...

2018-02-05 22:53:40 7622 3

原创 Dubbo并发通信原理解析

从Dubbo开源文档中看到:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 Dubbo通信默认采用的是Netty框架。Netty实质就是通过Socket进行通信,Socket(TCP)通信是全双工的方式。 因为采用单一长连接,所以如果消费者多线程请求,服务端处理完消息后返回,就会造成消息错乱的问题。解决这个问

2018-02-05 20:11:13 4314

原创 Dubbo暴露服务源码解析

Dubbo服务提供方的JavaBean对应的就是ServiceBean。ServiceBean除了继承dubbo自己的配置抽象类以外,还实现了一系列的spring接口用来参与到spring容器的启动以及bean的创建过程中去。 由于ServiceBean是单例模式的,在Spring的容器启动过程中会预先初始化。最后finishRefresh会触发ContextRefreshedEvent事件

2018-02-04 18:47:07 661

原创 Dubbo定义的元素注册到Spring容器的原理解析

Spring对第三方自定义元素配置的支持Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema, 在spring2.0之前采用的是DTD,在spring2.0之后采用Schema。使用Schema方

2018-02-04 15:31:48 1596

原创 Dubbo异步调用的方式及配置

异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端通过 async=”true”标识。reference id="xxx" ....> name="method1" async="true" />reference>具体有以下四种方式:1、 NIO future主动获取结果,返回结果放在RpcContext中。需要注意的是

2018-02-04 14:13:11 3533

原创 常用限流算法:令牌桶和漏桶算法解析

漏桶算法漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。 令牌桶算法对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理

2018-02-04 11:58:08 3426

原创 Dubbo原理总结

Dubbo主要的节点角色及之间的关系主要的节点角色: Provider:暴露服务的服务提供者Consumer:调用远程服务的服务消费者Registry:服务注册与发现的注册中心Monitor:统计服务调用次数和调用时间的监控中心Container:服务运行容器节点角色之间的关系: 服务容器负责加载、运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。服务消费者...

2018-02-03 17:02:45 771 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除