- 博客(44)
- 资源 (10)
- 收藏
- 关注
转载 Spring Cloud核心组件底层原理
目录一、业务场景介绍二、Spring Cloud核心组件:Eureka三、Spring Cloud核心组件:Feign四、Spring Cloud核心组件:Ribbon五、Spring Cloud核心组件:Hystrix六、Spring Cloud核心组件:Zuul七、总结概述毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这...
2018-12-13 10:44:34
814
原创 深入理解Java NIO
在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New NIO,原因在于它相对于之前的 IO 类库是新增的。此外,旧的 IO 类库提供的 IO 方法是阻塞的,New IO 类库则让 Java 可支持非阻塞 IO,所以,更多的人喜欢称之为非阻塞 IO(Non-blocking IO)。NIO 应用非常广泛,是 Java 进阶...
2018-12-11 14:50:43
1595
转载 AQS框架源码分析
AQS就是AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。AQS是Concurrent包的核心,lock就是在AQS的基础上实现的,阻塞队列,线程池,信号量等都离不开AQS的支持。CL...
2018-12-11 11:53:27
246
原创 Spring 如何使用注解注入集合类list、set、map
首先通过示例来展示,如何在Spring中使用注解注入集合类(list、map、set等)定义接口InjectService,继承InitializingBean接口,便于打印Spring注入的实例对象public interface InjectService extends InitializingBean{ public void inject();}使用InjectS...
2018-12-10 16:34:06
15350
1
原创 SpringMVC 请求处理 - HandlerInterceptor
对SpringMVC有所了解的人肯定接触过HandlerInterceptor拦截器,HandlerInterceptor接口给我们提供了3个方法:(1)preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行(2)postHandle:在执行co...
2018-11-30 10:18:40
475
转载 netty源码分析之揭开reactor线程的面纱(三)
上两篇博文(netty源码分析之揭开reactor线程的面纱(一),netty源码分析之揭开reactor线程的面纱(二))已经描述了netty的reactor线程前两个步骤所处理的工作,在这里,我们用这张图片来回顾一下:reactor线程三部曲简单总结一下reactor线程三部曲轮询出IO事件 处理IO事件 处理任务队列今天,我们要进行的是三部曲中的最后一曲【处理任务队列】...
2018-11-29 10:48:58
160
转载 netty源码分析之揭开reactor线程的面纱(二)
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下reactor线程我们已经了解到netty reactor线程的第一步是轮询出注册在selector上面的IO事件(select),那么接下来就要处理这些IO事件(process selected keys),本篇文章我们...
2018-11-29 10:47:53
110
转载 netty源码分析之揭开reactor线程的面纱(一)
netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如何来优雅地fix掉jdk的nio bug?带着这些疑问,本篇文章将庖丁解牛,带你逐步了解netty reactor线程的真相[源码基于4.1.6.Final]reactor 线程的启动NioE...
2018-11-29 10:46:03
123
原创 JVM(六):GC日志阅读
垃圾回收器的可用组合:Young Tenured JVM options Serial Serial -XX:+UseSerialGC Parallel Scavenge Serial -XX:+UseParallelGC -XX:+UseSeriesOldGC Parallel New Serial N/A Serial ...
2018-11-28 18:20:33
178
原创 JVM(五):GC垃圾收集器分类
1、Serial收集器(新生代)单线程,在进行垃圾收集时必须暂停其他所有的工作线程(“Stop the World“)。虚拟机运行在Client模式下的默认新生代收集器。简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。2、ParNew收集器(新生代)ParNew收集器其实是...
2018-11-28 18:16:09
256
原创 JVM(四):GC算法
1、对象与引用为了解决“哪些内存需要回收”的问题,需要确定哪些对象是“有用不可回收”的,而哪些对象是“无用可回收”的。通常存在以下两种判断算法。引用计数法算法原理:给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1;每当一个引用失效时,计数器值就减1;当引用计数为0时,表示该对象不再使用,可以回收。应用:微软COM/ActionScript3/Python优势:...
2018-11-28 18:12:22
342
原创 JVM(三):内存模型JMM
JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。主内存与工作内存主内存:所有的实例字段、静态字段和构成数组对象的元素都存储在主内存,但不包括局部变量与方法参数。工作内存:每个线程都有自己的工作内存,工作线程中保存了该线程用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中...
2018-11-28 18:07:54
198
原创 JVM(二):JVM类加载机制
如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 加载加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(...
2018-11-28 18:04:05
126
原创 JVM(一):JVM的运行时数据区
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JV...
2018-11-28 17:59:37
168
转载 防雪崩利器:熔断器 Hystrix 的原理与使用
前言分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择.服务雪崩效应的定义服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示:上图中, A为服务提供者, B为A的服务调用者
2017-03-30 10:05:44
972
转载 分布式服务弹性框架“Hystrix”实践与源码研究(一)
文章初衷为了应对将来在线(特别是无线端)业务量的成倍增长,后端服务的分布式化程度需要不断提高,对于服务的延迟和容错管理将面临更大挑战,公司框架和开源团队选择内部推广Netflix的Hystrix,一是为了推进各部门的服务使用覆盖率,二是为了增加C Sharp语言版本的参与度(目前公司至少三成服务由.NET编写)。该博文属于个人对Hystrix研究和实践经验。什么是Hystrix?
2017-03-30 10:02:18
1963
转载 微服务实践(七):从单体式架构迁移到微服务架构
这是用微服务开发应用系列博客的第七篇也是最后一篇。第一篇中介绍了微服务架构模式,并且讨论了微服架构的优缺点;接续文章讨论了微服务架构不同方面:使用API网关,进程间通信,服务发现,事件驱动数据管理以及部署微服务。本篇,我们将探讨将应用从单体式架构迁移到微服务架构需要考虑的策略。希望读者通过本系列文章对微服务优缺点有一个比较好的理解,以及何时使用这种架构。也许微服务架构比较适合你的应用。也许
2017-01-22 18:22:07
359
转载 微服务实战(六):选择微服务部署策略
【这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点。随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理。这篇文章,我们将讨论部署为服务的策略。微服务实战(一):微服务架构的优势与不足微服务实战(二):使用API Gateway微服务实战(三):深入微服务架构的进程间通信微服务实战(四)
2017-01-22 18:20:22
410
转载 微服务实践(五):微服务的事件驱动数据管理
【编者的话】本文是使用微服务创建应用系列的第五篇文章。第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点;第二和第三篇描述了微服务架构模块间通讯的不同方面;第四篇研究了服务发现中的问题。本篇中,我们从另外一个角度研究一下微服务架构带来的分布式数据管理问题。1.1 微服务和分布式数据管理问题单体式应用一般都会有一个关系型数据库,由此带来的好处是应用可以使用 ACID trans
2017-01-22 18:19:12
387
转载 微服务实战(四):服务发现的可行方案以及实践案例
(转载自dockone.io 原作者杨峰)这是关于使用微服务架构创建应用系列的第四篇文章。第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点。第二和第三篇描述了微服务架构内部的通讯机制。这篇文章中,我们将会探讨服务发现相关问题。 为什么要使用服务发现? 设想一下,我们正在写代码使用了提供RESTAPI或者ThriftAPI的服务,为了完成一次服务请求,代码需要知
2017-01-22 18:17:55
286
转载 微服务实战(三):深入微服务架构的进程间通信
【编者的话】这是采用微服务架构创建自己应用系列第三篇文章。第一篇介绍了微服务架构模式,和单体式模式进行了比较,并且讨论了使用微服务架构的优缺点。第二篇描述了采用微服务架构应用客户端之间如何采用API Gateway方式进行通信。在这篇文章中,我们将讨论系统服务之间如何通信。简介在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。但是一个基于微服务的分布式
2017-01-22 18:17:00
399
转载 微服务实战(二):使用API Gateway
【编者的话】本系列的第一篇介绍了微服务架构模式。它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选择。当你决定将应用作为一组微服务时,需要决定应用客户端如何与微服务交互。在单体式程序中,通常只有一组冗余的或者负载均衡的服务提供点。在微服务架构中,每一个微服务暴露一组细粒度的服务提供点。在本篇文章中,我们来看它如何影响客户端到服务端通信,同时提出一种API
2017-01-22 18:13:55
464
1
转载 微服务实战(一):微服务架构的优势与不足
摘要:本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战。正如作者所说,微服务架构更适合用于构建复杂的应用,尽管它也有自己的不足。 英文原文:Introduction to Microservices 这篇文章作者是Chris Richardson,他是早期基于Java的Amazonite EC2 Pa
2017-01-22 18:12:18
1056
原创 SpringMVC 注解式拦截器实现
编辑此区域Huluwa-Notify系统在接收合作方的通知内容时,需要进行访问控制,即需要对访问的IP进行限制,防止恶意用户篡改消息通知我们。为了实现方法的通用性,并降低对系统的侵入性,我选择使用SpringMVC的注解式拦截器实现对访问IP进行控制,只允许系统配置的IP访问我们的Notify系统,而其他IP返回的消息不予处理,并报警提示。编辑此区域一.首先介绍一
2017-01-12 19:37:23
16185
7
转载 Java正则表达式规则
1 [正则表达式]文本框输入内容控制 2 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 3 只能输入数字:"^[0-9]*$"。 4 只能输入n位的数字:"^\d{n}$"。 5 只能输入至少n位的数字:"^\d{n,}$"。 6 只能输入m~n位的数字:。"^\d{m,n}$" 7 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
2016-12-10 20:36:17
406
转载 Redis配置文件redis.conf 详解
1.基本配置内存单位的表示# 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1024*1024*1024 bytes单位中不区分大小写1GB 1Gb 1gB是一样的
2016-11-30 19:48:55
1548
转载 面向接口编程详解(三)——模式研究
通过前面两篇,我想各位朋友对“面向接口编程”的思想有了一定认识,并通过第二篇的例子,获得了一定的直观印象。但是,第二篇中的例子旨在展示面向接口编程的实现方法,比较简单,不能体现出面向接口编程的优势和这种思想的内涵。那么,这一篇作为本系列的终结篇,将通过分析几个比较有深度的模式或架构,解析隐藏其背后的面向接口思想。这篇我将要分析的分别是MVC模式和.NET平台的分层架构。这篇的内容可能会比较
2016-11-29 14:53:36
386
转载 面向接口编程详解(二)——编程实例
通过上一篇文章的讨论,我想各位朋友对“面向接口编程”有了一个大致的了解。那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象。为充分考虑到初学者,所以这个例子非常简单,望各位高手见谅。问题的提出 定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。上下文(环境):已知要实现U盘、MP3播放器、移动
2016-11-29 14:51:24
640
转载 Linux 中的零拷贝技术 第1部分
引言传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销
2016-11-26 14:54:38
291
转载 Kafka入门经典
问题导读:1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic、发送消息、消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件?6.producer是否直接将数据发送到broker的leader(主节点)?7.Kafa consumer是否可以消费指定分区消息?8.Kafka消息是采
2016-11-26 14:44:57
1358
原创 Java编程思想之低耦合
1. 低耦合(Low Coupling)“低耦合”这个词相信大家已经耳熟能详,我们在看spring的书籍、MVC的数据、设计模 式的书籍,无处不提到“低耦合、高内聚”,它已经成为软件设计质量的标准之一。那么什么是低耦合?耦合就是对某元素与其它元素之间的连接、感知和依赖的量 度。这里所说的元素,即可以是功能、对象(类),也可以指系统、子系统、模块。假如一个元素A去连接元素B,或者通过自
2016-11-25 20:34:42
1076
转载 Java面试必会的40个问题
1.Java集合框架是什么?说出一些集合框架的优点?每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
2016-11-25 20:32:21
750
转载 《sed & awk》读书笔记之awk篇
Awk是什么Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用。sed是一种非交互式且面向字符流的编辑器(a "non-interactive" stream-oriented editor),而awk则是一门模式匹配的编程语言,因为它的主要功
2016-11-25 20:29:38
527
转载 《sed & awk》读书笔记之sed篇
Sed是什么Sed本质上是一个编辑器,但是它是非交互式的,这点与VIM不同;同时它又是面向字符流的,输入的字符流经过Sed的处理后输出。这两个特性使得Sed成为命令行下面非常有用的一个处理工具。基本概念sed命令的语法如下所示:sed [options] script filename同大多数Linux命令一样,sed也是从s
2016-11-25 20:25:44
1194
转载 HashMap的扩容机制---resize()
虽然在hashmap的原理里面有这段,但是这个单独拿出来讲rehash或者resize()也是极好的。什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值---即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩
2016-11-24 10:20:17
70554
12
原创 Java volatile关键字
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchroniz
2016-11-23 19:40:43
381
转载 面向接口编程详解(一)——思想基础
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到“面向接口编程”这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问。1.面向接口编程和面向对象编程是什么关系首先,面向接口编程和面向对象编
2016-11-23 19:38:25
325
转载 HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable
2016-11-23 16:45:22
287
原创 利用Spring扫包实现发现具体的注解类
编辑此区域需求描述:在RocketMQ客户端开发过程中,发现对于消费端的消费程序客户端在开发过程中是无法提前预知的,即消费端的消费程序需要具体到业务中去实现。因此,发现具体的消费方法是RocketMQ客户端设计过程中一个不得不考虑的问题。为了降低客户端对上层业务系统的侵入性,计划采用业务消费类添加特定“注解”+客户端“扫包”的方式来发现业务消费程序。由于Spring的扫包方法是
2016-11-23 15:54:53
5599
原创 Spring @Transactional的使用及原理
本文主要讨论Spring声明式事务中使用注解@Transactional的情况,包括以下主要内容:Spring @Transactional的配置;Spring @Transactional的传播行为和隔离级别;Spring @Transactional的工作原理;Spring @Transactional的注意事项;Spring @Transactional自我调用中的问题。
2016-11-23 15:49:50
31493
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人