自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

后厂村老司机

不踩刹车

  • 博客(78)
  • 收藏
  • 关注

原创 记一次kubernetes中springboot服务pod oom问题排解

背景我们的springboot项目是通过k8s部署的,我们使用了G1垃圾回收器作为jvm的垃圾回收器,同时也配置了如下的各种应对jvm oom崩溃时的参数;在服务上线的一周左右时间,我们发现这个服务出现了oom重启,于是开启了我漫长的问题追踪过程;-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitiatingHeapOccupancyPercent=4...

2024-06-21 18:14:16 623 1

原创 记一次springboot项目k8s pod异常oom问题解决

背景我们的springboot项目是通过k8s部署的,我们使用了G1垃圾回收器作为jvm的垃圾回收器,同时也配置了如下的各种应对jvm oom崩溃时的参数;在服务上线的一周左右时间,我们发现这个服务出现了oom重启,于是开启了我漫长的问题追踪过程;-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitiatingHeapOccupancyPercent=4...

2024-06-21 18:03:45 1177

原创 DDD告诉而非询问原则(TellDontAsk)

TellDontAsk前言之前关于实体和值对象的文章中有提过迪米特发则以及告诉而非询问原则。偏向于值对象的设计方法,今天参考马丁福勒的文章https://martinfowler.com/bliki/TellDontAsk.html 了解下广义的告诉而非询问原则。真是遗憾没有早点知道这些大拿!原则概述Rather than asking an object for data an...

2022-09-15 15:38:44 216

原创 pinpoint 2.3.3离线部署

前言参考官方文档:https://pinpoint-apm.gitbook.io/pinpoint/getting-started/installation#3-pinpoint-collector物料在网上下载,主要是以下物料(我的云盘里也有,不过简书不让发!)hbase (负责pinpoint的数据存储,hbase-create.hbase 是pinpoint的初始化语句)pinpo...

2022-07-27 11:38:25 391

原创 Redis配置Kryo序列化和Snappy压缩

前言redis自带的StringSerializer性能相对较差,redis官方推荐kryo来提高序列化和反序列化速度,推荐snappy来节约redis内存和网络带宽,在springboot中可以通过配置快速实现这个功能maven配置<dependency> <groupId>com.esotericsoftware</groupId&g...

2022-07-22 11:28:44 535

原创 DDD如何写出代码白话文

https://www.info.ucl.ac.be/~pvr/PrincipleOfLeastExpressiveness.pdf前言上面的链接就是本篇博客的主题,最小表达力原则。之前有看过很多代码设计相关的书籍,比如《重构》、《代码整洁之道》并且也切实遵循了这些规范,最近也亲身实践了DDD领域驱动设计,总是恍惚之间觉得这些个设计之间有一些共通性,但是也说不清楚到底是什么。阅读了上边这篇论文...

2021-10-30 13:49:23 394

原创 DDD落地过程中关于领域事件的设计

前言领域事件是领域驱动设计中的重中之重,事件风暴的时候确认的领域事件可以直接应用在我们的代码设计中,但是领域事件在哪里发布、领域事件的应该是自己写还是直接利用spring的event却是一个值得思考的问题。下面分享下我们在设计过程中的思考。一、领域事件技术选型最开始的时候我们参考了弗农的设计方式,使用threadLocal的方式发布事件和处理事件,但是这种设计方式不适合生产,因为订阅者和发...

2021-09-27 11:13:58 434

原创 DDD落地过程中区分领域服务于应用服务

前言首先看下领域驱动设计中对应用层和领域层的解释:image.png从解释中我们可以看出,应用层的任务是与其他系统应用层合作、为领域层进行协调,实际上还包括了翻译等工作,具体工作可以参考一下我的上一篇博客: https://www.jianshu.com/p/e833fe5544c3领域服务的主要职责是表达业务概念、业务状态、业务规则。理论看起来终归是理论,落地的时候实际上两者没...

