7层网络协议

1、物理层: 解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。 2、数据链路层: 在计算机网络中由于各种干扰的存在,物理链路是不可靠的。该层的主要功能就是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。 它的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。 3、网络层: 计算机网络中如果有多台计算机,怎么找到要发的那台?如果中间有多个节点,怎么选择路径?这就是路由要做的事。 该层的主要任务就是:通过路由选择算法,为报文(该层的数据单位,由上一层数据打包而来)通过通信子网选择最适当的路径。这一层定义的是IP地址,通过IP地址寻址,所以产生了IP协议。 4、传输层:
3 min read

Zookeeper 集群搭建

部署环境 操作系统 Debian 11.5.0 运行环境 OpenJDK-1.8.0_332 64-Bit Server VM Zookeeper版本:3.8.0 官方介绍 Zookeeper官方文档地址(下载的zip压缩包中\docs目录也自带文档):ZooKeeper: Because Coordinating Distributed Systems is a Zoo (apache.org) ZooKeeper 是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的基元,分布式应用程序可以基于这些基元来实现更高级别的同步、配置维护以及组和命名服务。它被设计为易于编程,并使用根据文件系统熟悉的目录树结构设置样式的数据模型。它以 Java 运行,并具有 Java 和 C 的绑定。 ZooKeeper 的实施非常重视高性能、高可用性、
11 min read

K3S 集群搭建

