tanzhuo

tanzhuo

专研技术的程序员

CentOS 安装 Docker

随着目前容器技术的流行,学习如何安装docker也是至关重要的。 1、安装对应 yum 工具包 > sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 2、设置国内源地址,加快docker下载速度 > sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3、列出对应版本包 > yum list docker-ce --showduplicates | sort -r 4、安装对应版本docker > sudo yum install docker-ce- docker-ce-cli- containerd.io 例子:
1 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

神界:原罪2

七神的诞生: 绿维珑大陆中,近乎所有关于绿维珑诞生的书中都会讲述到七神与绿维珑的起源。虽然无人能够肯定其事实真伪,但却在各个种族中故老相传。传说在位面、世界和所有内在事物诞生之前,除了纯粹且未被利用的能量外什么也没有——那是被称为源力的创造生命之原材料。与之相对的是空虚——毁灭和虚无。这两种截然相反的东西相互平衡地存在着。有平衡和摩擦的地方,生命扎根,宇宙诞生。然后,就像土地的植物寻求阳光一样,源力找到了它能创造的位面之路。同样地,空间迁移到宇宙的位面开始产生巨大的影响。而在许多位面上,源力和虚空都寻求占据上风。在源力取胜的地方,生命绽放。绿维珑就是一个这样的世界。随着其强大的源力力量,使其自发地构想出具有力量的原始生命——元素神,以及目前所知神的最初实例。随着时间的推移,这些神或增长变强,或萎缩消失,而这些力量的改变都取决于他们造物的所作所为。比如很快就出现的一些原始信仰的神灵,战争之神和爱情之神,随着凡人对战争与爱情的了解而不断增强力量。随着众神的成长,六个新兴的种族在后来被称之为“崇拜”的行为中,正式形成了这种源力的集中。从而出现了七位主神——每一位主神对应相应的种族(其中一个
4 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

巫师3:狂猎

游戏延承了《猎魔人 [https://baike.baidu.com/item/%E7%8C%8E%E9%AD%94%E4%BA%BA/7252589?fromModule=lemma_inlink] 》系列小说的世界观。在小说故事发生前1500年前发生的一场灾难,不同的维度之间的世界发生了碰撞,世界直接被连接并互相渗透。这场灾难被称为“天球交汇”,它让很多来自各式各样来自不同世界中的生物被困在这个世界中,例如,食尸鬼和血棘尸魔和高阶吸血鬼,它们就是天球交汇所留下的残物。这些生物带有自己独特的生态,是过去时代的遗种。根据精灵的传说,人类因为自己之前的世界被毁灭,来到了这个世界。人类的祖先学会了如何驾驭混沌之力,最早的人类法师从此诞生,并对抗着其他来自不同世界的生物。但由于怪物四处散布且难以击败,在普通人不具备与怪物对抗的情况下,猎魔人由此孕育而生,他们是专门被普通人雇佣来猎杀怪物的变种人类,并以此维持生计,保护人们不受怪物威胁。 游戏剧情 杰洛特恢复记忆后,开始四处寻找叶奈法的踪迹。最终,叶奈法联系了数年未见的杰洛特,请杰洛特前往威洛拜的村庄碰头。
3 min read

Java 逻辑引擎的构思

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

Vuetify UI库

Vuetify 是一个基于 Vue.js 的 Material Design 组件框架,提供了丰富的 UI 组件和样式,可以帮助开发者更快速地构建漂亮、响应式的 Web 应用程序。Vuetify 遵循 Material Design 规范,提供了大量标准化的组件,比如按钮、卡片、表格、表单、菜单、导航、对话框等,可以快速构建出具有一致性和美观性的用户界面。 Vuetify 的主要特点包括: 1. 基于 Vue.js:Vuetify 是一个基于 Vue.js 的组件框架,可以很好地与 Vue.js 应用程序集成,提供了丰富的组件和样式。 2. Material Design 风格:Vuetify
2 min read

Kettle工具使用

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

只狼:影逝二度

《只狼:影逝二度(Sekiro:Shadows Die Twice)》是一款由From Software制作的第三人称视角的动作冒险沙盒类游戏,玩家将操控一位忍者,拯救他的主人——拥有日本贵族血统的大能的皇子,并向他的天敌复仇。 游戏背景方面是两条线,一条是苇名一心盗国,一条是樱龙和不死之力。先说苇名一心盗国,苇名之地原是苇名族的驻地,后来被内府势力侵并。到了战国末期,剑圣苇名一心为了收回被占领的土地带领苇名众及苇名的庶家也就是同源不同姓的平田家击败了内府士兵,从初次遇见苇名一心孙子苇名弦一郎的对话中得知平田家的家主是弦一郎的叔父。 苇名一心盗国 平田家的从属忍者就是在战场上收养了主角只狼的巨型忍者枭,其特征是一身毛发披肩,繁体版译名为猫头鹰。而与此同时另一个无主的忍者猿猴也就是日后破旧寺庙的佛雕师,则在战场上将自己的饭团给了在当时还是小女孩的永真,但是猿猴并没有亲自抚养永真,而是寄托给了自己的好友药师道玄,原因是喝完酒的猿猴说跟着一个药师总比要跟着一个忍者好,后来医术精湛的永真成为了苇名一心的专属药师,同时也学习了苇名一心的剑术。从这点上也能看出枭和猿猴同为忍者的不同,猿猴
4 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

近几年的工作心得

前言 不知不觉已经在互联网行业工作了几年。 回想刚开始学习技术的时候,每天都在写各种 Demo 项目。从最简单的 Hello World,到小游戏、爬虫程序、后台管理系统,每掌握一项新技术都会带来明显的成就感。那段时间学习速度很快,也充满了热情。 随着时间推移,也逐渐意识到互联网行业一个很明显的特点: 门槛不算特别高,但技术的天花板却非常高。 技术世界的知识量极其庞大,当你学得越多,反而越会意识到自己知道的其实很有限。很多时候,我们只是站在巨人的肩膀上,看着更高的巨人。 技术成长的早期阶段 在技术成长的早期阶段,大多数人都会通过几种方式来提升自己,例如学习新的技术框架、模仿优秀项目、阅读技术文章,以及不断搭建各种 Demo 项目。 尤其是在开源社区中,经常可以看到很多优秀的设计思想、架构模式和高质量的项目代码。通过阅读这些项目,可以快速理解很多工程实践。 不过,如果想真正提升技术能力,有一个非常重要的过程: 独立完成一个完整的系统项目。 从系统设计、编码实现,到部署上线和后期维护,这整个过程会让人对软件开发有更深入的理解。当第一次独立设计系统架构,并成功让系统稳
6 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

Java后台架构理解

最近自己搭建了一些系统架构,因此整理了一下对于后台架构的一些理解和思考。 在实际开发中,我们经常会思考:什么样的项目结构才算是一个合理的架构? 有人认为,一个好的架构应该能够: * 减少开发人员的重复工作 * 结构清晰,易于理解 * 具备良好的稳定性 * 方便扩展与维护 但实际上,这只是项目层面的架构。 随着业务的发展,系统往往会从单机项目逐渐演进为集群架构,最终发展为分布式系统。在这个过程中,会不断引入各种组件,例如: * 注册中心 * 配置中心 * API网关 * 服务熔断与降级 * 分库分表 * 容灾机制 * 各种中间件 同时系统部署也会逐渐演进为 Docker + K8S 的容器化体系。 服务器数量也可能从最初的一两台,逐渐增长到几十台甚至上百台。此时系统已经不再是简单的项目,而是一个完整的 系统架构体系。 架构设计既包含宏观层面的系统设计,也包含微观层面的代码设计。 代码层面的架构设计 在代码层面,架构设计需要统一开发规范,并提高开发效率。 例如: * DTO 自动参数校验(AOP) * Result 统一返回对象 *
6 min read

Java远程桌面实现

突发奇想,使用java是否可以实现远程共享桌面的功能呢? 当然可以了,都是跑代码,但是java效率比较低,为啥,也不是因为java代码执行效率低下,而是因为出于Java自带的屏幕截屏工具效率过低,java提供了robot类来实现桌面截屏,2k屏幕一张jpg大小在200kb左右,一张截图我使用的rx2700x cpu 一张截图竟然需要30毫秒 距离1秒30帧率还是差距有的,更别提1秒60帧率。就算如果1秒60帧率 如何使用 java 高效的传输到各个远程端呢 ? 有人会说使用多线程截图,来提高帧率,这样的做法,我个人觉得不太科学,为啥?因为占用太高cpu资源,应该寻找高效并占用cpu资源较少的方法。 并且图片传输不可取,因为一张图片太大 ,200kb,1s 30张就是 6000kb 严重占用带宽。 最好的方式使用视频流,使用开源的h.264视频格式,还有更好的h.265 但是我并没有找到对应的开源jar。h.265技术还处于收费阶段。h.264视频格式 为根据每一帧中的像素点变化来记录其数据。而不需要记录整个图片中绝大部分像素信息。所以h.264格式的视频体积远远小于图片传输的数
2 min read

MySQL 亿级数据导出excel文档

前言 公司SaaS系统需要给用户提供列表数据导出 excel 文档的功能。 但有的公司的列表数据如财务流水已经高达千万,亿级别,对于这样的数据导出,我们需要提出一个解决方案。不然在月底几百家公司进行导出excel,将会导致mysql QPS急剧上升,服务器cpu,ram,瞬间到达报警阀门。大批量导出可能会导致服务器不可用甚至面临宕机(提示:对于财务等敏感数据,需要做文件加密或者临时文件授权下载操作)。 具体方案 方案的出发点:大批量导出,不能影响正常业务运行。 单独部署一个数据库从库节点进行查询压力分担,再单独部署多组服务器跑上Springboot项目作为MQ的消费者集群,所有的导出请求均请求至MQ队列中,Springboot会采用拉模式主动拉取MQ队列中的导出Excel任务消息进行执行,合理的使用了MQ的削峰填谷以及异步功能。并在SpringBoot项目中严格分配线程池资源。 具体的任务消费者通过亿级分页方案分批量查询mysql列表数据,并使用ali easy excel api进行数据硬盘落盘,完成输出后上传oss(也可以使用oss内网流传输,直接传到oss文件系统中
4 min read

MySQL 亿级数据分页

随着公司业务增大,数据量也是随之剧增。MySQL作为一款社区免费开源数据库。想要用它做几百万的数据分页。光靠limit是不靠谱的。当然不是诋毁mysql,mysql作为开源插拔式存储引擎数据库,已经是可以满足绝大部分的应用场景需求。使用mysql管理100tb也不是问题。但是使用方式却是一个问题。 limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。 limit在偏移量小于10w时性能还勉强可以接受,但随着偏移量越来越大,性能急剧下降。 公司单表账务数据已经到达230w ,做分页limt  来查询最后一页的数据,怕是没有个20秒是查询不出来的。当然具体的时间也要根据是否有索引,字段数量,数据内容而定,查询条件而定。 为了解决分页效率问题,我采用方案是: select id from table limit 100000,20 (带上where条件作为子查询) 由于主键id原本就是主键索引,所以limit的速度效率很高。并把条件字段加入复合索引,效率才会有质量的提升 。 但如
3 min read

浅谈logo设计

在企业没有声望的时候,建立一个logo,给予人们一定的标识性认知,一但企业知名度高了,就可以很好的把图形映射到人们的记忆中,加强企业知名度,可谓是锦上添花。 让人们通过图形记忆来记住公司形象品牌。但记住一定要注册商标、著作权,不然会有侵权的情况,而注册商标也是为了更好的保护公司企业形象。 那么为了设计出人们比较容易记住的图形logo, 这里面涉及到的东西可就比较多了。毕竟还有专业的视觉设计师职位,而logo为了让人的眼球看过去色彩更舒适,更亲近人,看着会有一种放松的感觉,显示出公司特色,容易记忆,这样的logo往往光是设计的费用就高达几十万元。 logo的设计要从公司的企业文化,企业提供的服务角度出发,简单易懂点就是,公司是干嘛的,公司需要的是复古还是年轻充满活力的? 对于一家科技企业,互联网企业来讲,年轻充满活力是必不可少的,颜色可以选择多样化一点,但总体颜色不能太多,略显花哨,适量控制颜色种类,颜色应该略淡,色彩饱满度不可太高,饱满度太高,会让人看着不够放松,越看心情越急躁。 图形形状,这个就得根据公司做的是什么业务和公司想要的是字体图形,还是比较抽象一点的图形。 但互
2 min read

关于使用ELK的记录

最近因为公司系统项目统计压力大 。mysql集群查询进入瓶颈,索引优化也不能快速响应统计结果,于是接入 Elasticsearch、Logstash、Kibana 三大开源套餐。 https://www.elastic.co/cn/ 关于  Logstash 其实还可以使用ali DataX 也是可以的 功能比 Logstash 还要更上一层楼。我采用的还是Logstash,因为ali DataX 我是后面才知道的,所以就没有去替换掉了。 通过 Logstash抓取过滤mysql统计数据,增量同步到Elasticsearch中。 再通过项目java api 调用 Elasticsearch查询; Kibana 可以web可视化集群,索引具体情况。 Elasticsearch查询语句挺简单,但是感觉官网的例子不是很多,很多比较复杂的聚合需要自己摸索。 整个学习难度不是很高。入手很快 java api jar 使用的是 elasticsearch-rest-high-level-client 之后再根据业务场景自己封装了一下工厂,抽象了几层代码给开发人员使用。 api
4 min read

随心笔记

技术无止境 创新不停驻