自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Dubbo-注册中心

前言本文对 Dubbo 注册中心的工作流程等进行介绍,主要关注下面3个问题。注册中心的工作流程;Zookeeper;Dubbo 注册中心的缓存机制;注册中心的工作流程注册中心对于 Dubbo 而言,是对服务提供者和服务消费者的整体把控,最后的服务调用是直接发生在消费者和提供者之间的,但是如何找到提供者,如果能动性更强的选择服务,都是需要注册中心实现的。总的而言,注册中心具备以下几个...

2020-01-20 16:47:09 553

原创 Dubbo-集群容错

前言在实际的生产中,为了应用的高可用,势必会采用集群的方式去建设服务的消费者和提供者。集群容错就是在这样多提供者的情况下,如何调用(负载均衡)、失败处理(容错机制),针对这些问题的一个方面的处理课题。下面的这张图就是 Dubbo 集群容错相关的组件和组件之间的执行顺序。集群容错在 Dubbo 10层架构中就是 Cluster 层,其设计目的就是解决 Dubbo 在多提供者等集群环境中的调用问...

2020-01-20 16:39:26 240

原创 Dubbo-分层架构

前言Dubbo 整体架构分为10层,从宏观上把握这10层架构,并了解各层的功能和扩展点,可以帮助我们更好的了解 Dubbo。代理层—ProxyProxy 层的功能就是使用动态代理的方式为接口创建代理类,Proxy 层最主要的接口就是 ProxyFactory。其默认的扩展点有:stub、jdk、javassist。jdk 使用反射的方式创建代理类,javassist 通过拼接字符串然后编译...

2020-01-20 16:35:17 1861

原创 Dubbo-服务调用

