- 博客(32)
- 收藏
- 关注
原创 每个程序员必备的基础设施--Codeium
自从 chartGPT3 横空出世以后,AI 技术越来越深入到每个人的生活中,这里不谈 AI 到底是不是真的存在着类人的思想和智慧,也不谈是否取代人类的问题。本着实用主义的原则,先让它能为我所用。
2023-05-24 11:28:19
3845
1
原创 2023年,当我们谈论架构时,我们要聊什么
架构是一个非常宽泛的话题,从组织结构上来说,涉及到前端、后端、运维;从软件设计上来说,涉及到需求分析、设计、编码、测试;从物理结构上来说,涉及到CDN、负载均衡、网关、服务器、数据库。当前一些架构方面的书籍,一般都从单体架构讲起,逐步过渡到微服务、云原生等,但这难免会让人疑惑,是否微服务就是最好的架构,或者说,当我从零设计一款系统时,面对现在各领域层出不穷的框架、技术,我到底应该如何选择?时代在变化,架构在演化。
2023-03-09 11:04:53
692
原创 一起来聊聊 Go 的核心竞争力
现在,越来越多的人了解 Go 语言,学习 Go 语言,越来越多的公司开始尝试采用 Go 语言。我也是一直在用 Go 作为服务端开发的主力语言,也了解过 Java 和 Spring 那一整套服务端开发体系,时常在想,Java 的这一套体系,在长时间的迭代下,技术沉淀和业务覆盖已经非常完善,为什么 Go 还能脱颖而出?让大家所熟知。我知道,这中间存在一些从众效应,尤其是大公司的带头使用带来的引领作用,这为 Go 的声名带来了正向反馈,使 Go 越来越被人们所了解。
2023-02-24 10:49:16
660
原创 实现“第 24”种设计模式
但是,机器学习的目标主要是怎么通过大量的数据,识别和构造出一个决策树,也就是图中这些条件本来是不存在的,需要通过学习去自动生成。首先, 如果真的只是例子中这种扁平的(指一层)if-else,即使它加到 100 个,也不会很复杂,本来也就很符合人类的思维习惯,一个个往下看就是了(人类很喜欢顺序和规律)。思考一下,这种嵌套的 if-else 是不是构成了一棵分支树,树的叶子节点就是某种操作,树的非叶子节点就是某个判断。我们还定义了一个节点 Map,保存了这棵树的所有节点,这与一般的树实现不同,这是为什么呢?
2023-02-24 10:47:39
577
原创 如何做好一个配置中心
最后,引用那句经典的“软件开发里没有银弹”,我想补充一句:“你要知道你手里有哪些类型的子弹。”通过对比和分析,来确定当时,当地,最适合项目的那个方式,比如项目着急上线,先直接把配置文件写死在代码里,都不是不可以的,后期可以再改。如何做好一款配置中心?希望看完本文你能有自己的答案。
2022-11-08 10:56:42
787
原创 请小心ETCD的Compact
本文想讨论一些ETCD的使用注意事项,ETCD作为一个分布式KV数据库,作用有很多,下面以用ETCD作为配置中心来举例,用到了ETCD关键的两个功能:Watch和Revision。Watch可以实时推送配置变更,而Revision可以回溯配置的历史变更列表。关于Revision的概念,请参考在ETCD中,老实说对Revision的概念支持的不是很好,虽然标榜自己是可以回溯历史版本的,但我找了半天,除了一个--rev参数,没有找到更多的API来利用这些历史版本。可以通过。
2022-09-19 11:58:45
1594
2
原创 从权限系统的菜单管理看算法和数据结构
菜单管理,感觉上是个小模块,但实际做下来的感触是,要做的好用,不容易。算法和数据结构,长期活跃在面试题中,实际业务中好像接触的不多,但如果能用好,可以解决大问题。如上图,是我在开源世界找到的一个菜单管理的设计页面,其上可以看到,菜单管理主要管理一颗菜单树,可以增删改查、排序等功能。接下来,我们就一步一步的实现菜单管理的各个功能,这里我主要介绍后端的设计方案,不涉及前端页面的处理和展示。可以看到,菜单管理模块主要分三块,一是对菜单的增删改查、二是菜单的导入导出、三是菜单的排序。...
2022-08-09 14:38:03
1066
原创 LPG(Loki+Promtail+Grafana) 日志收集系统实践和踩坑经历
日志收集系统,一般以ELK架构居多,现在很多也会考虑用 Fluentd 组成EFK。但对于资源有限的集群来说,部署一个ElasticSearch的成本实在太高,幸好现在已经有一套新的低成本开源方案,那就是LPG。也同样能达到日志收集和检索的目的,占用的资源还少。Loki是Grafana公司出的一款开源的日志存储和检索系统,对标的是ElasticSearch,但是设计理念完全不同,ElasticSearch核心是倒排索引,而Loki的核心是基于KV标签的索引+原始日志存储。在存储占用上,Loki的占用量天生就
2022-07-12 01:02:26
8282
2
原创 延时队列如何实现?ETCD vs Redis
前言日常开发中,我们经常会碰到有延时任务的场景,譬如30分钟后关闭订单、在指定时间上架某个活动等,如果是最简单的场景,不考虑服务水平扩容、服务宕机等因素,可能内部用github.com/robfig/cron加MYSQL存储延时信息即可。当然,一般线上服务,不可能不考虑道这些因素的影响,所以才有很多任务调度框架,比如:Quartz、xxl-job、Temporal等。但这次这里想讨论的是中间情况,也就是,既想保证服务能水平扩容、服务宕机任务不丢失,又不想使用那些调度框架(毕竟有部署成本和学习成本)。延时
2022-05-05 15:00:39
1113
原创 如何低成本的搭建一个真实的Kubernetes集群
引言:kubernetes作为当前事实上的容器编排标准,其势头可谓是如日中天,然而,kubernetes一直以来被人诟病的就是其复杂的搭建成本,作为个人,除了用miniKube等工具在个人电脑上模拟一个集群,或者通过虚拟机模拟一个集群,但终归,真实集群和虚拟集群是不同的。我一直在想,如今云服务器已经十分成熟,难道就不能作为搭建kubernetes平台的基础设施吗?一、架构规划其实对于现在的云服务来说,各家竞争激烈,价格也打得比较低,但是存在一个问题:为了吸引新用户,云服务厂商一般都对产品首单、新用户.
2022-02-24 21:56:28
1347
原创 Go 服务端开发总结
服务端开发一般是指业务的接口编写,对大部分系统来说,CURD的操作占了绝大部分。然而,网络上总有调侃“CURD工程师”的梗,以说明此类开发技术并不复杂。我个人认为,如果仅仅为了找个框架填充点代码完成任务,确实是简单,但是人类贵在是一根“会思考的芦苇”,如果深入的思考下去,在开发过程中还是会碰到很多通用的问题的。如用go的开发框架举例子,就有两种分化形式:一种以beego为代表的,goframe继续发扬广大的框架类型,它们的特点就是大而全,提供各种各样的功能,你甚至不需要做多少选择,反正按照文档使用就是了。
2021-12-20 09:13:36
2384
原创 凤凰架构读书笔记
演进中的架构笔记: 我理解的架构之道,一定是在了解架构发展的历史基础上扩展,非历史而不能明真理。 最先和最初的单体架构,老而弥坚。很赞同作者说的单体并不是反例,实际上我们很多系统刚开始就是单体架构,单体只意味着: 1. 随时间维度增长带来的维护困难 2. 技术栈的单一 3. 一荣俱荣一损俱损 对一些小系统而言,单体无疑是最简单正确的选择。同时,单体不意味着维护困难,这点要格外注意。只有在时间增长带来的系统复杂度增长的情况下,才会出现维护困难。同时,技术栈单一也
2021-11-16 10:19:12
1419
原创 ETCD源码分析(三)Raft协议入门
适合阅读本文的人群对Raft协议感兴趣的人看过一些Raft相关介绍的博文,但是看不懂的(比如我)很多Raft相关的分析文章,或者是著名的《In Search of an Understandable Consensus Algorithm》 论文,都会把下面的一张图放出来:再介绍选主、日志复制、状态机等一系列概念,恕我直言,真是看的人昏昏欲睡。也许有的表述确实看懂了,可正如古人所说,纸上得来终觉浅,要知此事需躬行。Raft协议跟我们日常写代码有什么关系,我们到底能不能用上它呢?我个人觉得.
2021-09-27 18:18:18
325
原创 分布式任务调度框架(Temporal)介绍
分布式任务调度框架基本能力:任务管理能力(增删改查、执行、定时执行、延时执行、健康监控)集群管理能力(扩展简单、效率高)编程能力(运行代码)Web界面管理目前市面上有很多可用于处理分布式任务的开源框架,比如Elastic-Job、XXL-Job、Quartz等等,它们或多或少都能满足以上列出的各项基本能力,然而,它们都是以Java系语言编写的,这不禁让人产生疑问,难道Go就没有自己的开源任务调度框架吗?经过在网络上一番翻箱倒柜,找到了类似gocron、gocraft/work、robfi.
2021-09-18 15:02:28
7792
原创 ETCD源码分析(二)Client端Watch流程分析二
书接上文,继续分析Client端Watch流程的关闭流程的处理。首先我们再回顾下Watch中的关键角色和设计理念:角色说明watcher对外接口Watcher的实现,重点是Watch()方法watchGrpcStream桥梁,管理内部GRPC连接、管理内部的虚拟Stream、消息接收和分发watchClient对应底层的GRPC连接客户端watcherStream虚拟的Stream,处理服务端和客户端的通信要分析关闭流程,我们首先来找找有哪些情况会导致关
2021-09-18 09:57:23
570
原创 ETCD源码分析(二)Client端Watch流程分析一
书接上文,我们在《ETCD源码分析Client端启动流程分析》中,深入源码查看ETCDClient端如何启动,如何向Server建立GRPC连接的。在本文中,我们继续探究ETCD的Client端是如何实现Watch逻辑的。由于Watch逻辑整体还是比较复杂的,建议观看本文的小伙伴,把ETCD的V3.5版本源码打开,对比着文章查看。ETCD源码Watch启动流程首先对Watch流程进行分解,先介绍下ETCD客户端是如何启动Watch的。Watch模块通过Watcher接口对外提供三个功能:Wat
2021-09-15 11:05:01
675
原创 ETCD源码分析Client端启动流程分析
ETCD源码基于v3.5,在分析之前,需要搭建好源码分析的环境。首先,从GitHub的仓库中克隆下ETCD的源码,再利用docker搭建我们的ETCD测试集群,命令如下:REGISTRY=quay.io/coreos/etcdNAME_1=etcd-node-0NAME_2=etcd-node-1NAME_3=etcd-node-2# IP在不同机器上不同,请查看docker的子网网段HOST_1=172.20.0.2 HOST_2=172.20.0.3HOST_3=172.20.0.4
2021-09-15 11:04:27
618
原创 对设计模式中工厂模式的理解和感悟
回想刚开始学习设计模式时,被23种设计模式冲昏头脑,很想学好,但是越看越晕。工作几年后,回头在看,略有些心得,因此做个小总结,也希望能带给后来的小伙伴一点点启发。一、设计模式之道 很喜欢一些大佬们对知识的分类法,他们会把知识分成“道法术器”(也是源自道家的思想)。所谓“道”,我理解指的就是根源和初心了,它的特点就是高度概括,包罗万象;所谓“法”,我理解就是运行的法度、制度、规章,它的特点就是保证系统的正确运转;所谓“术”,就是一些做事的方法,它的特点就是有条理,有步骤;所谓“器”,则是一些辅助工具.
2021-07-24 15:49:09
493
原创 Goreleaser + TraivsCI 发布 gopo 项目
很久没有更新过博客,想来也是十分惭愧,每日都在公司和家庭之间来回往返,闲下来时也浑浑噩噩。古人云吾日三省吾身,博客就是一个很好的反省和总结的手段,只是难的不是写一篇或两篇,而是那份滴水穿石的毅力。以上扯了些废话,下面进入分享正题。Goreleaser和TraivsCI 这边就不再过多介绍,可以去它们官网上了解。这边主要是介绍gopo以及如何把它发布出去供人使用。那这篇文章也相应的分为两个部分。gopogopo 说白了就是解析go中的结构体,生成对应的结构体字段常量表。也就是说:type SomeTa
2021-01-24 19:47:26
642
原创 Flutter学习 ---- TravisCI加持
Flutter号称统一Android端和IOS端开发,做到一份代码同时运行在两个平台上,从实际效果来看,流畅的体验、完善的文档,还是很值得一试的。不过其中却藏了一个神坑(对我来说),那就是你的Flutter应用要在IOS上运行,必须在macOS主机上打包才可以,吃着苹果的童鞋自然不用担心了。然而本人一台y400征战多年,目前资金池也处于资源紧缩状态,换苹果机这种高消耗的任务基本是排在优先级队...
2018-06-13 14:20:08
813
原创 Flutter学习 ---- 屏幕截图和高斯模糊
废话不多说,先上本次要实现的效果图。 Gif格式是渣像素,实际效果要自然的多。这个项目其实是看到小池记账小程序后实现的一个类似效果,小池比较闪光的一点就是这个主界面的动态高斯模糊效果,不过小池的动态模糊效果就不如Flutter可以做的这么自然流畅了,模糊时还是有肉眼可见的卡顿的。大家可以搜索小池记账对比一下,下面进入正文。知识点Flutter中如何截取当前屏幕的Widget图片。...
2018-05-24 08:44:34
7918
1
原创 为什么在Go语言中要少用interface{}
记得刚从Java转Go的时候,一个用Go语言的前辈告诉我:“要少用interface{},这玩意儿很好用,但是最好不要用。”那时候我的组长打趣接话:“不会,他是从Java转过来的,碰到个问题就想定义个类。”当时我对interface{}的第一印象也是类比Java中的Object类,我们使用Java肯定不会到处去传Object啊。后来的事实证明,年轻人毕竟是年轻人,看着目前项目里漫天飞的interf...
2018-04-14 17:40:08
1368
1
原创 Beego框架的一条神秘日志引发的思考
公司目前的后台是用Beego框架搭的,并且为了服务的不中断升级,我们开启了Beego的Grace模块,用于热升级支持。一切都跑井然有序,直到有一天,领导甩出一些服务日志,告知程序一直报错:2018/03/08 17:49:34 20848 Received SIGINT.2018/03/08 17:49:34 20848 [::]:5490 Listener closed.2018/0...
2018-03-12 09:57:14
3556
2
原创 使用Go默写古诗词
“白日依山尽,___”。下句自然填黄河入海流,那么“日月忽其不淹兮,___,___,恐美人之迟暮”,中间两句怎么填呢? 最近工作中有个需求,就是1500道语文诗词填空题没有答案,现在需要给这些题目大爷们匹配它们对应的答案,好在题目信息都很完整,指出了诗词出处、作者信息。自然想到到网上爬取对应文章信息然后字符串匹配答案。目前做完,效果还可以,基本上所有题目的答案都有了,现把操作流程记...
2018-03-06 21:22:44
626
原创 使用 ElasticSearch6.0 快速实现全文搜索功能
本文不涉及ElasticSearch具体原理,只记录如何快速的导入mysql中的数据进行全文检索。工作中需要实现一个搜索功能,并且导入现有数据库数据,组长推荐用ElasticSearch实现,网上翻一通教程,都是比较古老的文章了,无奈只能自己摸索,参考ES的文档,总算是把服务搭起来了,记录下,希望有同样需求的朋友可以少走弯路,能按照这篇教程快速的搭建一个可用的ElasticSearch...
2018-02-23 14:04:48
10640
原创 实现一个长表格控件 ---- 自定义LayoutManager学习
Android 学习之路从自定义View,自定义ViewGroup走到现在,难度越来越大,当然也能学到很多东西,而自定义RecyclerView的LayoutManager既是对之前所了解的View绘制机制\事件传递机制的巩固,也是一种提升。Google自定义了一个ViewGroup叫做RecyclerView,却不走寻常路,把这个ViewGroup的测量和布局交给另一个类完成,为什么要这样做?能带
2017-09-08 20:11:03
722
原创 从ActiveAndroid到Realm的爬坑之路(一)
公司的项目一直都是使用的ActiveAndroid,这是一个很传统的ORM框架,不过无论是与Gson的配合使用,还是连接查询或者分页查询,传统数据库的理念它都能支持的很好。无奈的是这个项目在GitHub上的最近更新时间还是在两年前,它对AndroidStudio的InstantRun特性支持的不是很好(编译时间就是程序员的生命啊,感谢Google推出的这一神器 )。强行使用的话可能会报如下错误: 第
2017-09-08 20:09:14
679
原创 SublimeText3 插件开发记录 --- 划词翻译
最近正研究怎么使用SublimeText3开发Python,然而对Python英文文档的阅读是一个比较头疼的问题,在AndroidStudio中有自动翻译插件ECTranslation,能方便的翻译单词和句子。因此想仿照ECTranslation,自己写一个翻译插件,正好也能加深对Python的印象。(在SublimeText3中,似乎没有特别好用的划词翻译插件)开发ST3的插件,网上只有简单的入门
2017-01-02 21:48:04
4476
4
原创 从ActiveAndroid到Realm的爬坑之路(二)
Realm是作为一个Gradle插件集成到项目中的,怎么配置 文档 里说的也很清楚了,需要注意的是在官方的GitHub上是这么添加依赖的: dependencies { classpath "io.realm:realm-gradle-plugin:<version>-SNAPSHOT" } 但copy的时候中间的version 应该替换成最新的版本号。然后,
2016-08-14 17:02:45
2839
原创 实现Activity和Service通信的几种方案
Service作为Android四大组件之一,一直默默无闻的在后台保证程序能正常运作。按照Google的定义,Service能在后台执行长时间的运行操作而不使用用户界面,它与后台线程的区别是它是整个程序的一部分,比如说Activity在运行的同时需要播放一些音乐,这完全可以通过开启一个后台线程来完成;但想要在应用进入后台运行时依然能播放音乐,则必须使用Service来完成了。 用户感知Servic
2016-06-10 20:31:22
4466
原创 MaterialDesign+MovePicImageView实现漂亮的登陆界面
最近正在完成一个摇一摇的项目,打算加入一点社交元素。第一步是实现登陆界面,一个人独自设计加开发。最后的效果还是比较满意,但还是有性能上的损失,应该可以做得更好。 背景图片可以循环左右移动,使用MaterrialEdittext 实现了Edittext的向下兼容。此库继承自AppCompatEdittext,所以支持Edittext的所有特性,而且添加了字符检测,标签动画,组件颜色的定制等。有了它基
2016-05-26 22:50:29
3480
原创 学习笔记----快速排序的java实现
快速排序算法是我们学习数据结构必学的算法之一,虽然在java中,对列表的排序可直接使用Collections.sort(List l) (这使用的是归并排序算法) ,对基本类型的数组也有Arrays.sort()(这使用的是改进的快速排序算法),但实现一个快速排序,仍能给自己很多启发。 很多算法书上都使用c或者c++实现快排算法,但是作为一个写惯了java的程序员,再去写c或c++有着各种水土不服
2016-05-24 18:21:20
640
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人