无锁编程的原理和应用 一、基于锁的编程的缺点在传统的多线程编程中,多线程之间一般用各种锁的机制来保证正确的对共享资源进行访问和操作。只要需要共享某些数据,就应当将对它的访问串行化。比如像++count(count是整型变量)这样的简单操作也得加锁,因为即便是增量操作这样的操作,实际上也是分三步进行的:读、改、写(回)。在使用锁机制的过程中,即便在锁的粒度、负载、竞争、死锁等需要重点控制的方面解决的很好,也无法彻...
Java从基础到架构总结 一、数据结构和算法常用数据结构 数组:大小固定的数据结构。顺序存储,随机访问。链表:链表存储,顺序访问。主要有循环单链表,双向链表,循环双向链表。堆:二叉堆。栈:又叫LIFO表,后进先出。限制插入和删除只能在栈顶进行操作。队列:又叫FIFO表,先进先出。限制删除只能在对头进行操作,插入只能在队尾进行操作。二叉树算法思想 算法分析:按照时间复杂度和空间复杂度。算法思想:递推、...
关系型数据库设计总结 一、设计阶段流程规划阶段:主要工作是对数据库的必要性和可行性进行分析。确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。概念阶段:主要工作是收集并分析需求。识别需求,主要是识别数据实体和业务规则。对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流...
Java并发包之Lock锁和Condition条件 一、Synchronizedsynchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1. 获取锁的线程执行完该代码块,然后线程释放对锁的占有。 2. 线程执行发生异常,此时JVM会让线程自动释放锁。...
Java并发包之闭锁/栅栏/信号量 一、Java多线程总结:描述线程的类:Runable和Thread都属于java.lang包。内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/notifyAll()属于java.lang包。提供内存可见性和防止指令重排的volatile属于jvm关键字。而java.util.concurrent包(J.U.C)中包含的是...
Java异常的设计原则 原文地址:https://www.jianshu.com/p/1e0199e3c34e每个软件都可能遇到异常,所以从设计阶段就要考虑异常处理的问题,纳为业务流程的一部分。异常是需要妥善处理的,但是处理的前提是发现异常,而发现异常的前提的对异常有清楚的认识,我们要先认识到程序中都有什么样的异常(定义异常),然后在程序结构中检测和抛出异常(捕获异常),最后用恰当的业务流程去分别处理(处理异常)...
spring原理总结 Spring中的Scope的作用Scope为对象在Spring容器中的创建方式,也可以理解为对象在容器中的生命周期。Scope的类型有:Single、Prototype、Request、Session、Global Session五种: Single:单例模式,从容器启动到第一次getBean被实例化后,就一直存在于容器中,知道容器退出或销毁。Prototype:多例模式,每次getB...
系统设计总结 不好的设计的几个特性:僵化性:很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的改动。脆弱性:对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性:很难解开系统的纠结,使之成为一些可在其他系统重用的组件。粘滞性:做正确的事情比做错误的事情要困难。不必要的复杂性:设计中包含有不具任何直接好处的基础结构。不必要的重复:设计中包含有重复的结构,而该重复的结...
大流量和高并发应对手段总结 大流量和高并发的常规应对手段扩容、动静分离、缓存、服务降级和限流。限流的常用算法和实践思路目前主流的算法主要有三种:令牌桶算法、漏桶算法和计数器算法。 令牌桶算法:主要限制流量的流入速率,允许出现一定程度的突发流量。Nginx的限流模块就是使用的这种算法实现的。 每秒会有r个令牌按照固定速率放入桶中。桶的容量是固定不变的,如果桶满了再放入令牌,则溢出。若桶中的可用令牌不足...
导致系统性能卡又慢的原因汇总(不断补充) 系统的配置参数没有正确配置,如数据库,redis等。具体可以参考:项目性能优化参数配置汇总TCP的配置,在特定的场景中,有可能会遇到延迟的ACK,它会限制链路上所发送的数据包,每秒钟只会有2-5个数据包。这是因为TCP两个算法所引起的死锁:Nagle以及TCP Delayed Acknowledgement。在200-500ms的超时之后,会打破这个死锁,但是微服务之间的通信却会分别受到影响。...
项目性能优化参数配置汇总 nginx(在nginx.conf配置文件里面)worker_processes:启动进程,跟CPU核数相同。worker_connections:单个进程的最大并发数,所以nginx的最大并发数即worker_processes*worker_connections。tomcat(server.xml)protocol:服务器协议,目前我们使用的是Http11AprPro...
netty原理总结(未完、待续) UNIX提供了5中I/O模型阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,期间会一直阻塞等待。非阻塞I/O模型:recvfrom从应用层到内核的时候,如果缓冲区没有数据,就返回一个EWOULDBLOCK错误,然后一直轮询检查这个状态,看内核是不是有数据到来。I/O复用模型: select/poll:进程通过将...
mysql总结 MySQL Query Optimizer基本工作原理当客户端向MySQL请求一条Query,命令解析器模块完成请求分类,区别出是SELECT并转发给MySQL Query Optimizer时,MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调...
java虚拟机JVM总结 内存模型:程序计数器、虚拟机栈、本地方法栈、堆、方法区(永久代)程序计数器(counter) 线程私有。是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域。虚拟机栈(VM stack) 线程私有,使用连续的...
nginx原理总结 nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,惰性检测。ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next_up...
《亿级流量网站架构核心技术》总结 nginx后端节点健康检查主要有三种实现方式: 1. 本身自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块,属于惰性检测。 ngx_http_proxy_module:proxy_connect_timeout(与后端服务器建立连接的超时时间)、proxy_read_timeout(从后端服务器读取响应的超时)和proxy_next...
《人人都是架构师》总结 警惕Dubbo因超时和重试引起的系统雪崩超时时间一定要设置,要根据业务场景而定,设置太短容易引发重试,设置太长容易引发请求堆积。超时设置过短的后果:Dubbo默认失败重试2次,所以假设有1000个并发,都超时了,则会重试2次,变成3000个请求,导致请求流量翻了3倍。重试设置:写服务一般要考虑幂等性,所以失败后不进行重试。Dubbo重试的集中容错方案: failover(失败重试其他...
《JAVA程序性能优化》总结 设计优化单例模式:延时加载(内部类)。反射和序列化会破坏单例代理模式:延时加载 静态代理:包括主题接口、真实主题、代理类、main。初始化时使用代理,真正使用时再通过代理加载真实主题。动态代理:jdk动态代理、CGLIB、javassist基于动态代码的代理、ASM。动态加载过程(以CGLIB为例): 根据指定的回调类生成class字节码,并保存在byte数组中。通过反射,调用C...
《构建高性能web站点》总结 数据发送的过程(从主机到线路的过程)应用程序首先将数据写到该进程的地址空间中。应用程序通过系统函数库接口向内核发出系统调用,系统内核将这些数据从用户态内存复制到内核缓冲区中。(内核缓冲区大小有限,所有数据都以队列的方式进入这里)。数据写入内核缓冲区后,内核通知网卡控制器来取数据,将数据复制到网卡的缓冲区中。网卡缓冲区将要发送出去的数据进行字节到位的转换(二进制),然后依次发出。...
消息队列原理总结 消息队列应用的场景业务解耦:消息队列要解决的最本质问题,实现设计的单一性原则,不耦合其他模块的业务。最终一致性:用来处理延迟不那么敏感的“分布式事务”场景或者不重要的业务。广播:下游有很多系统关心你的系统发出的通知的时候。错峰和流控:上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”。在下游有能力处理的时候,再进行分发。为什么消息队列需要broker(消息队列...
redis原理总结 redis单点吞吐量单点TPS达到8万/秒,QPS达到10万/秒。redis的5中存储类型string、list、set、map(hash)、stored-setredis的string类型能表达3中类型:字符串、整数和浮点数。根据场景相互间自动转型,并且根据需要选取底层的承载方式value内部以int、sds作为结构存储。int存放整型数据,sds存放字节/字符串...
Dubbo并发通信原理解析 从Dubbo开源文档中看到:Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 Dubbo通信默认采用的是Netty框架。Netty实质就是通过Socket进行通信,Socket(TCP)通信是全双工的方式。 因为采用单一长连接,所以如果消费者多线程请求,服务端处理完消息后返回,就会造成消息错乱的问题。解决这个问
Dubbo暴露服务源码解析 Dubbo服务提供方的JavaBean对应的就是ServiceBean。ServiceBean除了继承dubbo自己的配置抽象类以外,还实现了一系列的spring接口用来参与到spring容器的启动以及bean的创建过程中去。 由于ServiceBean是单例模式的,在Spring的容器启动过程中会预先初始化。最后finishRefresh会触发ContextRefreshedEvent事件
Dubbo定义的元素注册到Spring容器的原理解析 Spring对第三方自定义元素配置的支持Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护。对于xml的文档结构、数据定义及格式验证可以通过DTD和Schema, 在spring2.0之前采用的是DTD,在spring2.0之后采用Schema。使用Schema方
Dubbo异步调用的方式及配置 异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端通过 async=”true”标识。reference id="xxx" ....> name="method1" async="true" />reference>具体有以下四种方式:1、 NIO future主动获取结果,返回结果放在RpcContext中。需要注意的是
常用限流算法:令牌桶和漏桶算法解析 漏桶算法漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。 令牌桶算法对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理
Dubbo原理总结 Dubbo主要的节点角色及之间的关系主要的节点角色: Provider:暴露服务的服务提供者Consumer:调用远程服务的服务消费者Registry:服务注册与发现的注册中心Monitor:统计服务调用次数和调用时间的监控中心Container:服务运行容器节点角色之间的关系: 服务容器负责加载、运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。服务消费者...
HttpClient 4.3连接池参数配置及源码解读 一、HttpClient连接池、请求参数含义二、执行原理及源码解读 1、创建HttpClient,执行request 2、连接池管理 2.1、连接池结构 2.2、分配连接 & 建立连接 2.3、回收连接 & 保持连接 2.4、instream.close()、resp...
Centos6.5升级内核,并安装docker 一、内核升级,从2.6升级到3.10.1071、先确定当前内核版本# uname -r2.6.32-220.el6.x86_64# cat /etc/centos-release CentOS release 6.5 (Final)2、安装依赖开发环境和开发库# yum grouplist //查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库;# yum gr...
nginx编译安装 一、编译安装1、安装编译nginx所需的依赖包yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel2、上传nginx压缩包到/usr/local/src目录3、编译安装nginxcd /usr/loc
java NIO原理解析和代码实现 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO原理及通信模型二.java NIO服务端和客户端代码实现 具体分析: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 假如现在你对阻塞I/O已有了一定了解,我们知道阻塞I/O在调用InputStream.read()方法时是阻塞的
线程池的选用与线程数的指定 1、选用的两个角度高性能:将提交到线程池中的任务直接交给线程去处理(前提:线程数小于最大线程数),不入队缓冲执行:希望提交到线程池的任务尽量被核心线程(corePoolSize)执行掉2、高性能队列:SynchronousQueue最大线程数:一般设为Integer.MAX_VALUE(整数最大值),防止回绝任务典型案例:newCachedThreadPool尤其适合于执行
Executors源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5149906.html1、Executors与ThreadPoolExecutorThreadPoolExecutor可以灵活的自定义的创建线程池,可定制性很高想创建好一个合适的线程池比较难使用稍微麻烦一些实际中很少使用Executors可以创建4种线程池,这四种线程池基本上已经包含了所有需求,将来根据业务特点选用就...
ThreadPoolExecutor使用+工作机理+生命周期 原文地址:http://www.cnblogs.com/java-zhao/p/5146601.html1、最基础的线程池ThreadPoolExecutor使用方式: 1 /** 2 * ThreadPoolExecutor测试类 3 * 注意: 4 * 1、ThreadPoolExecutor是一个线程池 5 * 2、多个任务都可以由该线程池中选出几条线程来执行 6 */...
ThreadPoolExecutor源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5147811.html1、源代码主要掌握两个部分线程池的创建:构造器提交任务到线程池去执行:execute() 2、构造器2.1、一些属性: /** * runState provides the main lifecyle control, taking on values: * ...
常见5中并发集合的对比总结 1、常用的五种并发包ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedBlockingQueue2、ConcurrentHashMap线程安全的HashMap的实现数据结构:一个指定个数的Segment数组,数组中的每一个元素Segment相当于一个HashTabl
LinkedBlockingQueue源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5135958.html1、对于LinkedBlockingQueue需要掌握以下几点创建入队(添加元素)出队(删除元素)2、创建Node节点内部类与LinkedBlockingQueue的一些属性 static class Node<E> { E item;//节点封装的数据 ...
ArrayBlockingQueue源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5135410.html1、对于ArrayBlockingQueue需要掌握以下几点创建入队(添加元素)出队(删除元素)2、创建public ArrayBlockingQueue(int capacity, boolean fair)public ArrayBlockingQueue(int capacity)使用方法...
CopyOnWriteArraySet源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5122447.html1、对于CopyOnWriteArraySet需要掌握以下几点创建:CopyOnWriteArraySet()添加元素:即add(E)方法删除对象:即remove(E)方法遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历注:CopyOnWriteArraySet...
HashSet源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5110953.html1、对于HashSet需要掌握以下几点HashSet的创建:HashSet()往HashSet中添加单个对象:即add(E)方法删除HashSet中的对象:即remove(Object key)方法判断对象是否存在于HashSet中:containsKey(Object key) 注:HashS...
LinkedList源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5105575.html一、对于LinkedList需要掌握的八点内容LinkedList的创建:即构造器往LinkedList中添加对象:即add(E)方法获取LinkedList中的单个对象:即get(int index)方法修改LinkedList中的指定索引的节点的数据set(int index, E elem...
CopyOnWriteArrayList源码解析 原文链接:http://www.cnblogs.com/java-zhao/p/5121944.html1、对于CopyOnWriteArrayList需要掌握以下几点创建:CopyOnWriteArrayList()添加元素:即add(E)方法获取单个对象:即get(int)方法删除对象:即remove(E)方法遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历注...
ArrayList源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5102342.html一、对于ArrayList需要掌握的七点内容ArrayList的创建:即构造器往ArrayList中添加对象:即add(E)方法获取ArrayList中的单个对象:即get(int index)方法删除ArrayList中的对象:即remove(E)方法遍历ArrayList中的对象:即iter...
ConcurrentHashMap源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5113317.html1、对于ConcurrentHashMap需要掌握以下几点Map的创建:ConcurrentHashMap()往Map中添加键值对:即put(Object key, Object value)方法获取Map中的单个对象:即get(Object key)方法删除Map中的对象:即remove(Ob...
HashMap源码解析 原文地址:http://www.cnblogs.com/java-zhao/p/5106189.html1、对于HashMap需要掌握以下几点Map的创建:HashMap()往Map中添加键值对:即put(Object key, Object value)方法获取Map中的单个对象:即get(Object key)方法删除Map中的对象:即remove(Object key)方法判断对象是否存在于...
ReentrantLock源码解析(三):总结 常用方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new ReentrantLock(); lock.lock();//获取锁 try...
ReentrantLock源码解析(二):释放锁unlock() 原文地址:http://www.cnblogs.com/java-zhao/p/5133402.html最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new Reentrant...
ReetrantLock源码解析(一):获得公平锁和非公平锁lock() 原文链接:http://www.cnblogs.com/java-zhao/p/5131544.html最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new Reentrant...
ConcurrentLinkedQueue源码解析 原文链接:http://www.jianshu.com/p/26d9745614dd前言我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下ConcurrentLinkedQueue是如何保证线程...
Java多线程中join方法的理解 thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒 先上一段JDK中代码:/**
多线程死锁以及解决方法 解决死锁没有简单的方法,这是因为线程产生死锁都各有各的原因,而且往往具有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在这里中,下面将讨论开发过程常见的4类典型的死锁和解决对策。(1)数据库死锁 在数据库中,如果一个连接占用了另一个连接所需的数据库锁,则它可以阻塞另一个连接。如果两个或两个以上的连接相互阻塞,则它们都不能继续执行,这种情况称为数
linux上.MySQL主从复制的配置 环境操作系统:CentOS-6.6-x86_64-bin-DVD1.isoMySQL版本:mysql-5.6.26.tar.gz主节点IP:192.168.1.205 主机名:edu-mysql-01从节点IP:192.168.1.206 主机名:edu-mysql-02主机配置:4核CPU、4G内存 依赖课程《高可用
linux上MySQL源码编译安装 部署环境操作系统:CentOS-6.6-x86_64-bin-DVD1.isoMySQL版本:mysql-5.6.26.tar.gz 操作用户:root系统IP:192.168.1.205主机名:edu-mysql-01
linux上keepalived+nginx实现高可用web负载均衡 一、场景需求二、Keepalived 简要介绍Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。VRRP(VirtualRouterRedundanc
linux上reids集群安装 参考文档Redis官方集群指南:Redis cluster tutorial – RedisRedis官方集群规范:Redis Cluster Specification – RedisRedis集群指南(中文翻译,紧供参考):集群教程 — Redis 命令参考Redis集群规范(中文翻译,紧供参考):Redis 集群规范Redis集群的安装(R
linux上ActiveMQ 集群安装、配置和高可用测试 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于ZooKeeper + LevelDB的 Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。 三种集群方式的对比: (1)基于共享文件系统(KahaDB,默认): (2)基于 JDBC:
linux上zookeeper集群的安装、配置和高可用测试 Dubbo建议使用Zookeeper作为服务的注册中心。Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的。正是基于这个特性,要将ZK集群的节点数量要为奇数(2n+1:如3、5、7个节点)较为合适。 ZooKeeper与Dubbo服务集群架构图 服务器1
linux上安装分布式文件系统FastDFS(单节点) 跟踪服务器:192.168.4.121 (edu-dfs-tracker-01)存储服务器:192.168.4.125 (edu-dfs-storage-01)环境:CentOS 6.6用户:root 数据目录:/fastdfs (注:数据目录按你的数据盘挂载路径
linux上安装redis(单节点) IP:192.168.4.111 环境:CentOS 6.6 Redis 版本:redis-3.0 (考虑到 Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,而且很快就出正式版) 安装目录:/usr/local/redis 用户:root 编译和安装所需的包: # yum install gcc tcl 下载 3.0
linux上安装activeMQ(单节点) IP:192.168.4.101 环境:CentOS 6.6、JDK7 1、 安装 JDK 并配置环境变量(略) JAVA_HOME=/usr/local/java/jdk1.7.0_72 2、 下载 Linux 版的 ActiveMQ(当前最新版 apache-activemq-5.11.1-bin.tar.gz) $ wget http://apache
linux上安装maven私有库nexus私服 Maven私有库和本地库的安装与配置SonatypeNexus + Maven环境:CentOS6.6Final、JDK7、Sonatype Nexus、MavenIP:192.168.4.221root用户操作前提:已安装JDK7并配置好了环境变量1、下载最新版Nexus(本教程使用的是:nexus-2.11.2-03-bundle.tar.gz)
linux上安装svn版本管理系统(subversion+apache+jsvnadmin) CI服务器:192.168.4.221root用户操作 建议安装前更新操作系统# yum update更新完成后重启# reboot 安装apache# yum install httpd httpd-devel# service httpd start# ch
dobbo监控中心的介绍与在linux上的安装 一、监控中心服务接口调用统计报表的显示配置1、 Dubbo服务提供者和服务消费者中的spring配置文件中增加以下配置:监控中心配置 -->监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->直连监控中心服务器地址,如:address="192.168.3.71:7070"-->dubbo:m
在linux上部署dubbo服务jar包 部署到edu-provider-01(192.168.1.121)一、环境变量配置Connecting to 192.168.1.121:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'.Last login: Fri Mar 25 13:36:38 2016 from
使用maven构建dubbo服务jar包 服务器:192.168.1.121(edu-provider-01)一、Dubbo服务的运行方式:1、使用Servlet容器运行(Tomcat、Jetty等)----不可取 缺点:增加复杂性(端口、管理)tomcat/jetty等占用端口,dubbo服务也需要端口浪费资源(内存):单独启动tomcat,jetty占用内存大2、自建
linux下安装dubbo管理控制台 Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,但 管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节点部署。 IP: 192.168.3.71 部署容器:apache-tomcat-7.0.57 端口:8080 1、 下载最新版的 Tomcat7: $wget http:/
linux安装zookeeper(单节点) 注册中心服务器(192.168.3.71)配置,安装 Zookeeper: 1、 修改操作系统的/etc/hosts 文件中添加: # zookeeper servers 192.168.3.71edu-provider-01 2、 到 http://apache.fayea.com/zookeeper/下载 zookeeper-3.4.6: $ wge
深入分析Java ClassLoader原理 一、什么是ClassLoader?大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则
Java中创建对象的5种方式 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。1、使用new关键字这是最
聊聊高并发系统之HTTP缓存 简介最近遇到很多人来咨询我关于浏览器缓存的一些问题,而这些问题都是类似的,因此总结本文来解答以后遇到类似问题的朋友。因本文主要以浏览器缓存场景介绍,所以非浏览器场景下的一些用法本文不会介绍,而且本文以chrome为测试浏览器。浏览器缓存是指当我们使用浏览器访问一些网站页面或者http服务时,根据服务端返回的缓存设置响应头将响应内容缓存到浏览器,下
如何用 redis 造一把分布式锁 基本概念锁wiki: In computer science, a lock or mutex (from mutual exclusion) is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many thr
线程数究竟设多少合理 一、需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。 二、一些共性认知
互联网架构,如何进行容量设计? 一,需求缘起互联网公司,这样的场景是否似曾相识: 场景一:pm要做一个很大的运营活动,技术老大杀过来,问了两个问题:(1)机器能抗住么?(2)如果扛不住,需要加多少台机器? 场景二:系统设计阶段,技术老大杀过来,又问了两个问题:(1)数据库需要分库么?(2)如果需要分库,需要分几个库? 技术上来说,这些都是系统
聊一聊ThreadLocal 对于ThreadLocal感兴趣是从一个问题开始的:ThreadLocal在何种情况下会发生内存泄露?对于这个问题的思考不得不去了解ThreadLocal本身的实现以及一些细节问题等。接下去依次介绍ThreadLocal的功能,实现细节,使用场景以及一些使用建议。概述ThreadLocal不是用来解决对象共享访问问题的,而主要提供了线程保持对象的方法和避免参数传递的方便的对象访问方式。一般情况下,...
闭环Java应用 你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题:1、程序代码和依赖都是人工上传到服务器,不是通过工具进行部署和发布;2、目录结构没有规范,jar启动时通过-classpath任意指定;3、fat jar,把程序代码、配置文件和依赖jar都打包到一个jar中,改配置文件太费劲;4、不管是非web
Java进阶之路 一: 编程基础不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的。下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法。 1-1 常用数据结构数组、链表、堆、栈、队列、Hash表、二叉树等1-2 算法思想算法时间复杂度和空间复杂度的分析计算算法思想:递推、递归、穷举、贪心、分治、动态规划、
StackOverflow: 你没见过的七个最好的Java答案 StackOverflow(后边简称so)发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。这篇文章是在我们审阅了so上最流行的Java问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。分支预测SO上最多投票的一个Java问题是: 为什么处理一个排序数
Java 异常体系规范 什么时候抛出异常(throw)1、验证-抛出:当程序检测到非预期状态、当前处理层无法处理的,应创建一个新的异常对象,并使用关键字throw,将异常抛给调用者if (somethingIsInvalid) { throw new SomeException("msg");}2、检测-上抛:当调用了一个声明受检异常的方法,当前处理层无法处理,需要进行适当包装
java高并发系统之异步非阻塞 在做电商系统时,流量入口如首页、活动页、商品详情页等系统承载了网站的大部分流量,而这些系统的主要职责包括聚合数据拼装模板、热点统计、缓存、下游功能降级开关、托底数据等等。其中聚合数据需要调用其它多个系统服务获取数据、拼装数据/模板然后返回给前端,聚合数据来源主要有依赖系统/服务、缓存、数据库等;而系统之间的调用可以通过如http接口调用(如HttpClient)、SOA服务调用(如dubbo、th
分布式队列编程:从模型、实战到优化 1模型篇模型篇从基础的需求出发,去思考何时以及如何使用分布式队列编程模型。建模环节非常重要,因为大部分中高级工程师面临的都是具体的需求,接到需求后的第一个步骤就是建模。通过本篇的讲解,希望读者能够建立起从需求到分布式队列编程模型之间的桥梁。何时选择分布式队列通信是人们最基本的需求,同样也是计算机最基本的需求。对于工程师而言,在编程和技术选型的时候,更容易进入大脑的概
评价系统海量数据存储设计 京东的商品评论目前已达到数十亿条,每天提供的服务调用也有数十亿次,而这些数据每年还在成倍增长,而数据存储是其中最重要的部分之一,接下来就介绍下京东评论系统的数据存储是如何设计的。 整体数据存储包括基础数据存储、文本存储、数据索引、数据缓存几个部分。基础数据存储基础数据存储使用mysql,因用户评论为文本信息,通常包含文字、字符等,占用的存储空间比较大,为
jQuery性能优化建议 1. 使用最新版本的jQueryjQuery的版本更新很快,你应该总是使用最新的版本。因为新版本会改进性能,还有很多新功能。下面就来看看,不同版本的jQuery性能差异有多大。这里是三条最常见的jQuery选择语句:$('.elem')$('.elem', context)context.find('.elem')我们用1.4.2、1.4.4、1.6.2三个版本的jQuery测试,看看浏览...
MongoDB在58同城的应用实践 58同城作为中国最大的生活服务平台,涵盖了房产、招聘、二手、二手车、黄页等核心业务。58同城发展之初,大规模使用关系型数据库(SQL Server、MySQL等),随着业务扩展速度增加,数据量和并发量演变的越来越有挑战,此阶段58的数据存储架构也需要相应的调整以更好的满足业务快速发展的需求。MongoDB经过几个版本的迭代,到2.0.0以后,变的越来越稳定,它具备的高性能、高扩展性、Aut
一个由多线程而引发内存溢出故障的案例分析 一日凌晨,手机疯狂报警,短信以摧枯拉朽之势瞬间以百条的速度到达,我在睡梦中被惊醒,看到短信的部分内容如下:看到这个错误,我的第一感觉是创建了大量的线程,并且资源没有被回收,但是报错的却是其中一台应用服务器,表象看不太像是程序的问题,而此时在凌晨并发量也不应该会有这么大啊?同时我们不能因为报错暂停服务使用,而影响商户,所以决定要先解决问题,于是采用必杀技重启这台服务器,观察一小时内存
MySQL大表优化方案 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化:单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量:字段尽量使
分库后的分页处理 在数据量过大以后,通常都会进行分库操作,把一张表拆分到不同数据库中例如 tb1 表被拆分到3个库中,分库1、分库2、分库3现在想执行分页操作SELECT c1 FROM tb1 ORDER BY c1 LIMIT 4, 2如何处理呢?查了一些数据库中间件的资料,有一个通用的思路:到每个分库中取出从0开始、到目标结果集的最后一条记录,汇总到一起,进行排序,然后
性能优化的十个建议 1、不进行升级。很多人抱怨他们的系统不够快,并通过编写更好的算法和数据结构来寻求帮助,Thompson认为实际上“他们所需的仅仅就是进行升级”。升级操作系统、JVM、CLR等等。不进行升级的常见借口就是“在新版本中可能会有bug。”为了避免这种状况,可以进行定期的持续集成和测试,这应该是开发流程的基础组成部分。Thompson以一个实时系统进行了例证,开发人员针对新版本的数据库进行
数据结构的理解 计算机里面最基本的数据结构是数组(比之更基本的是存储单元,但单独的存储单元不能构成结构),我们的软件逻辑就是针对数据结构的一系列操作,所有的更复杂的数据结构都是基于数组演化而来的。数组可以被规约为一组有连续下标(编号)的盒子,编号大于等于零。那么针对数组的基本操作就有检索(Search)、修改(modify)、添加(Append)、插入(Insert)、删除(delete)等。检索和时间复杂度
关于JVM的类型和模式 曾几何时,我也敲打过无数次这样的命令:然而之前的我都只关心过版本号,也就是第一行的内容。今天,我们就来看看第3行输出的内容:JVM的类型和工作模式。其实说Server和Client是JVM的两种工作模式是不准确的,因为它们就是不同的虚拟机,因此应该说有两种类型的JVM。第三行的输出中可以看到:JVM的名字(HotSpo
Netty的高性能架构之道 Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源
电商抢购服务高并发设计 服务介绍限时抢购又称闪购,英文Flash sale,起源于法国网站Vente Privée。闪购模式即是以互联网为媒介的B2C电子零售交易活动,以限时特卖的形式,定期定时推出国际知名品牌的商品,一般以原价1-5折的价格供专属会员限时抢购,每次特卖时间持续5-10天不等,先到先买,限时限量,售完即止。顾客在指定时间内(一般为20分钟)必须付款,否则商品会重新放到待销售商品的行列里。
mysql查询更新时的锁表机制分析(只介绍了MYISAM) 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。一、概述MySQL有三种锁的级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level lo
mysql数据库引擎MyISAM和InnoDB的比较和使用场合 数据库中数据管理的一种方式,MySQL支持插入式的存储引擎,也就是说你同一数据库中的数据表可以选择不同存储引擎查看mysql版本mysql> select version();+-----------+| version() |+-----------+| 5.5.25a |+-----------+1 row in set查看mysql引擎mysq
分布式多活的异地多活设计四大误区 其实大部分问题我们之前也遇到过,这些问题当时也困扰着我们,后来我们经过讨论和思考,发现其实很多时候我们困扰的主要原因是过于“追求完美的异地多活方案”,这样导致“异地多活”设计中出现很多了的思维误区,而如果不意识到这些思维误区,就会陷入死胡同,导致无法实现真正的“异地多活”方案。接下来我将总结常见的思维误区,看看你踩中了哪个坑?1所有业务异地多活“异地多活”是为了保证业务的高可用
一个可供参考的Java高并发异步应用案例 泰康在线微信公众号系泰康在线财产保险股份有限公司旗下平台,希望可以通过持续不断的创新,提升客户对于保险的认知及体验,通过对大数据技术的应用,精准的为客户设计产品以及提供服务。泰康在线微信公众号,现有1000多万粉丝。在日常的运营中,借助于红包奖励、卡券分享、消息通知、微信分享等手段,通过好的内容,好的活动、好的产品以及相应的精准营销来增强用户的粘性和活跃度。在日常运营中,公众号会通过给用户
缓存穿透、并发和失效的解决方案 我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题:缓存穿透缓存并发缓存失效缓存穿透注:上面三个图会有什么问题呢?我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的
String源码解析 前提:先了解下什么是声明,什么时候才算是产生了对象实例其中x并未看到内存分配,变量在使用前必须先声明,再赋值,然后才可以使用。java基础数据类型会用对应的默认值进行初始化 一、首先看看Java虚拟机JVM的内存块及其变量、对象内存空间是怎么存储分配的 1、栈:存放基本数据类型及对象变量的引用,对象本身不存放于栈中而是存放于堆中 1)、基础类型 byte (8位...
消息队列设计 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发的Notify、MetaQ、RocketMQ等。本文不会一一介绍这些消息队列的所有特性,而是探讨一下自主开发设计一个消息队列时,你
设计模式之代理模式 代理模式是一个使用率非常高的模式,其定义是为其他对象提供一种代理以控制对这个对象的访问。代理模式也叫委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上都是在更特殊的场合采用了委托模式。一般对于代理模式而言,有三种类型比较常用,分别是普通代理、强制代理和动态代理。下面以一个游戏练级的例子分别讲解:普通代理:它的要求就是客户端只能访问代理角色,而不能
设计模式之桥梁模式 桥梁模式也叫桥接模式,是指将抽象和实现解耦,使得两者可以独立地变化。桥梁模式的重点是在“解耦”上,来看下下面举的例子,看看重构前和用桥梁模式重构后的区别。假如我有两家公司,一家做房地产,一家做山寨IPOD,两家都在帮我赚钱。重构前: