自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程池的核心线程会销毁吗?

今天跟别人讨论了线程池的核心线程会不会销毁的问题先上代码public static void main(String[] args) throws InterruptedException { ThreadPoolExecutor pool = new ThreadPoolExecutor(4,10,5, TimeUnit.SECONDS,new LinkedBlockingDeque<>(20)); //pool.allowCoreThreadTimeOut(true);

2020-09-18 11:34:31 11757 2

原创 为什么tomcat要自定义线程池实现?

tomcat为什么要自定义线程池?有什么好处?

2023-09-21 19:56:38 590

原创 深度解析lettuce,为什么单连接也可以处理高并发redis请求

lettuce是什么?为什么被springboot 2.x作为默认reids客户端

2023-09-05 15:48:03 731 3

转载 Leaf——美团点评分布式ID生成系统

美团给出的解决时钟回拨方案

2023-09-04 15:21:28 276

转载 ZGC原理,与CMS、G1的对比

zgc,g1,cms对比

2023-09-01 16:57:48 266

原创 让自己再认识一下分区吧

关于分布式架构下的分区干货

2023-05-18 19:48:11 915

原创 站的更高一点看分布式系统中的复制

为什么要复制?复制延迟怎么解决?

2023-05-18 15:51:24 652

原创 为什么要使用Thrift与Protocol Buffers?

Thrift与Protocol Buffers

2023-05-17 17:26:54 639

原创 数据仓库是什么?什么是列式存储?

数据仓库和列存储

2023-05-17 14:15:14 755

原创 深度探索存储与检索

重新认识数据库和索引

2023-05-17 11:48:34 414

原创 安利两个简单的http基准压测工具

wrk、 Apache bench

2023-05-16 10:55:29 621

原创 RocketMQ 概念特性,架构设计解读

RocketMQ 概念特性,架构设计解读

2023-03-23 17:52:18 766

转载 Java性能优化的七个方向

性能优化的思路

2023-03-06 14:30:52 182

原创 logback源码阅读(四) 为什么日志系统初始化了两次?bootstrapContext

bootstrap和application有什么区别

2022-07-31 21:41:10 479

原创 算法之合并多个有序链表

合并多个有序数组

2022-07-30 21:44:57 477

原创 如何自定义feign方法级别的超时时间

自定义feign方法级别超时时间

2022-07-30 20:40:02 2195

原创 logback源码阅读(三) springboot对LoggingSystem日志系统的支持

springboot对日志loggingSystem的支持

2022-07-29 15:37:57 532

原创 logback源码阅读(二)日志打印,自定义appender,encoder,pattern,converter

日志打印,自定义appender,encoder,pattern,converter

2022-07-27 16:42:25 1128

原创 logback源码阅读(一)获取ILoggerFactory、Logger

logback源码阅读获取ILoggerFactory,Logger

2022-07-25 11:01:48 1346

原创 动态刷新日志级别

日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO级别的日志,主要记录业务操作的日志。那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,但是这么做不优雅而且可能会破坏现场。本文介绍一种实现方案通过Apollo配置中心来实现动态调整线上日志级别。......

2022-07-18 16:36:46 905

原创 Sentinel源码(六)ParamFlowSlot热点参数限流

Sentinel源码(三)slot解析中我们还遗留了最后一个slot,ParamFlowSlot没有讲解,本文着重探究sentinel如果做热点参数限流首先区别于其他的slot,热点参数限流并非在 Sentinel 的 core 模块中实现的,而是在扩展模块中实现的。主要是根据同一资源不同的参数进行限流。之前的限流策略都是针对资源维度的,热点参数限流则将维度细化到资源的某个参数上限流类型热点参数限是流通过对请求的第几个参数以及参数值的流量进行统计,超过阈值触发流控的一种方式sentinel提供两种

2022-02-24 13:55:45 869

原创 无序数组排序并得到最大间隔

问题描述给定一个无序整型数组,求将其排好序后,并得出相邻两个数之间的最大差值。例如:{1,3,2,5,7,4,13}排序后{1,2,3,4,5,7,13} 那么最大间隔是6这个问题大部分人会想到先排序后遍历的解法,但是这个问题要求的时间复杂度是O(n)传统的排序并做不到解法思路一:运用计数排序的思想先求出原数组的最大值Max与最小值Min的区间长度k(k=Max-Min+1)。创建一个长度为k的新数组Array。遍历原数组,把原数组每一个元素插入到新数组Array对应的位置,比如元素的

2022-02-24 10:11:39 750

原创 Sentinel源码(五)FlowSlot以及限流控制器源码分析

在Sentinel源码(三)slot解析中,我们遗留了FlowSlot的源码还未分析,本文着重分析,如果没有读过之前文章的同学建议先去了解一下,本文对于基本知识不再阐述概要FlowSlot是插槽链的核心:结合从之前的插槽(NodeSelectorSlot、ClusterNodeBuilderSlot 和 StatisticSlot)收集的运行时统计信息,FlowSlot 将使用预先设置的规则来决定是否应该阻止传入的请求。(插槽链相关知识在本文开头有链接)通过本类我们知道:(1)如果触发任何规则,S

2022-02-20 22:03:42 503

原创 Sentinel源码(三)slot解析

回顾在Sentinel源码(二)入口方法分析中,我们遗留了插槽链相关的内容,本文将详细解析这块内容关于插槽链:在sentinel-core包下面默认提供了8个插槽连(com.alibaba.csp.sentinel.slotchain.ProcessorSlot)# Sentinel default ProcessorSlotscom.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlotcom.alibaba.csp.sentinel.s

2022-02-20 12:01:36 909

原创 Sentinel源码(四)(滑动窗口流量统计)

在Sentinel源码(三)slot解析中,我们讲到:StatisticSlot是专用于实时统计的处理器插槽。进入这个slot时,我们需要单独统计以下信息:ClusterNode:资源ID的集群节点的总统计。OriginNode:来自不同callersorigins的集群节点的统计信息。DefaultNode:特定上下文中特定资源名称的统计信息。所有入口的总和统计。我们知道了entry方法中下面的代码是线程数和流量统计// Request passed, add thread count

2022-02-20 11:57:36 668

原创 Sentinel源码(二)入口方法分析

写在前面我们在上篇文中章已经分析了Sentinel是怎么让SentinelResource注解生效的,保留了一个疑问,每个被SentinelResource注解的方法都会在环绕通知中先调用一下如下代码entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs()),本篇继续分析这个entry方法,分析这个方法之前,首先要了解这几个概念Resourceresource是sentinel中最重要的一个概念,sentine

