自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 设计模式系列-建造者模式

什么是建造者模式:建造者模式,也叫做Builder模式。我们平时创建对象的时候,会用到类似MyTest.newBuilder().field1(“field1”).build();这种方式创建对象,这就是建造者模式。那什么场景下会需要建造者模式呢,用这种模式有什么好处呢?使用场景:举个例子,现在我们有个配置类Config,里面有name字段,标识配置名称,此外,还有创建时间,更新时间。以及各种配置项。public class Config { /** * 配置名称 *

2021-11-27 17:06:49 389

原创 非常方便的日期转换方式

最近开发过程中,需计算以当前时间为基准的时间戳,比如今天0点的时间戳,今天24点的时间戳。所以总结了一下比较简洁的写法,代码如下:package date;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.ZoneId;import java.time.format.DateTimeFormatter;public class DateUtils { /** * 给定一个

2021-10-10 10:03:19 374

原创 select、poll和epoll

介绍:在说select、poll和epoll之前,先说下IO多路复用机制,简单来说,就是服务端通过一个线程(或者进程)来维护多个Socket连接,多个连接共用一个阻塞对象,线程只需要在这个阻塞对象上等待,无需再轮询多个连接。当任何一个连接上有数据可以处理时,操作系统就会通知进程,进程就阻塞的状态返回,开始进行业务处理。select、poll和epoll都是IO多路复用机制的常见方式,通过这种方式,可以监控多个文件描述符,一旦某个描述符就绪,操作系统就能够通知进程进行相应的读写操作。select、pol

2021-09-29 18:55:13 200

原创 Reactor模式

背景:传统的服务端体系结构,每当有请求时,都会创建一个线程(进程)来处理请求,请求处理完之后就销毁线程,这样的成本是比较高的,频繁的创建和销毁线程,也会造成资源的浪费。所以可以考虑采用线程池的方式,免去创建和销毁线程的成本,提高服务端的效率。但是引入线程池后,还有另外一个问题,一般情况下,由于高并发场景,而且IO比较耗时,所以请求的数量是超过线程池中线程的数量的,一个线程会处理多个连接。如果处理一个连接的过程中,只能阻塞处理的话,那性能还是很差,所以要设计成非阻塞的。非阻塞也有不同的方式,比如采用轮询,但

2021-09-26 10:02:36 244

原创 五种IO通信模型

相关概念:在说五种IO通信模型之前,先说下几个容易混淆的概念,同步和异步,阻塞和非阻塞。同步和异步:主要是看调用方获取结果是主动发起的,还是被动通知的。主动发起的就是同步,被动通知的就是异步。阻塞和非阻塞:调用方调用某个方法后,在获取到返回结果之前。如果当前的线程处于挂起状态,什么都不能干,则是阻塞。如果当前线程是运行状态,可以处理其他任务,则是非阻塞。举个例子,线程A调用了接口B后,一直等待接口的返回结果,则属于同步阻塞,如果线程A可以处理其它任务,但是需要不断轮询查看接口的返回结果,则属于同

2021-09-25 15:28:02 1085

原创 TCP三次握手和四次挥手

TCP是全双工通信,能够双向同时发送字节流。TCP是面向连接的,所以在数据传输之前需要先建立连接,数据传输之后断开连接。建立连接也叫做三次握手,断开连接也叫做四次挥手。三次握手:第一步:A向B发起连接请求,SYN=1,seq=x,这时,A这个客户端进程进入SYN-SENT状态。表示同步已发送。第二步:B收到连接请求,需要向A发送确认。SYN和ACK都是1,确认号ack=x+1,代表对A发送的seq=x的确认。并且自己也会初始化一个序号seq=y。这时,服务端B进入SYN-RCVD状态,表示同步收

2021-09-15 10:03:33 118

原创 网络分层基础知识

不同的网络体系结构OSI七层的体系结构最完善,但是既复杂又不实用,TCP/IP体系结构应用的最广泛。但是学习网络的时候,为了学习方便,一般综合OSI和TCP/IP的优点,抽象为5层。物理层:传输单位是比特,也就是0和1的电信号。传输0和1时利用的物理媒体就是光缆,双绞线,同轴电缆等。但是光缆这些物理媒体不属于物理层,而是在物理层协议下面。数据链路层:传输单位是帧,也就是规定了多少个0和1是一组。目前占据主导地位的是以太网协议,以太网规定,每个帧分成2部分,首部和数据。首部固定18字节,数据最短4

2021-09-15 09:59:41 286

原创 设计模式系列-单例模式

什么是单例模式?单例模式,就是指一个类只允许创建一个实例对象,这个类就是单例类。单例模式一般用来表示一些全局唯一的类,比如配置信息,连接池类等,通过单例模式来解决资源访问冲突的问题,避免采用加锁来导致的性能开销。单例模式的创建方式:1.饿汉模式public class Singleton { private Singleton() { } private static final Singleton INSTANCE = new Singleton();

2021-04-05 23:11:15 140 1

原创 设计模式系列-设计原则总结

经典的设计原则:SOLID、KISS、YAGNI、DRY、LOD。下面就分别总结一下这几个原则。SOLID:SOLID是由 5 个设计原则组成的,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,依次对应 SOLID 中的 S、O、L、I、D 这 5 个英文字母。单一职责原则(SRP):Single Responsibility Principle一个类或者模块只负责完成一个职责(或者功能)这个原则,讲究不要设计大而全的类,要设计粒度小,功能单一的类,达到高内聚,低耦

2021-03-20 19:34:22 161

原创 kafka系列-日志存储

kafka中的消息,是以主题进行归类的,每个主题分为一个或多个分区,主题和分区是逻辑上的概念。消息在发送时,会按照规则追加到其中一个分区中。分区里的每一条消息,都会被分配一个唯一的序列号,也就是偏移量(offset)分区是逻辑上的概念,往分区追加消息时,其实是写到日志(Log)中,为了防止日志过大,kafka还有日志分段(LogSegment)的概念,Log在物理上是以文件夹的形式存储,每个LogSegment对应于磁盘上的一个日志文件和两个索引文件,以及其他文件。kafka追加消息是顺序写,由于L

2021-02-15 11:36:29 305

原创 kafka系列-副本机制的可靠性分析

简介kafka提供了多副本机制,实现了容灾能力,提升可用性和可靠性。副本分为两类,一类是leader副本,另一类是follower副本,每个分区创建时都需要选举一个leader副本,没有选上leader副本的都是follower副本。follower副本不对外提供服务,它唯一的任务就是异步的从leader副本拉取消息,写入自己的日志,保持和leader副本的同步。当leader故障时,可以从符合条件的follower副本中重新选举leader副本。既然follower副本是异步拉取消息进行同步的,那

2021-02-15 11:32:16 269

原创 kafka系列-主题和分区

使用kafka的同学,一定会经常接触到主体和分区这两个概念,这是kafka中最核心的两个概念了。主题作为一个逻辑容器,对消息进行归类,主题下又可以分成若干个分区。所以kafka的消息可以看成是三级的结构:主题-分区-消息。每个分区下可以存在若干个副本,副本用来进行数据备份,提升容灾能力。分区可以看成是一个只能追加写的日志文件。(当然,分区是逻辑上的概念,日志文件才是物理存在的)分区的作用,是提供负载均衡的能力,类似于es的分片。不同的分区会被分配到不同的Broker节点上,这样就可以提升系统的吞吐量

2021-02-15 10:07:02 1335 1

原创 kafka系列-基本概念

kafka是一个多分区、多副本,基于Zookeeper协调的分布式消息系统。两种消息模型在说kafka之前,先说下常见的两种消息模型,一种是点对点模型,一种是发布订阅模型。点对点(P2P):Point-to-Point,指的是消息被消费后,队列中就不会在存储这一条消息。所以同一条消息只能被一个消费者消费。队列可以支持多个消费者,但是消费者也同样不可能消费已经被消费过的消息。发布订阅:有主题的概念,消息发布者将消息发布到某个主题,消息订阅者从主题中订阅消息。通过主题,消息发布者和订阅者保持相对独立。多

2021-02-15 09:58:08 196

原创 JVM系列-垃圾回收

Java不需要我们手动的申请和释放空间,而是由JVM自动的来进行分配和回收。既然是自动的,那跟手动释放和回收相比,在精准性和效率上可能就会稍微差一些,所以Java虚拟机团队也不断地研发更优秀的垃圾收集器,也有了一代又一代的垃圾收集器。既然要学习垃圾回收,那就会有如下的一些问题:回收哪些空间,怎么判断这个对象能不能回收,什么时候进行回收,怎么才能高效的回收。回收哪些空间?之前我们学习过JVM的...

2020-03-10 09:00:56 253

原创 JVM系列-内存划分

Java程序不需要手动的申请和释放内存,所有的这些操作都是JVM来完成的。这样会在一定程度上简化我们的开发工作,而且很少出现内存泄露和内存溢出的问题。但是,我们也需要了解JVM内部是如何分配和释放内存的,知道了原理,才能写出更优的代码,才能在出现问题时快速的定位和排查。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这就是我们常说的内存划分。注意这里和Jav...

2020-03-08 16:15:19 260

原创 JVM系列-字节码执行

这篇文章对应于java虚拟机的第8章,在学习虚拟机的时候,读完类加载和字节码执行这几章节,感觉自己没有理解透彻,整体流程也没有梳理清楚。最后又读了一遍,才把思路梳理清楚。看书还是要站在一定的高度去看,一开始看的时候,只是学到了一个个的知识点,单独看一个知识点倒是知道什么意思,但是看完之后,依然不清楚整体的流程。这篇文章需要分成三部分来说,第一部分是背景知识,第二部分是方法调用,第三部分是方法执行...

2019-09-21 14:24:29 390

原创 JVM系列-类加载机制

之前在看《深入理解Java虚拟机》这本书的时候,感觉看过之后就忘,而且看完整本书之后,总是感觉没有融会贯通,单独聊一个知识点还行,如果想站在一个全局的角度就说这些内容,就说不出来了。所以后来又读了一些JVM的专栏,看了一些其他的书,才慢慢的梳理出一些思路。《深入理解Java虚拟机》讲的很好了,而且网上也有无数的JVM的帖子,所以在这篇文章中,就不再详细说那些内容了。在说类加载之前,先说下整体的...

2019-09-21 14:11:12 235

原创 什么是顶级域名,二级域名和三级域名

最近用到了顶级域名,二级域名和三级域名的知识,但是在自己的知识体系中出现了困扰,对于baidu.com属于几级域名,出现了不确定的答案。网上搜索的很多帖子,大部分帖子给的答案是这样的:baidu.com是顶级, pan.baidu.com是二级。但是经过我查询了计算机网络的教材,发现网上查到的大部分文章给的这个结论都是错误的,所以专门开一篇帖子记录下。我查询了《计算机网络(第7版)-谢希仁》的教...

2019-07-09 11:32:42 12334 4

原创 Spring系列-Spring boot启动原理

我们上一篇文章新建了一个Spring boot的项目:spring-boot-test,稍微做了一些配置就运行起来了。和以前运行普通的项目相比,Spring boot最大的特点就是没有那一堆的配置文件,而且不用配置Tomcat,直接就可以运行了。那Spring boot做了什么,可以让我们的开发变得这么方便呢?还是要回到我们的项目中,我们的pom中引入了spring-boot-starter-w...

2019-06-06 13:33:05 5951 1

原创 Spring系列-Spring boot介绍

随着动态语言的流行,java的开发显得比较笨重:繁多的配置,低下的开发效率,复杂的部署流程。所以,就有了Spring boot,使用“习惯优于配置”的理念,让项目快速的运行起来。Spring boot可以以jar包的形式独立运行,并且内嵌Servlet容器(可以选择内嵌Tomcat、Jetty或者Undertow)Spring boot提供了一系列的starter pom来简化maven的依...

2019-06-06 13:29:49 270

原创 Spring系列-Spring远端调用原理分析

背景:在分布式计算中,经常涉及到多服务器之间不同进程的通信与计算交互,所以就需要用到远端调用。比如可以基于Http进行调用,或者WebService技术,或者RMI。通过这种技术,就可以进行服务能力的扩展,实现分布式计算。Spring为远端调用的实现提供了许多不同的方案,比如Http调用器、第三方远端调用库Hessian/Burlap、RMI、基于Java RMI的解决方案等。这几种方案的套路...

2019-06-06 13:20:48 430

原创 Spring系列-Spring事务处理原理分析

介绍:Spring既支持编程式事务处理方式,又支持声明式事务处理方式。编程式处理方式,是我们自己通过TransactionManager的commit和rollback来实现。声明式处理方式是我们比较常用的一种,可以在xml中配置,或者通过@Transactional注解方式来使用。事务实现原理:事务处理模块本质是通过AOP来实现的。在配置xml的时候,我们会配置TransactionPr...

2019-06-02 12:54:43 457

原创 Spring系列-Spring MVC处理请求流程

上一篇文章学习了Spring MVC的加载原理,那接下来,还有其它的一些知识点需要学习。当Spring MVC初始化完之后,是如何进行工作的呢?当Http请求到了我们Web服务后,是怎么样找到对应的Controller进行处理呢,又是怎么样返回给用户页面的呢?今天这篇文章就来学习一下这个流程。之前分析到,HandlerMapping会持有一系列URL到Controller的映射,Spring M...

2019-05-26 16:39:25 247

原创 Spring系列-Spring MVC初始化流程

什么是Spring MVC?Spring MVC是java的web框架,不过在说Spring MVC之前,先说下MVC和三层架构吧,我们在web开发中,经常用到MVC模式,这个MVC指的是:Model(数据模型) + View(视图) + Controller(控制器),MVC模式在UI设计中使用非常普遍,主要特点是分离了模型,视图,控制器三种角色,将业务处理从UI设计中独立出来,使得相互之间...

2019-05-25 19:49:15 358

原创 Spring系列-Spring AOP原理分析

先了解一些AOP的概念:1.Advice(通知)定义在连接点做什么,为切面增强提供织入接口。比如BeforeAdvice,AfterAdvice等。可以定义在方法执行前或执行后需要做的操作。2.Pointcut(切点)定义Advice通知应该作用于哪个连接点。比如这个JdkRegexpMethodPointcut,就是通过正则表达式是否匹配来判断是否作用于这个Adivce的。3.A...

2019-04-30 13:39:08 342

原创 Spring系列-Spring IoC容器依赖注入

前面文章中有说到,Spring IoC容器的初始化和依赖注入是两个独立的过程,依赖注入的触发有两个场景:1.调用getBean方法,第一次获取Bean的时候。2.在Bean定义中,配置了lazy-init属性来进行预实例化,这个Bean的依赖注入会在IoC容器初始化的时候完成。既然依赖注入是从getBean方法开始的,那我们就还是从BeanFactory的getBean方法开始分析吧,因为B...

2019-04-12 23:14:41 264

原创 Spring系列-Spring IoC容器初始化

前面提到,Spring IoC容器的初始化过程分为三个阶段:1.Resource定位2.BeanDefinition载入3.在IoC容器中注册BeanDefinition这篇文章就以FileSystemXmlApplicationContext为例,分析一下第一个阶段,Resource的定位。下面图片显示了FileSystemXmlApplicationContext的继承关系:...

2019-04-12 07:22:10 311

原创 Spring系列-Spring IoC容器概述

Spring IoC是Spring Framework的核心。控制反转:早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”,后来得出的结论是:依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。控制反转的实现有多种方式,可以在对象生成或初始化的时候,直接将数据注入到对象中。也可以把对象的引用注入进去。...

2019-04-10 09:35:05 1026

原创 maven系列-(六)使用Nexus搭建私服

前面的文章,在说到maven仓库的时候,提到过maven私服的概念,maven私服属于maven远程仓库的一种,是在局域网内搭建的一个私有的仓库服务器。一般情况下,如果是在一个组织内使用maven的话,都会有自己搭建的maven私服。使用maven私服可以降低中央仓库的负荷,节省外网带宽,加速maven构建,自己部署构件等,从而高效的使用maven。而搭建私服用到的工具,一般就是Nexus了。

2018-10-18 11:40:54 627

原创 maven系列-(五)maven聚合和继承

我们之前创建的这个maven-test项目,只包含一个模块。但是在实际开发中,由于业务庞大,经常会把一个大项目分为多个模块。或者是把controller、service、dao等业务层都作为一个模块。最上层是一个总的模块,里面包含很多子模块,同时,最上层的模块还作为一个父模块,和子模块形成依赖关系。整个大项目形成一个父子工程的结构。先回顾下我们maven-test的结构:...

2018-10-15 10:08:40 346

原创 maven系列-(四)maven生命周期和插件

前面讲了maven的依赖和仓库,这是经常接触到的一些操作。但是我们平时还会接触到maven生命周期的一些操作,比如打包、编译等,maven就可以把我们的项目进行打包、编译。其实这个过程,还是涉及到很多知识点的,只不过我们在操作过程中察觉不到而已。我们在项目开发中都会涉及到清理、编译、测试、部署等流程,所以maven就对我们这个过程进行抽象和统一,定义了一套统一的生命周期。maven的生命周期...

2018-10-09 07:54:25 377

原创 maven系列-(三)maven仓库

我们在使用maven的时候,一定接触到过仓库的概念,我们的jar包全都放在仓库里,使用的时候,直接就可以从仓库里找到了。什么是maven仓库:maven组织存放构件的地方,分为远程仓库和本地仓库。使用maven仓库的好处:在使用maven以前,都是手动的在项目引入jar包,一般会在项目目录下新建一个lib文件夹,把jar包复制进去,然后还需要add jar,把jar包添加到Librarie...

2018-10-02 11:58:07 719

原创 maven系列-(二)maven依赖

我们在用maven的时候,最常接触到的功能就是项目依赖了,我们在pom文件里,指定依赖的各种jar包,maven就可以自动的找到jar包,下载到本地。我们的项目就可以正常运行了。在引入包的时候,一般都是这样引入的:<dependencies> <dependency> <groupId>org.springframework</

2018-09-30 09:40:32 430

原创 maven系列-(一)maven入门

我们平时在开发中,经常会用到maven,有时候接触到的引入jar包的功能,有时候接触到的是编译,打包的功能。那maven到底是干啥的呢?什么是maven?maven是一个项目管理工具,可以实现项目的构建、依赖管理、项目信息管理等功能。在项目构建方面,maven可以自动化构建过程,清理、编译、测试、生成报告、打包、部署。在依赖管理方面,maven引入了坐标的概念,自动化解析任何一个java构...

2018-09-26 09:35:58 460

原创 Spring Cloud Zuul源码分析

如何使用Spring Cloud Zuul?之前的文章中,我们学习了Spring Cloud Zuul如何使用,这里再回顾下: 1.引入依赖,在启动类中添加@EnableZuulProxy,声明这是一个Zuul代理。 2.注册到Eureka Server,启动服务,访问这个端口,url中带上要请求的服务名。Spring Cloud Zuul源码分析既然是添加了@EnableZu...

2018-09-14 09:24:53 1856

原创 Spring Cloud各模块文章汇总

最近学习了Spring Cloud的一些技术,在学习过程中对用法和源码进行了一些总结,下面汇总在这里:Spring Cloud介绍Spring Cloud Eureka介绍Spring Cloud Ribbon介绍Spring Cloud Feign介绍Spring Cloud Hystrix介绍Spring Cloud Zuul介绍Spring Cloud Confi...

2018-09-11 08:51:13 1131

原创 Spring Cloud Hystrix源码分析

如何使用Spring Cloud Hystrix进行服务容错保护之前在Spring Cloud Hystrix介绍这篇文章中,介绍过Spring Cloud Hystrix的使用,这里再回顾下: 1.启动类添加@EnableHystrix注解。 2.方法上添加@HystrixCommand注解,并指定fallback的方法。Spring Cloud Hystrix源码分析既然加...

2018-09-09 20:08:12 2462

原创 Spring Cloud Feign源码分析

如何使用Spring Cloud Feign进行声明式调用前面文章写过Spring Cloud Feign的介绍,对如何使用Spring Cloud Feign进行了说明,现在再简单回顾一下: 1.在启动类上添加@EnableFeignClients注解,开启FeignClient 2.创建一个FeignClient接口,接口上添加@FeignClient注解,并指明远程调用其他服务的服务...

2018-09-09 14:50:47 1288

原创 Spring Cloud Ribbon源码分析

如何使用Spring Cloud Ribbon进行负载均衡调用?前面写的Eureka Client,服务消费者调用服务消费者的时候,是通过负载均衡方式调用的。这里再回顾下当时的用法: 1.在启动类中,声明一个RestTemplate的bean,用@LoadBalanced注解修饰:@Bean@LoadBalancedpublic RestTemplate restTemplate()...

2018-09-07 08:51:24 5749 1

原创 Spring Cloud Eureka源码分析

前面的文章中,已经简单介绍了Spring Cloud Eureka的用法,下面再说明下详细的功能和源码。 Spring Cloud Eureka分为Server端和Client端,Server端作为应用的注册中心,Client端会向Server端注册自己的服务。 Eureka Server和Eureka Client都是采用Java编写的,所以,Eureka主要适用于通过Java实现的分布式系...

2018-08-28 09:44:33 15033 6

空空如也

空空如也

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

TA关注的人

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