最近学习了K8S集群的部署,期间使用了很多的部署方式,例如官方给出的 kubeadm [https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/] 工具,青云的KK工具一键部署,也有github上开源免费或收费的一键部署工具,都尝试过,但最后选择了K3S-up [https://github.com/alexellis/k3sup] 来进行集群的部署。 相对于K8S来说,K3S系统容器数量少,轻量级,并且默认使用 containerd 作为容器运行时,内部的 ingress 使用的是 go 语言开发的 traefik,集成了SQLite 代替 Etcd,但在多个master节点中最好使用 Etcd 组件,来保证数据一致性,从而可以HA。 本次搭建选用阿里云6台共享性服务器。 3台master(2核4g) 3台worker(2核4g) 并搭建
3 min read

Jenkins自动化发布

前言 记录一下最近配置Jenkins的发布流程的部分步骤 整体流程:使用 Jenkins 进行线上发布并打包docker镜像上传至私有docker镜像仓库、并配置 docker login 线上推送/拉取镜像发布运行。 安装docker 拉取 Jenkins 镜像就不再描述,有很多现成的文章。 插件集成 配置并安装maven、jdk、git、nodeJs、docker等基本组件 安装对应各种支持插件、如gitlab。 nodejs 插件前端发布使用 连接远程服务端并执行命令插件 创建流水线任务 创建任务、并配置任务各个环节执行命令与使用组件  首先配置拉取git库地址与项目代码  后续替换源码中的环境值、如dev环境替换为pro nacos 连接地址与命令空间等  我使用的是最简单的sed -i 命令,该命令可以匹配正则表达式从而替换文本字符串。 资源打包与推送    使用maven 进行jdk build,构建项目jar包  打包完成之后使用shell命令把target包下的jar包cp到对应docker-compose文件下,此处需要提前写好d
3 min read

Java 逻辑引擎的构思

在工作中多年之后,深知设计模式的重要性,设计模式的合理使用可以让我们复杂的业务逻辑实现得更加的灵活,更好的支持多态性,易扩展,易维护等好处。 那么可不可以设计一款专门为后端java开发人员量身定制一款本身就具备了设计模式的UI逻辑引擎。开发人员只需要进行逻辑组件的组合,然后再双击组件书写SQL或JAVA代码,把组件的成员变量进行传递,并最终入库。 原理类似于目前的kettle工具。 如果有这样的逻辑引擎我们java开发势必能够大幅度减少工作量。 其中的灵感来至于我在工作中使用的,工厂模式,代理模式,策略模式,装饰模式与SPI构思思想组合而成的。 通过UI组件生成的配置文件,告诉代理策略类,调用其中对应组件逻辑单元.class文件。在系统启动时加载所有的逻辑策略,确保spring bean都可以正常加载入内存。 后续执行全部通过代理策略类进行逻辑处理。组装每一个单独的bean,从而完成一个复杂的业务逻辑。 这样的的实现也符合单一职责原则与开闭原则。 可能在目前市场上对应的项目就是低代码平台或者零代码平台了吧。
2 min read

Kettle工具使用

最近使用了Kettle这款ETL工具、对于多数据源进行数据之间的同步,迁移,转换,修正等功能进行了解与使用。 Kettle-水壶、顾名思义就是把各种数据源中的表数据都当做水流、从多个水流汇总、分流、解析的工具。它是一款开源的数据集成工具,它提供了丰富的数据处理功能,包括数据抽取、转换和加载(ETL)等。Kettle的核心是一个基于图形化界面的设计工具,用户可以通过简单的拖拽和连接操作来构建数据处理流程。Kettle还提供了强大的数据处理引擎,支持多线程和分布式处理,可以高效地处理大规模数据。同时,Kettle还支持多种数据来源和目标,包括关系型数据库、文件、Web服务等,可以方便地与各种数据源进行集成。Kettle还提供了丰富的插件机制,用户可以自定义开发插件,扩展Kettle的功能。总之,Kettle是一款功能强大、易用性好、可扩展性强的数据集成工具,广泛应用于数据仓库、商业智能、数据分析等领域。 无需任何编程、只需要手动拖动配置组件。即可完成复杂的数据处理功能。Kettle对于CDC层面来说,是基于查询的方式进行数据的读取与转换,适合一次性的数据迁移与转换。不能用于实时性要求较
3 min read

IntelliJ IDEA 2020 JRebel破解

IDEA 安装好最新版的JRebel之后。 点击激活页面 选择在线服务器授权激活。 输入服务器授权URL地址 URL地址为:https://jrebel.qekang.com/ [https://jrebel.qekang.com/5d45985a-26e1-4172-95ad-e75e551605a2]{GUID} 其中的GUID需要生成(生成地址): Generate GUIDs onlineGuidGen - webbased tool for generating GUIDs. [https://www.guidgen.com/]进入网站后生成GUID之后填写入URL地址中。 勾选同意协议,点击激活。 至此JRebel破解成功。
1 min read

MySQL 事物死锁解析

在使用mysql数据库中,随着我们业务与功能模块的增加、数据库的事物数量会随之上升。在开发业务功能的场景中我们会经常开启事物操作数据,或者开启分布式全局事物操作数据时、事物过多,在并发进行的场景中往往会有几率产生事物死锁问题。 那么我们来分析一下事物死锁产生的原因: 两个 session 连接:一个session持有T1事物,另外一个session持有T2事物。 1.T1事物修改rows1 2.T2事物修改rows2 3.T2事物修改rows1 4.T2等待T1释放rows1的x锁 5.T1事物修改Rows2 6.T1等待T2释放rows2的x锁 7.相互等待死锁 死锁在没有外力的干扰下,程序本身无力解决此问题。 必须借助人为或者另外的守护线程来解决此死锁问题。 解决死锁的方法也很简单:释放其中一个事物,让其回滚即可。 但回滚有一个问题,回滚哪个事物更合理,mysql采用的是根据undo log 中谁的条数更多,谁的权重越大,则舍弃权重更小的事物进行回滚,可以更好解决事物死锁。让其回滚的数据量尽量减少,以减少服务的性能牺牲。 系统中任何一个事务发生死锁的概率
3 min read

开发IDEA插件记录

之前一直在使用一款插件叫 mybatis log plugin,它里面的 sql log 参数补全这个功能我比较喜欢,之前低版本好像并没有进行收费,但高版本之后它开始收费了。于是我打算自己开发一个类似的功能插件,取名叫 mybatis log analysis , 1.0.0版本的话首先会完成sql log 解析并自动参数补全,sql美化等简单功能。 之后待时间充裕之后将会把其他的使用功能也开发出来,如xml java 链接跳转,一键生成 controller,service,entity,mapper,xml等功能点。 目前已经开发完成1.0.0版本 并提交到了 IDEA PLUGIN 库中。 在开发插件的时候,简单的功能实现起来很简单, 但想要实现比较复杂的功能就必须要对IDEA 提供的API 等方法有个比较深层次的了解,可是我在官方插件文档上并没有找到比较完善的API 文档。只有一些官方给出的demo代码。这样的话就不得不花点时间去看demo代码并阅读理解才行。感觉会将是一个不太友好的学习曲线。 贴上已经开发出来的插件地址:https:
1 min read

分布式锁与 Spring 事物管理顺序问题

这个是网上的网友提问,我给他推理并解决了他的问题。故此记录一下 。 他在使用zookeeper的临时顺序节点分布式锁来修改mysql中的数据值,此功能类似于售票机制,高并发下,要求售票数量保持一致。不可以数量多或少。 使用zookeeper的临时顺序节点分布式锁的时候,他锁住service层时,执行完整个service方法时,锁释放,但此时方式上标注的spring 管理的声明式事物却还未提交。这样的场景在并发情况下会导致数据问题。 理所当然他的数据库中数据会出现异常情况。100个线程同时执行1次一次拿1张,100张票应该为剩余0,而他的结果却并不是0,没有达到预期值。 原理是:第一个线程执行update方法结束之后,但由于事物还未提交完成。分布式锁却已经先一步释放,下一个线程执行此方法时 select 获取的还是update之前的脏读数据。导致数据出现问题。因为spring声明式事物@Transactional(rollbackFor = Exception.class) 是基于aop,方法执行完成之后的再执行的环绕通知,但环绕通知提交事务时,zookeeper的锁却已经释放
2 min read

随心笔记

技术无止境 创新不停驻