2021-09-25 14:30:52 622

原创 DDD中关于应用服务层建设的思考

前言应用服务层是Domain层的直接消费者,同时也是外部想要调用领域层的门面。应用服务内部包含了翻译外部数据到领域对象的逻辑、为领域服务准备领域对象的逻辑、调用领域服务或者领域对象完成业务逻辑的编排逻辑、翻译领域对象到外部数据的逻辑一、应用服务如何做好翻译工作1、层与层之间的参数传递我们的服务中interface是领域层的直接消费者,interface层会从外部接收数据,然后调用appl...

2021-09-25 13:52:49 418

原创 DDD结合整洁架构落地实践

一、整洁架构分层整洁架构分层如图所示,从内到外分别为实体->用例->接口适配器->框架与驱动程序。其中实体层和用例层包含业务逻辑、接口适配器层是翻译层,负责把外部数据翻译成业务层能够识别的结构、框架与驱动程序负责各种IO。image.png二、DDD分层六边形分层1、我们最初落地的DDD分层架构如下图所示,这种分层结构类似于六边形架构,本质上把代码分成了2层,...

2021-09-19 22:10:52 1243

原创 DDD落地过程中关于聚合的思考

前言聚合是由实体和值对象组成的一个整体概念,聚合根就是组成这个聚合的一个实体。聚合设计原则参照沃恩弗农:1、在聚合边界内保护业务规则不变性比如业务规则是 a=b+c,那么在聚合内对a、b、c操作完成到最终持久化的过程中a=b+c这个业务规则是不可改变的。我们设计的聚合内的任何方法都不能破坏这个业务规则2、设计小聚合每个聚合的内存占用空间和事务包含的范围应该尽量小,小聚合节约内存、加载...

2021-09-18 15:01:59 191

原创 DDD落地过程中关于值对象建模的思考

前言值对象是状态不可变的、可整体替换的、用于度量和描述领域中某件东西的对象。在落地DDD过程中我们常常遇到一个概念到底是建模成实体好还是建模成值对象好这种问题,其实各DDD大神早已经给出了答案,prefer value object to entity!值对象建模0、值对象不包含改变属性的方法值对象里没有改变自身状态的方法,只有查询方法,根据迪米特法则和告诉而非询问原则决定查询方法是pu...

2021-09-18 10:18:11 202

原创 DDD如何区分实体和值对象

前言实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验。实体实体是指在你这个领域存在的一个对象,多数时候这个对象是一个现实世界对象的抽象,比如一个Person、一个User、一个Book、一个Order,就是人、用户、书、订单抽象出来的对象。极少数时候在现实世界中没有这种映射,但无论现实世...

2021-09-17 20:18:36 697

原创 DDD落地过程中关于领域服务的思考

前言DDD架构分层由内到外主要分为domain层->application层->infrastructure层->interface层其中领域服务属于domain层、应用服务属于application层,领域服务的实现和application的实现都在infrastructure层。应用服务没有领域逻辑,仅仅是对领域层case的编排,比如先调a再调b,这种case流领域服...

2021-09-17 13:16:22 433

原创 DDD落地过程中关于限界上下文的思考

前言DDD分为战略设计和战术设计,战略设计就是划分子域和限界上下文的过程。领域划分为子域的通用划分形式是把领域划分为 核心子域、支撑子域、通用子域。我们在落地过程中常常会很容易划分出核心子域,因为核心子域是领域赚钱的核心逻辑嘛,一般设计mvp的时候mvp就是核心子域。但是领域划分出核心子域、支撑子域和通用子域之后就算划分完成了吗?子域和限界上下文实际上子域也是领域,一个公司不同部门关注的是一...

2021-09-12 16:35:25 314

原创 DAD落地过程中关于CQRS的思考

