- 博客(134)
- 收藏
- 关注
原创 解锁 ElasticJob 云原生实践的难题
最近在逛 ElasticJob 官方社区时发现很多小伙伴都在头疼这个 ElasticJob 上云的问题,ElasticJob 本就号称分布式弹性任务调度框架,怎么在云原生环境就有了问题了呢,这就要从 Kubenertes 和 ElasticJob 的一些状态化说起。
2023-11-27 18:37:11
146
原创 从一个 Demo 说起 Zookeeper 服务端源码
可以看到启动一个单机版的Zookeeper服务并不复杂只需要配置属性,启动服务即可,前面的整个案例仅仅是一个入门案例可以方便借助开发工具来Debug源码,清晰的了解代码执行过程,更多原理与源码解析可以订阅微信公众号《中间件源码》及时获取。
2023-02-09 12:52:23
235
原创 从一个Demo说起Dubbo3
2017年的9月份,阿里宣布重启Dubbo的开发维护,并且后续又将Dubbo捐献给了Apache,经过多年的发展已经发布到3.X版本了,Dubbo重启维护之后是否有值得我们期待的功能呢,下面就来看看吧。Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC 通信、流量治理、可观测性等解决方案,涵盖 Java、Golang 等多种语言 SDK 实现。
2023-01-09 12:51:38
591
原创 可观测性之Log4j2优雅日志打印
日志也是我们最常用的观测系统健康状况的方式,优雅的日志打印可以在排查问题的时候事半功倍,在Java日志组件中很多地方使用了日志实现自动扫描的扩展机制,如果随意引入不兼容的依赖包之后被扩展机制扫描到,就很容易出现日志不打印的问题,对于Java 日志依赖的引入,我们可以先了解其曲折的发展历史,了解其依赖来源,然后再针对性的配置依赖即可。
2023-01-06 13:20:38
2077
1
原创 可观测性神器之 Micrometer
对于大部分开发人员来说可能用过普罗米修斯 Grafana 这样的监控系统,从未听说过 Micrometer 工具,这里就详细的来介绍下可观测性神器 Micrometer,让你在开发时使用它就和使用 SLFJ 日志系统一样简单易用,有效的提升系统的健壮性和可靠性。在了解 Micrometer 之前可以先来简单了解下云原生微服务时代下人人追捧的可观测性概念,这会更有利于我们理解 Micrometer 的作用,在传统单体应用时代对于服务的检查和诊断可以借助于简单的报表,监控和日志就可以有效的解决,而现在为了易于分
2022-12-05 22:40:18
2890
2
原创 Spring6 正式发布!重磅更新,是否可以拯救 Java
Spring Framework6 和 Spring Boot3 是一个跨越式的升级整个框架支持的最低 JDK 版本直接跨越到 JDK17,无论框架层还是基础设施层都做了巨大的改变,Spring 6.0 新框架具体做了哪些功能的升级与改进,是否有必要升级与使用呢?可以继续看一看。下面可以先看下翻译自 Spring 官方社区一个宣导博客尊敬的 Spring 社区:我很高兴地宣布,现在 MavenCentral 已经可以提供 SpringFramework6.0.0 了!这是 2023 年及以后新一代框架的开始
2022-12-05 22:37:59
3440
原创 亿级万物互联新时代的物联网消息中间件EMQX调研
EMQX是什么?根据官网的介绍EMQX是一款「随处运行,无限连接,任意集成」的云原生分布式物联网接入平台。EMQX 提供一体化的分布式MQTT消息服务和强大的 IoT 规则引擎,为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业快速构建关键业务的 IoT 平台与应用。EMQ 创始人兼 CEO 李枫表示:「EMQX 5.0 是 MQTT 领域的一个里程碑式的成果。它不仅是全球首个单集群支持 1 亿连接的分布式 MQTT 消息服务器,也是首个将 QUIC 引入 MQTT 的开创性产品。
2022-11-19 14:17:13
1435
原创 kafka源码-处理Poll的IO返回结果
如果失去连接数大于0则标记请求更新元数据变量needUpdate为true下次io时候请求新的元数据。如果失去连接数大于0则标记请求更新元数据变量needUpdate为true下次io时候请求新的元数据。NetworkClient的handleCompletedReceives方法。NetworkClient的handleTimedOutRequests方法。清理当前节点对应飞行窗口InFlightRequests中的请求队列中的数据。NetworkClient的completeResponses方法。
2022-11-14 23:04:30
783
原创 Kafka源码-执行IO事件
前面介绍了用户的的消息记录被转换为内存记录然后存放在了飞行窗口中,将请求信息放入了Kafka通道之后通过OP_WRITE事件来唤醒IO,这里在IO轮训中开始执行IO逻辑可以看到IO事件主要做了两件事接下来开始贴核心代码了:这里KafkaClient是一个接口类型,这里的实现类型为NetworkClient,poll代码如下所示:Selector的poll方法 IO执行逻辑的模版方法Selector的pollSelectionKeys方法 循环处理IO事件的方法。
2022-11-14 23:03:46
672
原创 Kafka源码-发送器Sender类型的的sendProducerData 模版方法
前面对用户待发消息的批处理队列进行了处理得到最终需要发送的批处理消息集合然后遍历每个节点对应的批处理集合,将其存放在网络通道中等后续IO逻辑执行的时候将Kafka通道中存放的消息发送出去。NetworkSend类型的待发数据中存储的是请求目的地和请求头数据,而真实的数据是在飞行窗口中存储着的。KafkaClient 是一个封装客户端的一个接口,仅有的实现类型为NetworkClient。kafka Selector类型的的send方法队列给定的请求。NetworkClient的doSend方法。
2022-11-14 23:03:19
846
原创 2 生产者KafkaProducer对象的初始化
这个类型是将记录发布到Kafka群集的Kafka客户端。生产者是线程安全的,跨线程共享单个生产者实例通常比拥有多个实例快。下面是一个使用生产者发送记录的简单示例,其中包含序列号作为键/值对的字符串。生产者包括一个缓冲区池,其中保存尚未传输到服务器的记录,以及一个后台I/O线程,负责将这些记录转换为请求并将其传输到集群。使用后未关闭生产者将泄漏这些资源。。调用时,它将记录添加到挂起中,并立即返回。这使制作人能够将单个记录批处理在一起,以提高效率。
2022-11-14 23:01:53
308
原创 Erlang并发编程思想
这就是我们的交流方式。这就意味着Erlang的进程在任何操作系统上都会具有相同的逻辑行为, 这样,就能编写可移植的并发代码,让它在任何支持Erlang的操作系统上运行。这就意味着Erlang的进程在任何操作系统上都会具有相同的逻辑行为, 这样,就能编写可移植的并发代码,让它在任何支持Erlang的操作系统上运行。如果执行这一语句的子句不在catch语句的范围内, 此进程就会向当前连接的所有进程广播一个带有参数Why的退出信号。Erlang有一种公布进程标识符的方法,它让系统里的任何进程都能与该进程通信。
2022-10-02 21:51:16
2647
原创 【Kafka源码】- 生产者KafkaProducer对象的初始化
这个类型是将记录发布到Kafka群集的Kafka客户端。生产者是线程安全的,跨线程共享单个生产者实例通常比拥有多个实例快。下面是一个使用生产者发送记录的简单示例,其中包含序列号作为键/值对的字符串。i < 100;生产者包括一个缓冲区池,其中保存尚未传输到服务器的记录,以及一个后台I/O线程,负责将这些记录转换为请求并将其传输到集群。使用后未关闭生产者将泄漏这些资源。send() 方法是异步的。调用时,它将记录添加到挂起记录发送的缓冲区中,并立即返回。
2022-10-02 21:49:27
900
原创 [Dubbo3.0.8源码解析系列]-26-消费者一个服务是如何通过RPC调用到提供者的
容错模版类AbstractClusterInvoker//从服务目录里面根据路由规则动态查询invoke服务提供者的调用器 List < Invoker < T > > invokers = list(invocation);//获取负载均衡策略默认为随机RandomLoadBalance LoadBalance loadbalance = initLoadBalance(invokers , invocation);try {} }...
2022-08-28 20:13:15
832
原创 [Dubbo3.0.8源码解析系列]-25-为调用器对象增加容错和过滤器等功能
将思路拉回到RegistryProtocol的创建Invoker对象的doCreateInvoker代码不论是接口级还是应用级注册都会调用代码。
2022-08-28 20:04:30
296
原创 [Dubbo3.0.8源码解析系列]-24- Dubbo应用级服务发现
然后看AbstractServiceNameMapping的getAndListen方法}
2022-08-28 20:01:33
1239
原创 [Dubbo3.0.8源码解析系列]-23-消费者进行接口级服务发现订阅的逻辑
前面说了《Dubbo3消费者自动感应决策应用级服务发现原理》简单的说了下消费者是如何通过创建代理对象来进行应用级或者接口级的一个决策,只提到了迁移规则的使用与最终的currentAvailableInvoker对象的创建,并没有说详细的细节,这里我们来详细看看细节:服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信。可以通过以下图的消费者与注册中心的交互逻辑来帮助理解:消费者主动向注册中心订
2022-08-28 19:45:32
764
原创 [Dubbo3.0.8源码解析系列]-22-Dubbo3消费者自动感应决策应用级服务发现原理
这里要说的内容对Dubbo2迁移到Dubbo3的应用比较有帮助,消费者应用级服务发现做了一些自动决策的逻辑来决定当前消费者是应用级发现还是接口级服务发现,这里与前面说的提供者双注册的原理是对等的,提供者默认同时进行应用级注册和接口级注册,消费者对提供者注册的数据来决定使用应用级发现或者接口级发现。这些都是默认的行为,当然对于消费者来说还可以自定义其他的迁移规则,具体的需要我们详细来看逻辑。如果说对于迁移过程比较感兴趣可以直接去官网看文档相对来说还是比较清晰:https://dubbo.apache.org/
2022-07-10 18:47:01
708
2
原创 [Dubbo3.0.8源码解析系列]-21-Dubbo3消费者引用服务的入口
前面我们通过Demo说了一个服务引用配置的创建。另外也在前面的文章说了服务提供者的启动完整过程,不过在说服务提供者启动的过程中并未提到服务消费者是如何发现服务,如果调用服务的,这里先就不再说关于服务消费者启动的一个细节了,直接来看前面未提到的服务消费者是如何引用到服务提供者提供的服务的。先来回顾下样例代码:更多内容也可关注原文 https://blog.elastic.link/......
2022-07-09 16:58:13
762
原创 [Druid-1.2.11源码系列]-9-Druid销毁线程
在前面的博文中我们介绍了创建Druid连接的线程的逻辑《6-DruidDataSource物理连接创建线程createAndStartCreatorThread》 ,这里来看下销毁连接的逻辑。这个代码调用逻辑是来源于前面说的DruidDataSource的连接对象获取时的初始化方法init调用代码如下:9.2 创建销毁线程的具体逻辑直接来看DruidDataSource类型的createAndStartDestroyThread代码如下所示:9.3 销毁线程代码这里直接来看代码了9.4 销毁任
2022-06-29 22:48:35
591
原创 OpenJDK11 下的HSDB工具使用入门
安装OpenJDK ,然后输入以下命令:将会看到如下页面,点击Attach to HotSpot procss来填入进程id查询进程信息这里有很多的工具可以尝试一下
2022-06-29 22:09:51
306
原创 [Druid-1.2.11源码系列]-8-数据库连接的首次验证validateConnection方法
在DruidAbstractDataSource物理连接创建的方法createPhysicalConnection的时候说到了使用驱动包来创建连接Connection对象,当对象创建完毕之后会调用validateConnection方法来进行连接信息的验证,调用代码如下所示:在前面我们的Demo中我们为DruidDataSource设置了这样一个属性如下所示:上面这个属性将会用到验证连接的地方。接下来我们来看下DruidAbstractDataSource的validateConnection方法:..
2022-06-28 22:48:39
687
原创 [Druid-1.2.11源码系列]-7-mysql-connector-java驱动包内部的创建数据库连接对象的过程
上一个博客介绍了FilterChainImpl类型获取驱动器创建连接的方法如下代码所示:这个driver驱动是在DruidDataSource初始化init方法执行的时候通过调用方法 resolveDriver();根据url自动创建的驱动类型这个驱动类型为:com.mysql.cj.jdbc.Driver接下来我们会详细看这个com.mysql.cj.jdbc.Driver中的连接方法。在详细介绍连接方法我们先简单看一下它的继承关系如下图所示:为什么要介绍com.mysql.cj.jdbc.Dr
2022-06-27 22:53:35
558
1
原创 [Dubbo3.0.8源码解析系列]-20-Dubbo3服务引用配置ReferenceConfig
前面简单介绍了一下消费者的例子,消费者创建的第一步就是先进行消费者信息的配置对应类型为ReferenceConfig,这里详细来看ReferenceConfig包含哪些信息?先简单了解下消费者配置的类型关系如下图所示:引用配置与服务配置类型都是通过继承接口配置来扩展的,在分析生产者的时候详细介绍过服务相关的配置,这里来详细看消费者引用者的相关配置信息.前面例子说了消费者配置对象的创建主要是通过如下代码:这个配置类型的对象创建过程并没有太多的逻辑这里主要来说下各种配置信息:服务消费者引用服务配置。对应的
2022-06-26 23:07:35
701
原创 [Dubbo3.0.8源码解析系列]-19-重新来过从一个服务消费者的Demo说起
为了更方便了解原理,我们先来编写一个Demo,从例子中来看源码实现:,前面说了提供者现在已经有服务注册上去了,那接下来我们编写一个消费者的例子来进行服务发现与服务RPC调用。为了Demo可以正常启动,需要我们先在本地启动一个Zookeeper如下图所示:接下来给大家贴一下示例源码,这个源码来源于Dubbo源码目录的 dubbo-demo/dubbo-demo-api 目录下面的dubbo-demo-api-consumer子项目,这里我做了删减,方便看核心代码:首先我们定义一个服务接口如下所示:19.
2022-06-26 16:50:13
289
原创 [SpringCloudDataFlow v2.3.0源码系列]-3-启动类DataFlowServerApplication简介
Spring Cloud DataFlow是一个SpringBootApplication应用程序启动的时候是通过调用DataFlowServerApplication的main方法来启动的,我们来详细看下启动类中包含类哪些内容这个启动类 比较简单只有两个注解,一个main方法@SpringBootApplication : 是Sprnig Boot项目的核心注解,目的是开启自动配置表示一个配置类,该类声明一个或多个 @Bean 方法,并且还触发自动配置和组件扫描。这是一个便捷注释,等效于声明 @Co
2022-06-26 16:33:48
219
原创 [SpringCloudDataFlow v2.3.0源码系列]-2-从一个简单的例子出发
当前主要说版本v2.3.0.RELEASE,代码加载方式:切换分支2.2 查看源代码之前我们先看下启动方式:Data Flow Server 通过委托给 Spring Cloud Skipper 来部署 Streams,并直接部署 Tasks。Skipper 和 Data Flow 服务器都可以部署到本地机器、Cloud Foundry 和 Kubernetes。本地启动Cloud Foundry平台部署Kubernetes编排部署-参考网址:https://dataflow.spring.
2022-06-26 16:32:11
372
原创 [SpringCloudDataFlow v2.3.0.RELEASE源码系列]-1-云原生的流和批处理数据处理管道简介
Spring Cloud Data Flow是一个基于微服务的工具包,用于在 Cloud Foundry 和 Kubernetes 中构建流和批处理数据处理管道。数据处理管道由使用Spring Cloud Stream 或Spring Cloud Task微服务框架构建的 Spring Boot 应用程序组成。这使得 Spring Cloud Data Flow 成为一系列数据处理用例的理想选择,从导入/导出到事件流和预测分析。数据流有两个主要组成部分:访问数据流的主要入口点是通过数据流服务器的 RESTf
2022-06-26 16:29:07
383
原创 [Spring-Boot 2.6.6源码解析系列]-6-BeanDefinition的Reader和Scanner
前面两个构造器创建完成了之后才会创建注解AnnotationConfigApplicationContext的构造器这个构造器主要创建了两个对象:reader:AnnotatedBeanDefinitionReaderscanner:ClassPathBeanDefinitionScannerAnnotatedBeanDefinitionReader:关于AnnotatedBeanDefinitionReader官方注释是这样解释的: 方便的适配器,用于bean类的编程注册。这是ClassPathBea
2022-06-26 16:25:38
266
原创 [Apache Kafka 3.2源码解析系列]-6- Kafka客户端的IO线程KafkaThread
回到前面说的KafkaProducer的构造器的初始化在发送器执行之后将会执行创建KafkaThread和启动线程的代码如下代码:KafkaProducer构造器中的部分代码6.2 KafkaThread构造器这个线程类型做的事情不多主要设置一下线程名字,然后将线程设置为守护线程如下代码所示:KafkaThread类型的构造器如下所示:6.3 发送器Sender中执行线程的I/O主循环核心逻辑前面我们看到了 线程类型在初始化的时候传递了Sender对象来执行线程逻辑,Sender类型实现了Runna
2022-06-26 16:23:00
637
原创 [Apache Kafka 3.2源码解析系列]-5- Kafka的发送器对象的初始化
对应Sender 对应代码:Sender类型实现了Runnable接口Sender对象处理向Kafka群集发送生产消息的请求的后台线程。该线程发出元数据请求以更新其集群视图,然后将生成请求发送到适当的节点。可以简单总结下这个过程如下所示:发送器对象的创建过程有几个重要的类型我们是要看的,下面我们先来看KafkaClient类型对象的创建和初始化网络客户端 对象创建 用于异步请求/响应网络i/o的网络客户端。这是一个内部类,用于实现面向用户的生产者和消费者客户端。NetworkClient此类不是线程安全
2022-06-26 16:19:56
828
原创 [Elastic-Job2.1.5源码]-12-调度作业的服务器IP和进程信息的持久化是如何设计的?
作业服务器信息的持久化主要调用了如下两行代码:作业服务器信息上线需要两个节点:我们先来看一下两者区别的表格:①持久实例节点servers持久节点是调用如下代码来进行写入的:参数enabled设置服务器是否启用。enabled参数是上面一开始我们说到的轻量级作业配置LiteJobConfiguration中的disabled属性是否禁用服务器,当禁用配置为false的时候我们才会启用服务器状态,这里对应节点为/{jobName}/servers/{ip},存储数据如下:通过这个节点可以有效的控制作业对应机
2022-06-26 14:43:56
222
原创 [Elastic-Job2.1.5源码]-11-基于Zookeeper分布式锁实现选举作业主节点原理
Elastic-Job 定位为轻量级,去中心化,其任务调度由各自的机器驱动,各台机器之间通过Zookeeper去协调,Elastic-Job 为每个任务都创建一个JobScheduler作业调度对象,而在JobScheduler对象的初始化中会为每个Job选举一个主节点,记住这里不是为整个进程的所有作业创建一个全局的主节点,而是每个调度作业都会有一个主节点。那为什么需要为每个作业分别选举出来一个主节点呢?在一个任务执行过程中,有多个机器,每台机器上面都部署一个作业进程,调度系统在执行作业的时候不依赖物理机器
2022-06-25 22:15:12
318
原创 [Druid-1.2.11源码系列]-6-DruidDataSource物理连接创建线程createAndStartCreatorThread
前面我们介绍了如何打印连接监控信息的到日志中的线程信息,这里继续代码执行过程中触发的创建连接的线程类型,根据前面的代码来看是通过这样一个方法调用来触发的:对于了解过JDBC连接的同学应该都知道创建一个连接java.sql.Connection类型对象并不麻烦,先初始化驱动然后通过Driver驱动类型的工具类调用getConnection方法即可,但是如果想要将这些连接信息管理起来并不是太方便,接下来就让我们看下Druid连接池是如何做的吧,DruidDataSource的createAndStartCre
2022-06-20 22:54:43
583
原创 [Elastic-Job2.1.5源码]-10- 调度作业的监听器大全
监听机制的实现是一种发布者/订阅者的观察者设计模式的实现。调度系统引入来Netflix实现的Curator组件,通过Curator提供的订阅机制来实现对节点事件订阅。Curator 事件订阅有两种模式:标准的监听模式是使用Watcher 监听器。第二种缓存监听模式引入了一种本地缓存视图的Cache机制,来实现对Zookeeper服务端事件监听。Cache事件监听可以理解为一个本地缓存视图与远程Zookeeper视图的对比过程。Cache提供了反复注册的功能。Cache是一种缓存机制,可以借助Cache实现监
2022-06-19 17:28:40
275
原创 [Dubbo3.0.8源码解析系列]-18-Dubbo3元数据服务MetadataService的导出
MetadataService此服务用于公开Dubbo进程内的元数据信息。典型用途包括:1。使用者查询提供者的元数据信息,以列出接口和每个接口的配置2。控制台(dubbo admin)查询特定进程的元数据,或聚合所有进程的数据。在Dubbo2.x的时候,所有的服务数据都是以接口的形式注册在注册中心,Dubbo3将部分数据抽象为元数据的形式来将数据存放在元数据中心,然后元数据由服务提供者提供给消费者而不是再由注册中心进行推送,如下图所示://未完待续............................
2022-06-18 18:51:16
2279
3
原创 [Elastic-Job2.1.5源码]-9- 调度作业启动时的生命周期
注册启动信息主要是启动调度之前做的一些初始化操作主要包含:每一步执行逻辑都比较重要并且包含了特定的逻辑。其中作业配置信息的注册在前面我们已经了解过,作业核心的配置信息以JSON的格式存储在作业的config节点下面,下面我们就来看下其余部分的启动逻辑。启动信息的注册在初始化方法中通过调用调度器门面对象schedulerFacade的registerStartUpInfo方法来触发,如下代码所示:启动信息的注册主要是调度系统向Zookeeper注册调度作业需要的一些基本信息和开启几个用于诊断作业健康状态的服
2022-06-18 17:52:07
178
原创 [架构笔记]-1-秒杀笔记
部分内容来源于许令波老师在网上的分享,这里是我做的一些笔记:秒杀主要解决两个问题:秒杀系统的整体架构原则:秒杀系统应该注意的架构原则:架构改造:瓶颈:
2022-06-18 15:53:51
189
原创 [Druid-1.2.11源码系列]-5-DruidDataSource监控信息定期打印日志线程LogStatsThread
前面我们说了初始化《3-Connection连接数据库之前的初始化操作》初始化线程池时候初始化了一个打印线程信息的线程 LogStatsThread对象logStatsThread创建,调用代码如下所示:DruidDataSource类型的init方法中调用创建和打印监控信息到日志的线程具体逻辑如下:DruidDataSource类型的createAndLogThread方法5.2 线程类5.2.1 线程类LogStatsThread监控打印到日志的类型LogStatsThread可以看到上
2022-06-16 22:30:56
1023
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人