自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringMVC异常处理

背景我们的代码中,总是会抛出各种异常,例如HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException,或者是自己定义的BusinessException。这些异常,如果我们不将它们try catch进行处理,就会导致http的状态码变成非20x,并返回SpringMvc默认的异常信息格式。场景1,业务部门对返回值进行了统一的规定,例如:{"code":200, "message": "success", ".

2022-04-29 18:02:55 2698

原创 RabbitMQ知识整理

RabbitMq基础概念Producer:生产者,投递消息的一方Consumer:消费者,接收消息的一方Broker:消息中间件的服务节点,对于RabbitMq而言,一个Broker可以看作一个RabbitMq服务节点Queue:队列,RabbitMq的内部对象,用于存储消息。这一点与Kafka相反,Kafka将消息存储在topic这个逻辑层面,而对应的队列逻辑只是topic实际存储文件中的位移标识。 生产者生产消息最终投递到队列...

2021-12-29 18:24:19 2643

原创 闹钟服务设计

背景购买火车票、淘宝购物....这些场景,在支付的时候,都涉及了订单过期自动取消的场景(30分钟未支付,订单自动取消)。 这就像,创建订单的时候,定了一个30分钟后的闹钟;如果30分钟内支付了,则把闹钟取消;如果超过30分钟未支付,则闹钟触发,取消未支付的订单。 除了支付,在其他一些场景,也会有一次性定时任务的需求,如果一些不太重要的push提醒。 改服务就是一个支持这些定时场景的“闹钟服务”。可选方案延时任务常见的方案:Redis Zset,RabbitMq延迟队列、timeWheel

2021-12-29 18:05:43 1643

原创 分片任务组件

背景将一个大任务划分成几个小任务,由几个实例分别运行这些小任务,可以提高任务的执行效率。举例:clock.ip.fdd闹钟服务,需要将闹钟数据从mysql表读取到内存中,多个实例的情况下,是用分布式锁来解决读取数据的冲突。这样是能解决问题,但是读取数据到内存中就变成一个串行的操作,当某一刻积累了大量的闹钟数据,可能会出现加载不及时导致闹钟延迟的情况。如果把存储闹钟的表拆分成8个表,如果2个实例,则每个实例负责读取4个表的数据;如果4个实例,则每个实例负责读取2个表的数据。多个实例之间

2021-12-27 15:43:39 1266

原创 JAVA开发的GO学习笔记

一、需要注意的点1、没有public protect private这种可访问范围的关键字,而是使用大小写来代替,首字符大写,则对包外可见;首字母小写,只有包内可见。2、每行的结尾不强制要求加“;”,也建议不要加,除非在同一行上写多行的代码,才需要。3、多重变量定义方式:var a int = 1 a := 14、自动类型推测,a := "test",能自动推测出变量a的类型是string。5、支持指针类型(跟C语言的指针差不多)。6、有特殊的channel类

2021-12-27 15:00:51 516

原创 Mysql知识整理

索引Mysql索引知识锁锁种类全局锁全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock。当需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。但是让整个库都只读,可能出现以下问题:如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆 如果在从库上备份,那么在备份期间

2021-12-27 14:23:55 390

原创 Kubernetes知识整理

架构角色MasterKubernetes中的Master是集群的控制节点,每个Kubernetes集群里都需要有一个Master节点来负责整个集群的管理和控制。Master节点上运行着以下一组关键进程:Kubernetes API Server(kube-apiserver):提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。 Kubernetes Controller Manager(k.

2021-12-27 14:05:36 891

原创 Kafka Raft知识整理

背景Kafka2.8 之后,移除了Zookeeper,而使用了自己研发的Kafka Raft。为什么移除Zookeeper?原来Zookeeper在Kafka中承担了Controller选举、Broker注册、TopicPartition注册和选举、Consumer/Producer元数据管理和负载均衡等。即承担了各种元数据的保存和各种选举。而Zookeeper并“不快”,集群规模大了之后,很容易成为集群的性能瓶颈。Kafka作为一个消息中间件,还依赖额外的一个协调系统,而不能实现自

2021-12-27 13:53:22 1324

原创 Pulsar知识整理

关键特性 Pulsar 的单个实例原生支持多个集群,可跨机房在集群间无缝地完成消息复制。 极低的发布延迟和端到端延迟。 可无缝扩展到超过一百万个 topic。 简单的客户端 API,支持 Java、Go、Python 和 C++。 支持多种 topic 订阅模式(独占订阅、共享订阅、故障转移订阅)。 通过 Apache BookKeeper 提供的持久化消息存储机制保证消息传递 。 基于 Pulsar Functions 的 serverless connector 框架 Pu

2021-11-25 17:49:57 3383

原创 Kafka Raft

背景Kafka2.8 之后,移除了Zookeeper,而使用了自己研发的Kafka Raft。为什么移除Zookeeper?原来Zookeeper在Kafka中承担了Controller选举、Broker注册、TopicPartition注册和选举、Consumer/Producer元数据管理和负载均衡等。即承担了各种元数据的保存和各种选举。而Zookeeper并“不快”,集群规模大了之后,很容易成为集群的性能瓶颈。Kafka作为一个消息中间件,还依赖额外的一个协调系统,而不能实现自

2021-11-25 17:42:29 3258

原创 Kafka知识整理

基本概念Kafka主要扮演三大角色:消息系统:Kafka和传统的消息中间件一样,具备解耦、冗余存储、流量削峰、缓冲、异步通信、拓展性、可恢复性等功能。Kafka还提供了独特的消息顺序性回消息回溯功能。 存储系统:Kafka把消息持久化到磁盘,相对其他基于内存的系统而言,丢失数据的风险更低。 流式处理平台:Kafka提供了一个完整的流失处理类库,比如窗口、连接、变换和聚合等各类操作。结构一个典型的Kafka体系结构包括Producer、Broker、Consumer和Zookeep.

2021-04-28 15:51:38 265 1

原创 Redis知识整理

内部数据结构动态字符串(SDS)redis只有在字面量的时候使用c语言的字符串,大部分都是用动态字符串,采用了字节数组的数据接口。和c字符串比起来有以下优点:1、常数复杂度获取字符串的长度C语言获取字符串长度时间复杂度O(n),SDS时间复杂度O(1),因为可以直接读取len属性2、杜绝了缓冲区的溢出C语言字符串拼接使用strcat(char *dest,char *source)函数,该函数不会检查dest数组长度是否足够,存在缓冲区溢出的风险,而SDS在执行append.

2021-04-19 10:55:03 370

原创 Elasticsearch知识整理

一、基本概念和理念1、索引结构ES是面向文档的。各种文本内容以文档的形式存储到ES中,一般使用JSON作为文档的序列化格式。在存储结构上,由_index、_type和_id唯一标识一个文档。_index指向一个或多个物理分片的逻辑命令空间。_type类型用于区分同一个集合中的不同细分,在不同的细分中,数据的整体模式是相同或相似的,不适合完全不同的类型数据。_id文档标记符由系统自动生成或使用者提供。不应该将_index理解成RDBMS中的数据库,_type理解成表。在ES 6.x

2021-04-18 22:22:54 584

原创 Docker知识整理

《深入浅出Docker》这本书的博客版本,地址为:http://c.biancheng.net/view/3118.html里面讲的内容比较多,对Docker比较有兴趣的同学可以看看。英文好的,可以看看官方文档:https://docs.docker.com/引擎结构Docker daemon功能包括镜像管理、镜像构建、REST API、身份验证、安全、核心网络以及编排。containerd最初被设计为轻量级的小型工具,仅用于容器的生命周期管理。然而,随着时间的推..

2021-04-13 17:27:29 476

原创 dubbo的SPI拓展顺序问题

背景在项目中定义了3个filter,都是使用的@Activate注解,并指定了顺序:ProviderCatFilter:主要用来打印日志 & 触发cat告警ExceptionFilter:如果有异常,将指定的异常类型转成错误码,不抛异常ValidationFilter:对参数进行校验,参数不合法则抛出参数异常按照定义的order,顺序应该是这样:ProviderCatFilter -> ExceptionFilter -> ValidationFilter。如果真按照这

2021-04-13 16:45:26 341

原创 alibaba版本的dubbo在override机制上的bug

背景在之前尝试做dubbo的灰度发布方案《dubbo灰度发布》。在实现的过程中,发现当provider指定了group或者version,而consumer使用*号来匹配所有group或version的时候,alibaba版本和apache版本的dubbo的行为不一样。apache版本是运行正常,但是alibaba版本的consumer却会出现group和version被覆盖的问题。问题原因当consumer监听到configurators目录下的变化,首先需要判断对应的连接是否它关心的:大

2021-04-13 12:46:39 322 1

原创 ZooKeeper知识整理

基础数据模型ZooKeeper数据模型的每个节点称之为ZNode,节点可以保存数据,也可以挂载子节点,形成一个树形结构。节点类型持久节点:被创建后一直存在,需要通过delete删除临时节点:生命周期与客户端会话绑定,当客户端会话失效,节点自动清除,也可以通过delete主动删除,只能作为叶子节点。顺序节点:一个顺序节点被分配唯一的单调递增的整数。当创建有顺序点,一个序号会被追加到路径之后。持久/临时&顺序可以组合,所以节点类型一共有四种:持久、临时、持久顺序和临时顺序。节点版本每

2021-03-29 18:27:49 339

转载 52条SQL语句性能优化策略

SQL语句性能优化1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE

2021-02-18 10:19:38 85

原创 Mysql索引知识整理

背景说道mysql,大家第一个想到的就是它的索引,基本也都知道索引的结构是B+Tree,但是并没有把它的结构和我们看到的原则关联起来。例如最左匹配原则,不要使用uuid作为主键,哪些查询条件无法使用索引…B+TreeB+Tree在这里就不做介绍了,直接上图:其实就是一个“多路平衡树”,底层叶子节点存储了行数据,叶子节点之间串联起来,形成一个链表。关于索引的介绍,可以看这篇文章《深入理解MySQL索引之B+Tree》,内容适合刚接触mysql索引的同学,少有的把MyISAM和InnoDB引擎都讲

2021-01-29 15:24:06 253

转载 Spring的Bean生命周期理解

  首先,在经历过很多次的面试之后,一直不能很好的叙述关于springbean的生命周期这个概念。今日对于springBean的生命周期进行一个总结。一、springBean的生命周期:  如下图所示:通过这张图能大致看懂spring的生命周期,详解:instantiate bean对象实例化 populate properties封装属性 如果Bean实现BeanNam...

2021-01-29 11:07:31 122

原创 dubbo灰度发布方案

背景目前我公司自己搭了一套发布系统,底层使用的是docker的swarm,实现了“灰度发布”功能。当开启发布灰度发布的时候,会独立启动一个容器,只允许指定百分比的流量进入到灰度容器中。这一套机制,是依靠在网关中对后端http服务实例做不同的权限实现的,只能对http服务生效。dubbo服务是直接跟注册中心zookeeper拿到所有服务提供者的地址,然后直连服务提供者,并不会经过网关。dubbo负载均衡dubbo的负载均衡机制,其实比我们想的要强大一点,以RandomLoadBalance随机负载均

2021-01-25 15:56:54 2488 4

原创 理解elasticsearch的match_phrase_prefix查询

参考资料:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase-prefix.html?utm_source=ld246.com#match-phrase-prefix-query-noteshttps://www.cnblogs.com/youngdeng/p/12868850.html

2020-12-30 13:46:23 8124 2

原创 elasticsearch常用请求

字段分词结果请求:GET http://host/{host}/host/{index}/type/{type}/type/{id}/_termvectors?fields=${fields_name}关键字分词结果请求:GET http://${host}/_analyze在body传关键字和对应的分词器:{“text”: [“12345”], “analyzer”: “ik_smart”}...

2020-12-30 12:37:17 113

原创 携程Apollo热发布机制分析

背景最近在使用apollo的时候,发现@Value注释的值,有部分能热更新,部分不能;对于ConfigurationProperties的配置类,完全不支持更新。所以想着了解一下apollo的热发布机制,看看是怎么实现的热发布,什么情况热发布会失效。官方介绍Apollo配置中心设计从上面三个图可以看出:热更新,就是基于http长连接,当在apollo管理界面上修改配置时,会通知客户端有变更,然后客户端再去拉取最新的配置。官方文档只是介绍了一下热更新机制,但是对于客户端拿到最新的配置后,怎么做

2020-11-05 19:02:41 1802

原创 dubbo实现consumer从多个group中调用指定group的provider

背景在工作中,遇到这样的场景:有个es索引构建服务,需要从各个业务服务获取索引的信息,从而构建索引,业务服务都实现同一个接口——IndexInfoProvider,通过设置不同的group来达到区分的效果(group就是es索引名)。索引构建服务在内存维护了一个Map<String, IndexInfoProvider> providerMap,key是索引名——也就是provider的group,value是IndexInfoProvider服务的consumer。为了图方便,索引构建

2020-10-27 16:55:13 4864 2

原创 RabbitMQ实战指南——存储机制总结

背景之前了解过kafka和rocketMq的数据存储机制,知道在他们的存储机制上,支持消息的回溯消费、顺序消费,消息积压。而rabbitMq是不支持刚提到的三种特性,那rabbitMq的数据又是怎样存储的呢?持久层持久层是一个逻辑上的概念,包含了两部分:rabbit_queue_index(队列索引)和rabbit_msg_store(消息存储)。rabbit_queue_indexrabbit_queue_index负责维护存储的消息的信息,包含了存储地址、是否已经交付给消费者、消费者是否已经a

2020-09-30 16:38:56 2561 5

原创 dubbo将异常转换成RuntimeException原因分析——ExceptionFilter

问题开发过程中,发现服务提供者抛出了自定义的BusinessException,到了消费者这边,却变成了RuntimeException。客户端这边有BusinessException这个类,提供者抛出的也是这个类的异常,为什么会被转成RpcException呢?代码分析看ExceptionFilter的代码:重点就在圈起来的3个地方:1、有异常,而且接口不能是GenericService才需要判断是否需要转换成RuntimeException,不然直接返回result。2、如果是受检异常,

2020-08-19 12:57:09 1542

原创 @Reference(retries=0)依然会重试2次问题分析

问题使用@Reference 注解的时候,发现设置retries=0,还是会出现调用3次的情况,而不是我们期望的不重试。代码分析dubbo默认的集群方式是failover,看FailoverClusterInvoker的代码,重试次数在这部分代码: 从这部分代码可以看出来,次数是从url的retries参数拿到的,如果拿不到就会使用Constants.DEFAULT_RETRIES=2所以,如果@Reference没有配置retries,次数就会是2+1=3,即失败后还会重试2次。但为什

2020-08-17 10:01:47 1661 2

原创 dubbo的@Reference注解作用分析

目的看看dubbo是怎么给加了@Reference注解的属性注入invoker实例,为什么有时候加了@Reference注解的属性会是null。ReferenceAnnotationBeanPostProcessor后置处理看到这个名字,就很容易知道,是专门针对@Reference注解的后置处理...

2020-07-30 17:59:50 9514 1

原创 kafka为什么快,为什么吞吐量高

目的大家说到kafka,肯定就会想到“快”和“高吞吐量”,特别是吞吐量这一点,好像目标就没有超越kafka的。本文就是解释了kafka怎么做到“快”和“高吞吐量”。生产者...

2020-02-25 01:43:13 705

原创 rabbitMq可靠消费方案

项目地址可靠mq项目:reliable-mq支持消息事务消息发送、幂等消费、顺序消费和可靠消费问题采用自动ack的方式,如果处理方法未抛出异常,则自动ack消息;如方法抛出异常,则消息会被重新放回队列。如果处理方法没有catch异常,当代码有bug时,则消息会被不断消费,但是又消费不成功,不停打印异常日志,甚至导致日志文件将硬盘撑爆。为了避免这种情况,大家可能会在消费mq的业务代码最外...

2020-01-02 19:48:26 818

原创 rabbitMq顺序消费方案

项目地址可靠mq项目:reliable-mq支持消息事务消息发送、幂等消费、顺序消费和可靠消费前提顺序消费,依赖消息id,使用reliable-mq的DatabaseRabbitMqProduceClient类发送mq消息,支持指定消息id,如果不指定,则会使用java的UUID自动生成一个。DatabaseRabbitMqProduceClient类实现了RabbitMqProduce...

2020-01-02 15:50:36 8793 10

原创 rabbitMq幂等消费方案

项目地址可靠mq项目:reliable-mq支持消息事务消息发送、幂等消费、顺序消费和可靠消费前提幂等消费,依赖消息id,使用reliable-mq的DatabaseRabbitMqProduceClient类发送mq消息,支持指定消息id,如果不指定,则会使用java的UUID自动生成一个。问题假设有这样一个场景:用户发布一篇文章,就得给用户加5积分。有文章管理和积分管理两个独立的...

2020-01-02 12:05:10 1623 4

原创 rabbitMq事务消息方案

项目地址可靠mq项目:reliable-mq支持消息可靠发送、幂等消费、顺序消费和可靠消费问题一般发送mq的场景为:本地修改业务数据,数据修改成功,调用RabbitTemplate.send方法发送mq消息。类似下面的伪代码:public class DemoService() { public Demo doSomething() { // 1、在一个事务中完成数据库数据的变更...

2019-12-30 22:03:29 1688 1

原创 dynamic-datasource-spring-boot-starter读写分离分析

官网地址https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter简介主要的功能有:数据源分组,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。内置敏感参数加密和启动初始化表结构schema数据库database。提供对Druid,Mybatis-Plus,P6sy,Jndi的快速集成。简化Druid和...

2019-10-18 01:15:44 12813 1

原创 @RabbitListener起作用的原理

一、前言在spring中,定义rabbitMq的消费者可以相当方便,只需要在消息处理类或者类方法加上@RabbitListener注解,指定队列名称即可。如下代码:@Componentpublic class RabbitMqListener1 { @RabbitListener(queues = "queue1") public void consumer1(Message...

2019-09-08 15:20:34 21878 4

原创 SpringBoot的starter机制解析

一、前言在没有springBoot之前,我们新建一个项目,要做很多的事情,像配置一堆依赖,配置web.xml、数据库连接、视图解析等等。往往创建一个新项目,配置这些信息,都要花费大半天,也很容易出错,如加入的依赖有冲突或者漏掉某些依赖,导致项目启动失败。使用springBoot,大大简化了配置的难度,像pom文件中的依赖,直接继承自springBoot,还有各种starter可以引用。另外,s...

2019-08-10 23:57:40 742

原创 sharding-jdbc读写分离源码分析

在之前两篇文章《springBoot+mybatis数据库读写分离》和《对“springBoot+mybatis数据库读写分离”中两种方式的对比》两篇文章中,介绍了两种读写分离的实现方式和各自的优缺点,这篇文章讲一下用“sharding-jdbc”来实现读写分离sharding-jdbc简介sharding-jdbc是shardingsphere中的一个产品,实现客户端的分库分表和读写分离,而...

2019-07-25 21:40:50 1261

原创 对“springBoot+mybatis数据库读写分离”中两种方式的对比

方式一(配置两个SqlSessionFactory)方式二(配置动态数据源——AbstractRoutingDataSource)方式一优点为:简单!只要分好@Matser和@Slave的mapper,上层的代码跟未做读写分离前,没什么差别。当用manager层去掩盖掉底层的mapper差异,引用manager的调用方对读写分离无感。而“方式二 ”还需要在具体的方法上加上@TargetDa...

2019-06-04 11:51:03 479

原创 springBoot+mybatis数据库读写分离

当业务增长,单个数据库实例扛不住的时候,往往会给master节点配置多个slave节点,然后进行读写分离,主库负责数据的变更,从库负责数据的查询。这篇文章主要记录下自己遇到的两种读写分离方式。在实际的项目中,dao层往往使用的是mybatis,文章就以mybatis作为数据库访问,举例两种读写分离的方式。实现方式一(配置两个sqlSessionFactory)1.配置两个数据源packa...

2019-06-03 14:54:47 1578

空空如也

空空如也

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

TA关注的人

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