前言CQRS在领域驱动设计中非常常见,也非常好用,简单来说就是对领域模型的修改和对领域生成数据的读取职责是相互分离的。CQRS分类CQRS在落地过程中分为几种第一种是领域模型通过仓库的具体实现把数据保存在数据库中,这个是由写模型完成的。读模型承担的是直接读取数据库用于前端或者其他端的报表数据查询,绕过仓库直接查询数据库。可见,第一种方式是读和写在存储层上层分离,但共用存储第二种是写模型和读模型在存...

2021-09-12 10:29:37 205

原创 DDD可落地的架构长什么样

前言DDD可落地的架构长什么样都行,只要符合DDD的设计思想即可,但是不管怎样落地,分层结构中总会有Domain层。下面是我们落地的架构策略中心-第 3 页.pngDDD可落地架构分层我们的架构参照了洋葱架构模型,洋葱架构模型依赖方向由内到外,即外边的层依赖里面的层。Domain层:洋葱最里层,本层包含核心的业务逻辑,这套逻辑一般和某个业务核心赚钱逻辑直接相关,并且改变频率最低...

2021-09-11 13:58:58 313

原创 DDD到底什么是业务逻辑

前言每天CRUD的你了解什么是业务逻辑吗?我们常常说后端程序员的工作就写业务逻辑,那到底什么是业务逻辑呢?业务逻辑wiki百科中定义了业务逻辑,业务逻辑就是领域逻辑,是对现实世界中的业务规则的编码,业务逻辑决定了数据的创建、存储和变更。In computer software, business logic or domain logic is the part of the progr...

2021-09-11 13:43:27 420

原创 DDD在产品设计阶段的实践

前言以前,在产品设计阶段后端研发人员参与感较低,多半是PM主导这个过程,当PM产出产品设计文档与需求的时候后端研发人员一般脑子里浮现的是解决当前这个问题需要构建哪些表、表应该包含哪些字段、表与表之间的关系是什么样的,甚至会考虑到哪些数据放到redis里,哪些放到内存里,等这些技术细节。然后,依据这些技术细节来判断这个需求能不能实现、好不好实现、合不合理。那么实践DDD在这方面有什么变化吗?DD...

2021-09-10 21:02:25 229

原创 DDD落地过程中有关DTO的思考

DDD中哪些对象是DTO?DTO-Data Transfer Object,数据传输对象,用作数据传输。在落地DDD的实践中,由于采用CQRS模式,所以会有大量的Command对象、Query对象以及返回给前端用的ViewModel对象,和其他系统交互的DTO对象,这些对象都应该归类为DTO对象。DTO对象在哪层使用?我们在落地DDD的时候项目分层是interface层(与外部交互)、App...

2021-09-10 09:50:11 1087

原创 为什么要DDD

DDD的原因一、传统架构的劣势1、传统controller、service、dao三层架构的业务逻辑分散到多个地方、如一部分逻辑在sql中、一部分在service中、甚至有的直接在controller中,导致更换开发人员后代码不易维护2、传统三层架构面向数据库编程,本质上是数据库的事务脚本,service里充斥着过程代码、胶水代码,多人维护过程中会不断修改、添加service中的逻辑,se...

2021-09-08 11:21:05 304

原创 InnoDB多版本并发控制MVCC

前言InnoDB维护旧版本数据来支持事务并发和回滚。旧版本信息会存储在系统表空间或者undo表空间里,以回滚段(rollback segment)的数据结构存储。当事务需要回滚的时候就会使用到这些回滚段来回滚,同时一致性读的时候也会用到这些回滚段。注:1、系统表空间:system tablespace,是InnoDB存储数据的空间,存储了doublewrite buffer、change ...

2021-06-30 14:55:26 109

原创 InnoDB中不同SQL加锁类型