前言接着上一篇博客—Dubbo服务引用的内容,我们分析一次服务调用的过程。我们从消费者和提供者两个部分的视角来看下一次调用的过程原理。服务消费者在服务引用之后,我们把 spring.xml 中的配置通过具体的协议转换成了 invoker 对象,并且通过 JavassistProxyFactory 生成了代理类,还会启动 Netty 客户端去连接了服务提供者(默认是在服务真实调用的时候才会...

2020-01-20 16:32:42 680

原创 Dubbo-服务引用

前言使用 Dubbo,只需要服务消费者引用服务提供者的接口jar包(泛化调用可以不用服务提供者的接口jar包),就可以像调用本地方法一样,调用远程的服务,但在消费者这边,并没有服务实现的代码,那是怎么实现调用的呢?本文就分析一下服务引用的原理。服务引用流程解析配置文件根据配置文件 <dubbo:reference init=“true”> init的配置走不同的服务引用时机,...

2020-01-20 16:26:26 345

原创 Dubbo-服务暴露

前言在开发中,我们定义了接口、实现类,然后在配置文件(XML)中用 <dubbo:service >标签就可以把这个接口暴露出去,本文就介绍一下 Dubbo 的服务暴露过程。服务暴露流程先看下官方文档中给出的实体转化图,一个服务暴露必须经过的是从提供服务的实际类 ref -> Invoker -> exporter。大致流程如下:解析配置文件,发起服务暴露解析配...

2020-01-20 16:24:07 503

原创 Dubbo-SPI

前言Dubbo 支持多种传输协议,可以有多种注册中心等等高扩展的功能,其原因就是 Dubbo SPI 提供的良好的扩展性,可以给开发者自己实现多样丰富的功能。Dubbo SPI在Java SPI的基础上发展而来,和Java SPI 一样,都是典型的策略模式实现,本文就主要介绍 Dubbo SPI 的使用方式和源码分析。结合代码能够更深了解本文的内容,代码github地址:https://gi...

2020-01-20 16:20:10 226

原创 Dubbo-总结篇

思维导图前面几篇博客已经介绍了 Dubbo 的大多数内容,包括:注册中心;SPI;服务暴露;服务引用;服务调用;集群容错;分层架构;Dubbo 核心就是一个 RPC 通讯的框架,所以用了很多内容去分析 RPC 的通讯使用过程。本节主要就是对 Dubbo 的这些主要内容汇总一下,可以参考下面的思维导图。面试题本节会记录在面试过程中遇到的 Dubbo 相关的问题,会在后续持...

2020-01-20 16:11:28 123

原创 jdk源码解读-类加载器

我们知道虚拟机的类加载机制的第一步就是加载(可以看我之前的博客),加载步骤需要完成3个功能:通过类的全限定名获取这个类的二进制字节流;将字节流代表的静态存储结构(static)转化为方法区的数据;在方法区中生成一个class对象作为程序访问的入口。java的类加载器的作用是将class字节码文件,加载进内存。本文就分析一下类加载的大致过程,和java内置的类加载器。主要分为2块:对...

2019-09-01 11:43:34 370

原创 基于docker部署canal+es集群

0.整体架构1. 安装docker就需要几行命令,参考菜鸟教程2. 创建本次demo需要的网络环境docker network create --subnet=172.18.0.0/16 canal-demo3. mysql镜像和配置pull镜像并且运行docker run -d --name mysql --net canal-demo --ip 172.18.0.2 -p 3...

2019-08-11 19:28:50 2066

原创 elasticsearch02-通用API规范

通用API规范在介绍下面的curd等api之前,先介绍一些通用的API规范。多index 搜索通用参数大多数API都支持跨index去进行查询等操作,例如使用:GET /test1,test2这种列举的方式;也可以用通配符的方式GET /test*的方式;通配符还支持排除的方式GET /test*,-test2.当使用跨index的时候,有如下几个默认的参数:ignore_unavai...

2019-05-09 09:58:19 231

原创 elasticsearch01-概述和重要概念解释

前言Elastic search(es)是目前使用最广的搜索引擎,是elastic stack技术栈的核心,感觉es最大的功能就是提供全文搜索以及快速的查询能力,本章对es的学习分析是基于es官方文档和一些博客的总结分析。概念解释es中一些名词概念是非常重要的,如果没弄明白这些名词的含义,会对学习es带来极大的困扰,本节基于官方文档,罗列了一下重要名词概念:indexindex-索引,很...

2019-05-06 19:13:12 224

转载 BPMN2.0规范

参考博客基于BPMN2.0的工作流

2019-04-26 11:21:10 423

原创 各种场景的Service总结

各种场景的Service总结RepositoryService 流程存储服务RepositoryService是流程定义和部署对象,主要有以下三个部分的功能:管理流程定义文件(xml)和相关资源(流程图片bpmn)这是最重要的功能。通过deploymentBuilder部署文件构造器的方式来部署文件,一个DeploymentBuilder对象可以部署多个资源文件,然后在使用deploy...

2019-04-23 18:50:14 605

原创 核心API-processEngine流程引擎

核心API-processEngine流程引擎流程引擎processEngine是整个Activiti的核心,对于开发者,它是我们使用Activiti的facade,通过它可以获得所有想要的service。可以看到processEngine是一个接口,并提供了获取各种service的方法。public interface ProcessEngine { /** * The name ...

2019-04-23 14:05:31 3691

原创 Activiti命令拦截器和设计模式

Activiti命令拦截器和设计模式使用场景每个对流程的操作都可以看成一个命令command,Activiti会对每个命令进行拦截处理,Activiti的命令拦截用到了命令模式和责任链模式,命令模式的本质在于将命令进行封装,发出命令和执行命令分离;职责链模式只需要将请求放入职责链上,其处理细节和传递都不需要考虑;执行入口commandExecutor是命令执行的入口。在命令来临时,s...

2019-04-23 13:42:43 651

原创 Activiti配置

Activiti配置Activiti设计的配置相关的类继承关系如下图(Activiti6.0),核心的配置是最上层的抽象类ProcessEngineConfiguration,本文也是主要分析的这个抽象类。分析``ProcessEngineConfiguration`主要从下面几个点进行解读:创建ProcessEngineConfiguration对象;创建processEngine流...

2019-04-23 13:41:05 602

原创 Activiti工作流总览和表结构

工作流作为后端开发者肯定听过,在工作中也有广泛的应用,本专栏是对工作流学习的一些总结心得,初步计划分为以下几个部分来进行总结:Activiti工作流总览核心API-processEnigne流程引擎流程引擎配置-config解读各种场景的Service解读Activiti的数据库Activiti工作流常见的面试问题本文会对Activiti工作流进行一个总体的介绍。什么是工作流...

2019-04-23 13:36:42 653

原创 jdk源码解读-String、StringBuilder、StringBuffer

文章目录前言1.StringBuilder和StringBuffer为啥可变,String为啥不可变2. 为什么说StringBuilder线程不安全,String和StringBuffer线程安全补充StringBuilder和StringBuffer初始大小和扩容前言上一篇分析了AbstractStringBuilder抽象类,在面试中常常会问到String和StringBuilder、S...

2019-04-21 20:20:03 192

原创 jdk源码解读-原子类和Unsafe类

原子类jdk中的原子类是在java.util.concurrent.atomic包下的,常用的就是AtomicInteger,AtomicBoolean,AtomicLong这几个,包下也包括数组、对象的原子类,这些原子类的实现都基本相似,以AtomicInteger为例,主要需要关注两个点:数据存储的value是volatile修饰的。private volatile int valu...

2019-03-21 17:16:14 330 2

原创 分布式常问问题

分布式系统zk使用场景配置信息管理。类似dubbo的注册中心,有provider路由信息等。分布式锁。HA。主备服务都在zk中有,主服务挂了zk有感知,然后切换到备用服务。分布式锁1. redis实现分布式锁1.1 基础实现主要就是加锁和解锁两个操作。加锁:set(key 随机值 NX PX 30000) //key 锁的key //随机值 锁的value,...

2019-02-20 14:16:58 191

原创 缓存和redis

分布式缓存1.为什么使用缓存​ 使用缓存最大的一个原因是为了提高性能,如果不用缓存每次查询都要去数据库查询,性能差,使用缓存之后可以将查询的数据放入缓存,这样下次查询不需要访问数据库。​ 在因学项目中,课程、教室的查询都用了缓存,因为这些信息类似商品,发布之后改动不大,更多的是用户的查询。2.redis的数据类型及使用场景数据类型形式特点StringKey-val...

2019-02-20 14:14:39 215

原创 消息队列和RocketMQ

消息队列&amp;RocketMQ1. 消息队列的作用、业务场景​ 解耦:对于一个消息,producer发送给MQ之后,consumer根据需要自己去MQ取消息,而不是consumer直接去调用producer的消息,通过发布/订阅这种模式,就可以实现producer和consumer的解耦。​ 削峰:对于一些一小段时间的高并发请求,可以交给MQ,然后让这些大量请求慢慢消费,不至于让服务挂掉...

2019-02-20 14:13:49 620

原创 数据库索引和几种树结构的对比

数据库索引参考博客1 参考博客21. 什么是索引?为什么要用索引?​ 对于一个表如果没有索引,那么查询这个表中的一条数据,需要顺序查找一条一条对比,数据库存储的数据是在外存中的,并且是以块为存储单位的,那么可能需要依次访问每个数据块,指针的寻址等操作极费时间,使得查询效率差;索引是指对字段进行排序,并建立类似b+树这样的数据结构来增快查询效率,索引的原理可以参照b+树。2....

2019-02-20 14:12:48 396

原创 队列实现栈和栈实现队列

两个队列实现一个栈和两个栈实现一个队列参考博客两个队列实现一个栈​ push方法:直接将新的元素放入queue1的队尾。​ pop方法:两个队列一定是一个队列为空,一个队列非空;将非空的队列中的元素放到另一个队列,直到只剩下一个元素,将这个元素弹出即可。public class Queue2Stack{ private LinkedList&lt;Integer&gt; que...

2019-02-20 14:10:00 112

原创 数据结构总结

数据结构的逻辑结构和存储结构       逻辑结构:线性表(1对1)、树(1对多)、图(多对多)       存储结构:顺序存储和链式存储线性表       顺序存储的线性表。时间复杂度:索引取值O(1);据值查找O(n);插入O(n);删除O(n)。       链式存储的线性表。有单链表、双向链表、循环链表。时间复杂度:索引取值O(n);据值查找O(n);插入O(1);删除...

2019-02-20 14:02:51 599

原创 spring springmvc mybatis 知识点总结

IOC、DI       IOC:控制反转。是将原来对象的创建交给spring容器来管理。没有IOC的话,对象的创建一般通过在代码里面new一个对象这种方式;有了IOC,对象的创建或者说bean,是被spirng管理的,有自己的生命周期。       DI:依赖注入。DI是在spring创建对象的时候,动态的将依赖对象注入到对bean组件。BeanFactory、Application...

2019-02-20 14:01:31 193

原创 java集合知识点汇总

集合和数组的区别数组只能存放基本数据类型和引用类型;集合只能存放引用类型。 数组是固定长度;集合是可变长度。集合框架API       Collection              List                     ArrayList                     Vector                     LinkedList...

2019-02-20 13:58:18 3361 1

原创 java线程知识点汇总

线程状态       线程的状态可以分为5种:新建new、可运行runnable、正在运行running、阻塞blocked和死亡dead。       新建new:当一个线程新建出来,例如 Thread thread = new Thread() 此时,线程状态就是new。       可运行Runnable:当新建的线程调用start方法,线程状态就变为runnable,此时线...

2019-02-20 13:55:45 3276

原创 IO和Netty

BIO、NIO、AIO       BIO:一个连接一个线程。会对每个客户端连接分配一个线程。       NIO:一个请求一个线程。客户端的所有连接都注册到一个多路复用器上,多路复用器采用不断轮询的方式查询连接中是否有IO操作,当连接有IO操作才会启动一个线程进行处理。       AIO:一个有效请求一个线程。客户端的IO操作是由操作系统接收处理,处理完了才通知应用程序去启动线程处...

2019-02-20 13:54:14 105

原创 jdk源码解读-AbstractStringBuilder

文章目录类定义成员变量构造方法重要方法1.length/capacity2. ensureCapacity/ensureCapacityInternal3. expandCapacity4. trimToSize/setLength5. getValue6. 修改操作7. append8. insert类定义abstract class AbstractStringBuilder implem...

2019-02-15 17:26:40 268

原创 jdk源码解读-String

文章目录1. 类定义2. String + 字符串拼接的原理3. 变量属性4. 静态内部类5. 构造方法6. 重要方法6.1 compareTo /compareToIgnoreCase6.2 concat6.3 indexOf/lastIndexOf6.4 contentEquals/equals/contains6.4.1 contains6.4.2 contentEquals6.4.3 eq...

2019-02-15 14:53:32 265

原创 jdk源码解读-Integer

1. 类定义Integer类定义如下:public final class Integer extends Number implements Comparable&amp;lt;Integer&amp;gt; {}final修饰继承Number,Number是一个抽象类,Integer重写了其中的方法,这些方法作用就是各种包装类直接的转换(不包括Char)实现Comparable接口,...

2019-02-14 16:52:47 226

原创 jdk源码解读-Object

1. 为什么lang包下的不需要导包编译器会自动导入lang包下的类2. registerNatives()注册本地方法、native方法3. getClass()返回此 Object 的运行时类、native方法。这里返回运行时类的怎么理解呢,可以对比另一个 类名.class 来探究。public class Parent {}public class Son extends ...

2019-02-14 11:09:08 256

原创 设计模式02-抽象工厂模式

2.抽象工厂模式核心:基于不同的类型选择产品工厂,进而根据条件选择不同的产品优点:当一个产品族中的多个对象被一起使用,协同工作时,抽象工厂模式能够保证使用的都是同一个产品族的对象(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)缺点:产品族(产品类factory)扩展困难,需要在抽象工厂中增加代码,工厂创建者中增加代码例如以微信支付和支付宝支付为例,不同的支付方式需...

2019-02-13 10:09:05 152

原创 设计模式01-工厂模式

1.工厂模式核心:基于不同的条件,创建不同的实例对象(产品)优点:对象创建对于使用者是透明的,扩展性强(使用方只需要产品的名称,具体创建交给工厂)缺点:每个具体实现(产品)需要增加一个类,使系统复杂例如使用NotPad++或Sublime来写文本这个例子。首先需要一个公共的接口WriterSoftWare,并具有write方法,然后有两个具体的实现类,NotPad和Sublime,这...

2019-02-13 10:06:19 121

原创 第四届阿里中间件性能挑战赛总结

初赛总结赛题说明       赛题:https://code.aliyun.com/middlewarerace2018/docs.git       原来的dubbo服务调用是consumer去注册中心获取provider的信息然后直接向provider调用,如果服务之间的通信协议不同,例如有dubbo协议和http协议,那么很难实现不同技术框架不同协议建设的服务之间的互联互通,因此为...

2018-11-14 18:54:16 1387

原创 深入理解java虚拟机总结

第二章:Java内存区域和内存溢出异常1. 内存区域程序计数器:线程私有。指示当前线程执行的字节码的行号。是jvm中唯一不会发生oom的区域。栈:线程私有(每个线程有一个栈)。对于每个方法会创建一个栈帧,栈帧是虚拟机进行方法调用和方法执行的数据结构,栈帧包括局部变量表、操作数栈等。可能会有超出栈深度的异常和oom异常。堆:线程共享。存放实例变量,分为新生代和老年代,可以是内存中不连...

2018-09-18 14:24:56 479

空空如也

空空如也

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

TA关注的人

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