
java
代码届彭于晏
代码届彭于晏
展开
-
基于springboot的Mybatis源码分析 -----------------2 sql执行顺序
可以看到Mapper是一个MapperProxy的代理类执行mapper的方法最终会进入MapperProxy的invoke方法进入MapperMethods#execute。以select为例result = sqlSession.selectOne(command.getName(), param);这个sqlSession是一个SqlSessionTemplateS...原创 2019-12-19 19:39:18 · 565 阅读 · 0 评论 -
基于springboot的Mybatis源码分析 -----------------1 Mybatis初始化
直接找到MybatisAutoConfiguration这个类,至于为什么要找这个类,可以看下我springboot源码相关的文章。这个类上有一个注解@AutoConfigureAfter(DataSourceAutoConfiguration.class)说明在这之前会优先去解析DataSourceAutoConfiguration这个类,从名字也能看出这个和数据源有关系...原创 2019-12-19 17:19:10 · 320 阅读 · 0 评论 -
redis的缓存设计
我们的系统引入redis之后虽然会带来很多收益,但是同时也会增加很多负担,所以这就需要我们对缓存根据需求进行一定的设计。缓存引入带来的收益:1.加速读写2.降低后端负载成本1.一个窗口期内的数据不一致2.代码有维护成本3运维成本下面就几个方面来说明缓存的设计-----------------------------------------------------...原创 2019-12-08 16:57:15 · 259 阅读 · 0 评论 -
限流算法
我们都知道高并发有三大利器:缓存、熔断降级、限流。我用一篇文章来讲述下几种限流算法1.计数器法计数器法原理非常简单粗暴,就是在某段时间内计算进来的请求,如果超过了这个数量,就会拒绝请求。几种代码实现方式:基于Semaphore的限流方式public class CountRateUtils { private static Semaphore semaphore =...原创 2019-11-10 13:38:44 · 201 阅读 · 0 评论 -
两篇文章全面理解分布式事务问题(2) 柔性事务
上一篇文章讲述的是抛弃A,保证CP的刚性分布式事务解决方案,这一篇介绍柔性分布式事务解决方案。柔性事务遵循BASE理论,抛弃C,保证AP,以最终一致性来代替强一致性,柔性分布式事务解决方案中MQ承担非常重要的角色。1.本地化消息表A B两个分布式应用,各自有一个本地化消息表。A中的业务和消息处于同一个本地事务中,也就意味着A的事务提交之后,消息表中也存放了这条消息。存完之后A系统会...原创 2019-11-07 17:00:00 · 223 阅读 · 0 评论 -
两篇文章全面理解分布式事务问题(1) 刚性事务
关于ACID,CAP和BASE这边就不详细说明了,想了解的可以找网上的相关文章。分布式事务分为刚性事务和柔性事务两种类别,根据CAP理论刚性事务是会舍弃掉A,保证CP刚性事务严格一致性 执行时间短 实时性要求高首先,很自然的,我们可以把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回...原创 2019-11-07 15:10:33 · 468 阅读 · 0 评论 -
从NIO到netty(13)Netty的架构设计和开发中的几个注意点
之前把netty启动时的几大模块都分析完了,下面就Netty的架构设计做一个总结1、一个EventLoopGroup当中会包含一个或多个EventLoop。2、一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定。3、所有由EventLoop所处理的各种I/O事件都将在它所关联的那个Thread上进行处理。4、一个Channel在它的整个生命周期中只会注册在一...原创 2019-05-07 09:36:25 · 195 阅读 · 0 评论 -
从NIO到netty(16) Netty的粘包拆包问题与解决方案
关于粘包和拆包问题的产生,我在dubbo源码解析中已经解释过了,这里用一个例子来演示如果不加相应的处理器,产生的问题服务端handlerpublic class MyServerHandler extends SimpleChannelInboundHandler<ByteBuf> { private int count ; @Override pro...原创 2019-05-07 19:10:38 · 322 阅读 · 0 评论 -
从NIO到netty(14) ByteBuf和ReferenceCounted
ByteBuf是Netty提供的代替jdk的ByteBuffer的一个容器,首先看一下他的具体用法:public class ByteBufTest0 { public static void main(String[] args) { ByteBuf byteBuf = Unpooled.buffer(10);//堆缓冲区 for(int i=0;i&...原创 2019-05-07 19:02:34 · 323 阅读 · 0 评论 -
flink--9 fink 容错机制
flink的容错机制主要是通过checkpoint和state来实现的checkpiont机制和容错性Flink使用流重放和检查点的组合来实现容错。检查点与每个输入流中的特定点以及每个操作员的相应状态相关。流数据流可以从检查点恢复,同时通过恢复操作员的状态和从检查点重放事件来保持一致性(正好一次处理语义)。检查点间隔是在执行期间利用恢复时间(需要重播的事件数)来权衡容错开销的一种方法。...原创 2019-06-20 16:12:58 · 442 阅读 · 0 评论 -
从NIO到netty(12)Channel注册逻辑
回到AbstractBootstrap#initAndRegister方法接着分析这句话ChannelFuture regFuture = config().group().register(channel);首先是调用config()方法,这里直接返回一个Serverbootstrap的成员变量private final ServerBootstrapConfig confi...原创 2019-05-07 09:13:22 · 280 阅读 · 0 评论 -
从NIO到netty(11)ChannelHandler和ChannelHandlerContext
上一篇我们分析了ChannelInitializer加入到channelpipeline中,那么具体是如何加入到channelpipeline中的呢?要解释这个必须先说明几个的东西Channel的生命周期:Channel 接口定义了四个方法,分别代表了Channel生命周期中回调的方法:ChannelUnregistered Channel 已经被创建,但还未注册到 EventLo...原创 2019-05-06 20:56:22 · 1276 阅读 · 0 评论 -
从NIO到netty(10)ChannelPipeline
在AbstractBootstrap#initAndRegister方法中channel = channelFactory.newChannel();这个实例化了一个channel进入NioServerSocketChannel的构造函数,我们之前已经分析过了newSocket方法的作用接着进入public NioServerSocketChannel(ServerSocket...原创 2019-05-06 19:04:22 · 121 阅读 · 0 评论 -
从NIO到netty(9) Reactor模式
关于Reactor模式,有两篇经典文章:http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf这事Doug Lea关于Reactor的一篇ppt,这一节先分析这篇文章大多数的网络服务都是下面的流程:读取请求对请求进行解码处理服务(业务逻辑)编码相应发送响应经典的io模式是这样的:这就是传统的I/O模型。缺点就是一个...原创 2019-05-06 17:07:53 · 337 阅读 · 0 评论 -
从NIO到netty(4) 一个完整的java nio server和client例子
前面已经把NIO的三大组件介绍了一篇,接下去是一个完整的例子:Server端public class NioServer { //用于存储客户端对应的SocketChanel private static Map<String,SocketChannel> mapClient = new ConcurrentHashMap<>(); ...原创 2019-04-09 22:14:23 · 329 阅读 · 0 评论 -
从NIO到netty(3) Scatter/Gather与selector
分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。sc...原创 2019-04-09 22:08:36 · 158 阅读 · 0 评论 -
从NIO到netty(2) Buffer和Channel
Buffer本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法IntBuffer buffer = IntBuffer.allocate(10);for (int i =0;i<buffer.capacity();i++){ int randomNum = new Random().nextInt(10); ...原创 2019-04-09 21:51:11 · 111 阅读 · 0 评论 -
从NIO到netty(15) netty的编解码处理器
Netty处理器重要概念:* 1.Netty处理器可以分为两类,入站处理器和出站处理器,* 2.入站处理器的顶层是ChannelInboundHandler,出站处理器的顶层是ChannelOutboundHandler* 3.数据处理时常用的各种解码器本质上都是处理器* 4.编码:本质是一种出站处理器,因此编码一定是一种ChannelOutboundHandler* 5.解码:本质是...原创 2019-05-07 19:10:14 · 200 阅读 · 0 评论 -
从NIO到netty(17) 几种常见的编解码器
LineBasedFrameDecoder基于行的解码器,遇到 "\n"、"\r\n"会被作为行分隔符也就是说如果是传递过来的消息是两行,每一行消息就会做一个消息,解决粘包拆包问题FixedLengthFrameDecoder基于固定长度的解码器,比如一开始包分成四个+---+----+------+----+| A | BC | DEFG | HI |+---...原创 2019-05-07 19:37:49 · 530 阅读 · 0 评论 -
spark性能调优7 算子调优
1。mappartions替换map提高性能map算子的操作,在一个分区中,数据会一条一条进入函数内部而mappartions则会把分区中所有数据都导入到函数执行1、MapPartitions操作的优点:如果是普通的map,比如一个partition中有1万条数据;ok,那么你的function要执行和计算1万次。但是,使用MapPartitions操作之后,一个task...原创 2019-09-09 20:39:08 · 292 阅读 · 0 评论 -
flink -----14 Connector
Kafka-connectorKafka中的partition机制和Flink的并行度机制深度结合lKafka可以作为Flink的source和sinkl任务失败,通过设置kafka的offset来恢复应用Kafka Consumer消费策略设置setStartFromGroupOffsets()【默认消费策略】•默认读取上次保存的offset信息•如果是应用第一次...原创 2019-06-20 17:36:31 · 166 阅读 · 0 评论 -
flink -----13 并行度和生产上的配置
TaskManager与SlotFlink的每个TaskManager为集群提供solt。 solt的数量通常与每个TaskManager节点的可用CPU内核数成比例。一般情况下你的slot数是你每个节点的cpu的核数。l一个Flink程序由多个任务组成(source、transformation和 sink)。 一个任务由多个并行的实例(线程)来执行, 一个任务的并行实例(线程)数...原创 2019-06-20 17:25:55 · 800 阅读 · 0 评论 -
flink----12 wartermark 案例,接上一节
上一节的案例我们得到了触发window的条件watermark+window 处理乱序数据我们上面的测试,数据都是按照时间顺序递增的,现在,我们输入一些乱序的(late)数据,看看 watermark 结合 window 机制,是如何处理乱序的。nc -l 90000001,15383598820000001,15383598860000001,153835989200...原创 2019-06-20 17:21:29 · 671 阅读 · 1 评论 -
flink----10 window
Window:l聚合事件(比如计数、求和)在流上的工作方式与批处理不同。•比如,对流中的所有元素进行计数是不可能的,因为通常流是无限的(无界的)。所以,流上的聚合需要由 window 来划定范围,比如 “计算过去的5分钟” ,或者 “最后100个元素的和” 。•window是一种可以把无限数据切割为有限数据块的手段l窗口可以是 时间驱动的 【Time Window】(比如:每30秒...原创 2019-06-20 16:36:13 · 273 阅读 · 0 评论 -
flink--8 fink的一些高级特性 Boradcast Accumulators Distributed Cache
l把元素广播给所有的分区,数据会被重复处理•类似于storm中的allGrouping•dataStream.broadcast()l广播变量允许编程人员在每台机器上保持1个只读的缓存变量,而不是传送变量的副本给tasksl广播变量创建后,它可以运行在集群中的任何function上,而不需要多次传递给集群节点。另外需要记住,不应该修改广播变量,这样才能确保每个节点获取到的值都是一致...原创 2019-06-20 15:30:03 · 250 阅读 · 0 评论 -
从NIO到netty(1) 传统IO和装饰器模式/ NIO简介
jdk 1.4之前用的都是传统IO,主要是基于Stream的IO体系,是面相流的变成,java中一个流要么是输入流,要么是输出流。不能同时既是输入流又是输出流关于io的详细说明,可以参考这篇文章https://www.cnblogs.com/ylspace/p/8128112.html这里提及一下装饰器模式在java.io中大量使用装饰器模式,这里介绍下装饰器模式装饰器模式中的角色...原创 2019-04-09 20:34:28 · 321 阅读 · 0 评论 -
从NIO到netty(5) 编解码与零拷贝
在网络编程中经常会遇到乱码问题。这是一个非常常见的问题,这一篇将从原理上彻底分析这个原因我们都知道网络编程中,数据只能通过byte形式进行传递,所以在发送数据的时候先要将数据进行编码,也就是将需要发送的信息转换成byte数组。在接收数据时候需要进行解码,也就是将byte数组还原成信息的过程。说到编解码就不得不提编码集,目前已有的编码集如下ASCII:美国标准信息交换表:7bit来表示一...原创 2019-04-10 13:20:37 · 260 阅读 · 0 评论 -
dubbo源码解析(2) @adaptive 和 @activate
在上一篇中我们介绍Extensionloader,在介绍Extensionloader时候我们发现有一个adaptive,这是一个非常重要的注解,在dubbo中应用非常广泛,这一篇我们会详细介绍这个注解@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})...原创 2019-02-16 16:08:45 · 1416 阅读 · 0 评论 -
从servlet到springboot(13) 利用aop实现的事务控制
上一篇文章我们分析了spring实现aop的原理,在spring中有一个非常重要的功能,就是事务控制,而事务控制就是基于aop来实现的,这一篇我们将分析spring是如何利用aop来实现事务控制的。 我们还是在springboot框架下分析,入口是@EnableTransactionManagement这个注解点击进入之后@Target({ElementType.TYPE}...原创 2019-02-06 14:29:31 · 501 阅读 · 0 评论 -
从servlet到springboot(8) springboot启动 run方法解析之refresh--2
上一篇我们分析到registerListeners()我们进入这个方法protected void registerListeners() { // Register statically specified listeners first. for (ApplicationListener<?> listener : getApplicationListener...原创 2019-02-05 22:56:09 · 209 阅读 · 0 评论 -
从servlet到springboot(12) spring中aop的实现原理
前面几节的大部分都集中在spring的IOC部分,我们都知道spring的两大核心除了IOC之外还有AOP。aop的实现底层是动态代理,那么spring是如果实现这种动态代理,来达到aop的效果呢,这一节我们将揭开。 由于我们是在springboot中分析的,所以我们依然在springboot框架下分析。我们找到@EnableAspectJAutoProxy注解@Target(E...原创 2019-02-03 14:55:47 · 583 阅读 · 0 评论 -
从servlet到springboot(11) 手动编写一个redis的starter
上一节我们已经分析了springboot是怎么做到自动化配置的,这一节中我们将手动编写一个starter,通过这个starter我们就能实现redis自动化配置 pom文件引包<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:...原创 2019-02-02 15:34:20 · 306 阅读 · 0 评论 -
从servlet到springboot(7) springboot启动 run方法解析之refresh---1
从这一节开始,我们将分析spring初始化中最重要的方法 refresh,spring中bean的初始化就,springboot的自动化配置都是在这一步中进行的。由于内容比较多,我们将分成好几节来讲 这个方法最终调用AbstractApplicationContext中的refresh方法,所以我们直接看这个方法@Overridepublic void refresh() thro...原创 2019-01-28 15:20:01 · 217 阅读 · 0 评论 -
从servlet到springboot(10) springboot 自动化配置原理
Spring Boot中引入了自动配置,让开发者利用起来更加的简便、快捷。这一节我们将来分析springboot如何做到springboot的自动化配置的在前面几篇中的某一篇,我们曾经说到过ConfigFileApplicationListener这个Listeners,这个Listeners当时说的是解决了一个读取哪一个application.properties的功能,我们细说了这个功能。...原创 2019-02-02 10:33:56 · 288 阅读 · 0 评论 -
从servlet到springboot(9) springboot启动 run方法解析之afterRefresh;listeners.finished
afterRefresh方法进入,找到callRunnersprivate void callRunners(ApplicationContext context, ApplicationArguments args) { List<Object> runners = new ArrayList<Object>(); runners.addAll(cont...原创 2019-02-01 11:42:59 · 822 阅读 · 0 评论 -
从servlet到springboot(1) springboot启动 初始化SpringApplication
直接从启动类开始说起,springboot的入口就是 在main启动类的SpringApplication.run方法,这是Application的一个静态方法,那么要执行这个静态方法,肯定首先要对SpringApplication进行初始化,该类初始化的方法如下,前面几步都是给变量赋值,没什么好说的,主要看最后一步:initialize();public static void ma...原创 2019-01-10 11:04:16 · 889 阅读 · 1 评论 -
从servlet到springboot(6) springboot启动 run方法解析之prepareContext
上节我们分析到analyzers = new FailureAnalyzers(context);为止我们接下去分析prepareContext这段代码主要做了八件事为上下文设置Environment. 注意 这里传入的是 StandardServletEnvironment调用postProcessApplicationContext方法设置上下文的beanNameGenerat...原创 2019-01-11 18:52:38 · 262 阅读 · 0 评论 -
从servlet到springboot(4) springboot启动 run方法解析之context = createApplicationContext();
上一篇我们分析到了Banner printedBanner = this.printBanner(environment);这一行主要就是打印图案代码执行完这部,你就能看到这个了接着分析下一步这一步主要是创建上下文context = this.createApplicationContext();----->这个上下文就是AnnotationConfi...原创 2019-01-10 20:52:08 · 713 阅读 · 0 评论 -
从servlet到springboot(3) springboot启动 run方法解析之Banner printedBanner 为之
上一篇我们分析到listeners.started()为止,我们接着分析ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);我们进入DefaultApplicationArguments类内部跟踪到public class SimpleCommandLineProp...原创 2019-01-10 17:37:59 · 281 阅读 · 0 评论 -
从servlet到springboot(14) Tomcat源码分析(1)。tomcat的启动与Lifecycle接口
前面几篇内容主要几种在springboot启动时,我们接下去会探讨下请求到达spring容器的过程。请求进入spring容器最先会进入tomcat,所以我们优先分析下tomcat 如图所示:tomcat的顶层容器是Server,一个tomcat顶多只有一个Server,一个Server下有多个Service,一个Service又包含多个Connectors和一个Container。...原创 2019-02-10 15:44:56 · 243 阅读 · 0 评论