前言上一篇博客中我们分析了事务死锁过程,给出的结论是其中delete操作和insert操作分别加了gap lock和insert intention lock,但具体什么sql会加什么锁呢?我们本篇来分析下不同SQL加锁类型1、检索的时候使用辅助索引会给索引到的相关行设置排他锁,同时InnoDB会给关联的聚簇索引相关行设置排他锁2、如果检索时没有使用索引,那么InnoDB会对表里的每一行加...

2021-06-30 10:58:59 107

原创 InnoDB中的锁

前言下午遇到一个mysql死锁的问题,意外发现InnoDB中有一种叫做insert intention lock(插入意向锁)的锁类型。好奇心驱使下搜了很多博客,博客下边的评论总是充满质疑。于是查阅了官方文档 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 针对官方文档做了一些总结,在此做一个记录。InnoDB中的锁类...

2021-06-25 18:06:36 80

原创 FTPS容器服务-快速构建

前言FTP搭建是一个挺繁琐的过程,这边提供一个镜像配置文件(可自行更改)listen_port=8881listen_ipv6=YESanonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESuse_localtime=YESxferlog_enable=YES...

2020-06-23 16:31:51 264

原创 架构即未来

1,n加1设计,无论何时考虑冗余,满足高可用2,功能开关设计,功能要有开关随时服务降级3,监控设计,探活,服务性能监控等4,无状态服务,避免负载均衡复杂和扩展性复杂5,水平扩展优于垂直扩展6,只考虑成熟技术7,只买商品化硬件8,多两步思考,避免不断重构9,使用异步,除非非常必要使用同步10,考虑多活,不要被单数据中心禁锢11,考虑自动化,包括部署,测试,避免犯错12,考虑故障隔离,避免连锁反应,如...

2020-05-31 12:56:01 130

原创 RSocket背压机制-Lease(三)

前言背压,响应式编程中的概念。意思是当服务端资源不足的时候能够通知客户端请求慢一点。在RSocket中使用Lease机制实现,Lease的构造方法里有两个参数,ttl和nums-of-requests,两个参数通知客户端在接下来的ttl时间里服务端最多可以处理nums-of-requests个请求。机制详解以下机制都是需要我们自己处理的业务逻辑,RSocket底层机制只定义了leas...

2020-05-31 11:00:45 924

原创 RSocket协议初识-Java中使用(二)

前言在RSocket协议初识(一)中我们使用SpringBoot创建了简单的RSocket通讯模型,本篇我们将介绍纯Java使用Demo。本文代码参照官网的rsocket-java/examplesdemo的git地址:https://github.com/KouLouYiMaSi/rsocketdemoBefore创建普通maven项目引入必要依赖如下 <de...

2020-05-28 11:42:59 1371

原创 RSocket协议初识(一)

前言前几天无聊翻SpringBoot官方文档,无意中发现文档中增加了一个章节叫RSocket协议的鬼东西,遂研究了一下。RSocket是什么?RSocket是一种二进制字节流传输协议,位于OSI模型中的5~6层,底层可以依赖TCP、WebSocket、Aeron协议。RSocket设计目标是什么?1、支持对象传输,包括request\response、request\stream、fir...

2020-05-27 22:03:13 2340 1

原创 Mysql Explain解析

overview.png

2020-04-01 17:42:34 138

原创 你的Redis集群真的是高可用的吗?

背景我们在客户机房部署的的Redis是3主3从的集群,共占用3台服务器(100,101,102),没有使用哨兵系统,昨天客户机房按照机器轮着停机维护,先停了100维护,再停101维护,停100的时候还没啥问题,在100恢复之后再停101的时候我们的后台服务突然报could not get resource from jedis poo。硬着脑门排查,写下这篇博客记录。原理3...

2020-03-14 18:34:51 265

原创 实战Kafka之异地双活--MirrorMaker1.0