2022-02-13 21:30:32 1011

原创 Sentinel源码(一)SentinelResourceAspect

本文版本:1.8.0SentinelResourceAspectSentinel是做什么的就不详细介绍了,有需要的请点击注解支持接下来就从SentinelResourceAspect开始探索Sentinel我们知道,只要在方法上加上SentinelResource,就可以配置一些限流熔断策略,那么就要看这个注解被用在源码的什么地方@Aspectpublic class SentinelResourceAspect extends AbstractSentinelAspectSupport {

2022-02-10 11:42:02 640

转载 Raft对比ZAB协议

1 leader选举为什么要进行leader选举?在实现一致性的方案,可以像base-paxos那样不需要leader选举,这种方案达成一件事情的一致性还好,面对多件事情的一致性就比较复杂了,所以通过选举出一个leader来简化实现的复杂性。1.1 一般的leader选举过程更多的有2个要素:1.1.1 选举轮次1.1.2 leader包含更多的日志1.1.1 选举投票可能会多次轮番上演,为了区分,所以需要定义你的投票是属于哪个轮次的。Raft定义了term来表示选举轮次ZooKeeper

2022-01-27 17:54:10 766

原创 Raft协议图解,缺陷以及优化

结点的状态每个结点可以有三种状态:Follower,Candidate,Leader。所有的结点都是从Follower状态开始的如果followers没有收到leader的RPC消息(心跳),则可以转换为candidate,如下图node a,Term表示任期而candidate需要发起投票,其他结点参与投票,回复他们的投票结果,如果这个candidate获得了大部分(过半)的选票,就可以成为leader结点了。这就是Leader Election过程。选举机制每个节点随机一个选举超时时间,而

2022-01-26 17:50:07 3256

转载 理解TCP长连接(Keepalive)

TCP Keepalive的起源TCP协议中有长连接和短连接之分。短连接环境下,数据交互完毕后,主动释放连接;长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,且有可能导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。所以服务器端要做到快速感知失败,减少无效链

2022-01-26 14:49:24 1620

原创 MySQL数据库设计规范

1. 规范背景与目的MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。2. 设计规范2.1 数据库设计以下所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。对于不满足【高危】和【强制

2022-01-13 16:11:02 219

转载 Pulsar与Rocketmq、Kafka、Inlong-TubeMQ,谁才是消息中间件的王者?

导语 | Pulsar作为下一代消息中间件的典型代表,在设计和实现上面都具备很好的前瞻性,综合考量了业界现存的一些比较常用的、优秀的消息中间的架构设计、适用场景、运营中的问题等,如目前用的比较多的Kafka、Rocketmq、Inlong-TubeMQ等。本文仅从设计角度出发,说明下Pulsar与Kafka、Rocketmq及腾讯开源的Inlong-TubeMQ在实现上的几点区别和可能遇到的问题,供大家参考。一、云原生多租户设计(一)分级命名Pulsar原生支持多租户设计,非常适合作为云产品进行管理。

2022-01-13 11:32:02 405

原创 ShardingSphere归并引擎了解以及打散算法的应用

什么是归并?将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户端,称为结果归并。ShardingSphere 支持的结果归并从功能上分为遍历、排序、分组、分页和聚合 5 种类型,它们是组合而非互斥的关系。 从结构划分,可分为流式归并、内存归并和装饰者归并。流式归并和内存归并是互斥的,装饰者归并可以在流式归并和内存归并之上做进一步的处理。由于从数据库中返回的结果集是逐条返回的,并不需要将所有的数据一次性加载至内存中(这里指的是客户端内存,但是由于排序的需要,大量的数据仍然需要传

2022-01-05 14:52:39 848

原创 Feign源码之调用流程

我们已经通过Feign源码之FeignClientFactoryBean创建动态代理知道了Feign的动态代理是怎么生成的了,那么现在就可以来看看feign是怎么来调用的回归上篇文章的build方法public Feign build() { SynchronousMethodHandler.Factory synchronousMethodHandlerFactory = new SynchronousMethodHandler.Factory(client, retr

2022-01-04 14:43:37 735

原创 Feign源码之FeignClientFactoryBean创建动态代理

在上一篇文章《Feign源码之@EnableFeignClients》通过registerClientConfiguration我们知道了每一个client的configuration都是作为FeignClientSpecification的一个属性,真正被注入的类型是FeignClientSpecification。registerFeignClients方法注册的bean是FeignClientFactoryBean类型,还不是feign最终使用的动态代理对象。本文则一探究竟,这两个类到底有什么

2021-12-29 10:17:44 1294

原创 Feign源码之@EnableFeignClients

注解属性先看一下@EnableFeignClients有5个属性@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients { /** * Alias for the {@link #basePackages()} attribute. Allows for mo

2021-12-27 11:03:20 1937

原创 ribbon源码之服务列表过滤器以及ZoneAwareLoadBalancer

在LoadBalancer的学习中,我们最后还看到了filter的身影,接下来就在本文一探究竟为什么要了解?因为在运行过程中,并不是每台Server一直都持续可用,另外多台Server很有可能分部在不同的可用区zone,而很多时候我们希望是获取到同区域的机器以加速访问,这些都是交由由ServerListFilter来完成的。回顾一下代码:public void updateListOfServers() { List<T> servers = new ArrayList&

2021-12-19 10:07:37 699

原创 Ribbon源码之负载均衡器ILoadBalancer

在前面的文章中已经了解了ribbon的基本配置,各种组件的作用,负载均衡策略以及如何配合注册中心实现服务的注册发现,现在还遗留一个问题,服务的新增和更新ribbon到底是如何来支持的呢?ILoadBalancer定义软件负载均衡器操作接口,动态更新一组服务列表及根据指定算法从现有服务器列表中选择一个服务。public interface ILoadBalancer { /** * Initial list of servers. * This API also serves to add

2021-12-16 10:57:16 1537

原创 ribbon源码分析之七种负载均衡策略

源码版本为2.1.0RELEASE书接上文,接下来详细介绍LoadBalancerClientpublic interface LoadBalancerClient extends ServiceInstanceChooser { /** * Executes request using a ServiceInstance from the LoadBalancer for the specified * service. * @param serviceId The service I

2021-11-11 16:38:35 779

原创 ribbon源码分析之LoadBalancerAutoConfiguration

在上一博客ribbon源码分析之自定义配置、全局配置中我们已经初步了解了rebbon是如何自动配置如何进行自定义配置@Configuration@Conditional(RibbonAutoConfiguration.RibbonClassesConditions.class)@RibbonClients@AutoConfigureAfter(name = "org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration"

2021-11-08 14:16:02 326

空空如也

空空如也

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

TA关注的人

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