前言异地灾备可以防止一个机房出现灾难而导致整个系统无法提供服务的问题。异地双活在异地灾备的基础上减少了数据的冗余,并且提高了对数据双向同步及同步实时性的要求。Kafka作为在双活中扮演了很重要的角色,一方面是两个区域的正常业务的消息数据分发、另一方面则是elasticsearch等中间件集群的双活方案有时需要依赖kafka的双活。那么在保证实时性的前提下做好kafka的双活呢...

2019-11-27 11:53:40 1788 4

原创 Mysql InnoDB 锁机制

InnoDB 锁机制image.png重要概念当前读:当前读是指执行增删改的读,当前读会对数据加Next Key Lock快照读:快照读是正常select的时候执行读快照,在Repeatable Read隔离级别下会生成一个事务开始时候的快照。Read Commited隔离级别下每次读都会生成一个新的快照 ...

2019-07-29 18:50:07 100

原创 Mysql InnoDB中的索引

InnoDB索引image.png知识点InnoDB中使用B+树和哈希实现索引,其中后者不受开发人员控制B+树就是多叉树,叶子结点是一串链表,这样方便range查询和磁盘IO聚集索引是指叶子节点链表里存了行记录的所在页,这些不是一直都在内存的,也是按照LRU那一套从磁盘IO的辅助索引叶子节点存储的是主键,查找的时候需要先查辅助索引再查聚集索引,如果范围查找...

2019-07-26 15:02:39 145

原创 Mysql InnoDB 表结构

InnoDB表结构image.png重要信息InnoDB中索引即数据,数据即索引上述的表结构式逻辑表结构,可能在内存也可能在磁盘

2019-07-25 17:12:28 248

原创 Mysql InnoDB中的文件

InnoDB中的文件image.pngInnoDB文件分类参数文件:调节mysql这台机器的日志文件:记录各种日志socket文件:套接字文件会存储起来pid文件:启动时的主进程会记录到文件里表结构文件:记录表的结构信息存储引擎文件:包括表空间和redo日志文件,redo文件和binlog之间区别在于redo只记录当前存储引擎的事务日志,binlog记...

2019-07-25 15:23:59 164

原创 Mysql InnoDB存储引擎初识

InnoDB 存储引擎结构image.pngInnoDB重要组成后台线程负责刷盘的Master线程负责读出写入磁盘的IO线程负责回收undo log的Purge线程为Master打辅助刷脏页的PageCleaner线程内存块缓存各种页的缓冲池,如包括插入缓冲缓存各种update insert操作然后合并多次IORedo log缓冲池额外缓冲池...

2019-07-25 09:49:44 136

原创 Mac安装DockerDeskTop和Kubernetes

前言window上安装docker的实践已经在https://www.jianshu.com/p/6b19d73c0178文章中讲述过了,本篇博文侧重于Mac下Docker的安装和Kubernetes安装,至于Kubernetes的重要性这里就不用过多阐述了。0、下载DockerDeskTophttps://hub.docker.com/ 进入该页面,可能需要注册,点击下...

2019-05-25 13:19:00 255

原创 Redis的缓存淘汰策略LRU与LFU

前言Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(一般这个值可以配置)使用的淘汰策略;而后者是通过定期删除+惰性删除两者结合的方式进行内存淘汰的。这里参照官方文档的解释重新叙述一遍过期删除策略:当某个key被设置了过期时间之后,客户端每次对该key的访问(读写)都会事先检测该key是否过期,如果过期就直接删除;但有一...

2018-12-15 12:25:39 485

原创 SpringBoot利用Redis管理分布式Session

前言由于Http连接是无状态的,所以使用Tomcat做服务器的时候Tomcat内部会维护一个叫做Session的东东用来保存客户端的状态,一般情况下每个客户端都有一个cookie里面保存着叫jsessionid的cookie,每次访问tomcat的时候都会携带上,Tomcat可以根据这个jsessionid找到对应的session。就像你去超市买东西,门口的储物柜可以视作一个se...

2018-12-11 17:45:21 188

空空如也

空空如也

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

TA关注的人

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