
获得徽章 0
- 代码乐趣分享,给程序员的小伙伴们看一段代码,你若看懂了,证明你是个玩Kafka的行家。
① 这是一个Kafka生产者的分区策略
②默认的分区策略就是用murmur2哈希算法对消息Key取模得到消息存放的分区位置
③但是我自定义了这个分区->继承了DefaultPartitioner
④我自定义的目的:只要Kafka Key为:0000001:XXXXX ... 000000N:XXXXX,都按照前缀取模(N/分区数)=分区位置,就能按照前缀分组存放Key到指定的分区。
为什么要这么做呢?
因为我采集数据库中的数据表事务操作的记录,发给Kafka,但是我以数据表名作为表记录的前缀进行分组,那么只要是相同数据表的记录一定会进入相同的Kafka分区,那么就保证了数据表记录进入Kafka分区后,形成先后次序的队列。
这其实就是一种通过Kafka实现ETL又能保证数据库事务的手段!展开4点赞 - 为什么微服务一定要有网关?
2019年带领西安一批虎贲级的程序员,设计架构了互联网医院的微服务平台,服务至少近十家三甲医院。我就分享下API网关运用的经验!
一般来讲我们可以通过Nginx对URL的反向代理来实现API网关,那么基于Restful风格的不同上下文的URL就可以通过Nginx间接指向了不同的微服务。
这样的好处在于对外我们只需要暴露Nginx端口即可,列如:80或443端口。
单纯用Nginx合适吗?其实不够,为什么呢?并没有适配出API网关中API的动态变化特性,例如:每次增加一个新的微服务,或者调整一个旧微服务的地址,势必都要Nginx重新加载一次配置文件。
这时候就出现了我们国人章亦春的大作:Openresty,基于Nginx又结合了Lua编程语言(一种精巧高性能的脚本语言),创造出了Nginx面向网关的可编程环境,用Lua我们可以从Redis、MySQL、PGSQL中读取动态维护的微服务URL地址。
但终究lua编程语言比较小众,在Openresty基础之上又出现了Kong,替你搭建好了一切环境,你只需要在界面配置API网关的映射地址即可。
新问题又来了:API网关仅仅就是不再暴露接口这么点作用吗?
当然不是,它的精髓在于欺骗!
让客户端永远不知道真是的后台到底在访问谁,那么这就引出了一种开发模式:生产、测试与部署的无缝衔接,我们有时候也叫做Devops。
这个场景是这样子的:微服务在生产端我们可以部署两套,一套用于测试与调试,一套用于生产环境,那么当前新功能测试的那一套稳定了,就可以将其版本+1,作为新的生产环境,然后在前端、APP或小程序发布后,网关很自然的就切换到新版本上,而老版本依然存在,作为客户端尚未更新的用户使用。
是不是看起来整个过程已经没有将部署工作单独提出来,而是在迭代开发与测试的过程中,配合版本和网关,自然而然的变化了,对于用户来讲永远提供的是最适合的后端版本。
记好,最佳的测试环境就是无限接近于生产的测试环境。
因此我们又延展出了容器环境的需求,因为在同一服务节点上,我们可以通过容器技术非常容易且快速地生成多个版本的生产与测试的应用容器,这里就不再展开细说了!
最后一句,API网关有很多种,只不过以Nginx为基础的API网关用起来独立、简洁、高性能,面向异构系统更友善一些。展开赞过31 - 如何一步步成长为合格且靠谱的程序员?
为此对于曾经比较励志的成长经历,我总结了三点:珍惜来之不易的机会、敢于做带头人、勇于挑战别人都害怕的硬骨头!
2002年毕业后的非典记忆犹新,那时候百业萧条,坚持了差不多一年多的自学编程后,本打算都要放弃了,结果父母鼓励我坚持下去,没想到很快迎来了人生的转机,入职成为程序员。
在那段时间时时刻刻都在为能扎住根而努力工作学习,当然收获斐然,因为我时时刻刻都在提醒自己要珍惜这来之不易的机会,无论再不容易,始终提醒自己不要轻言离开,唯一离开老东家的原因就只有一点:平台满足不了自己的成长了!
2005年争取到机会,第一次作为Leader带领项目组奔赴警局常驻一个月,大家看清楚是常驻开发,不是被拘留,尽管吃住都在局里,这是团队最开心的时光。
我们成功上线基层警务系统,最让我开心的事情就是当我推开民警办公室,十多位民警整整齐齐地坐在个人电脑工位,在我们开发的系统上开展接处警工作,在那一刻难以抑制内心的喜悦和成就感,如今想起来仍然心情愉悦,创造与反馈是人生最高品质的享受。
因此想成长为一位合格靠谱的程序员,要提升技能、争取机会,敢于作为技术带头人负责,这是自身提高能力最硬的渠道,通过创造软件系统从客户体验的正反馈中你将获得强烈的成就感。
2010年接手省政府应急通讯指挥系统,这就涉及到了桌面软件系统、后端软件系统、语音通讯系统的研发大整合,甚至公司总经理都顾虑研发失败,我作为开发一线负责人坚持研发,不断写邮件给领导们信心,终于如愿以偿,立项研发。
面对一片黑的创新型技术预研过程,毫无前车之鉴,完全凭着自己的技术积累与经验在不断的尝试,一个团队,十几个触摸屏,四五台服务器,一台语音交换机,十几部IP电话,一大堆的网线围绕在一个小办公间,只有嗡嗡的大功率风扇声和不断嘟嘟的电话调试声。这就是我们研发与调试的环境,突然有一天,运行起来的程序调度着每一部电话,挺好的根据我们调度的指令响起,那一刻我基本可以断定,这个项目稳了!
经过一年半的研发,我们成功了!应急也成了公司产品线的核心发展事业。
因此想成为一位合格靠谱的程序员,要不断提高自己的技能,敢于挑战别人都害怕的硬骨头,当你挑战成功,那么这段经历将成为你永生难忘的回忆。展开赞过评论1 - Java学习之路,我们该怎么走?
我记得2002年的那一场雪之后快毕业了!招聘会面试Java开发,一点也不懂编程的我,被面试官怼得无地自容,就下定决心,买了本侯捷先生翻译的《Java编程思想》开始自学Java。从那时候起到现在,我自认已经是很高级别的企业级Java架构师了,好了不自吹了!
Java学习需要经历比较漫长的过程,才能达到高级别层次,具体来讲就是:编码级、效率级、模式级、架构级和骨灰级
编码级:一般常见于学习编程两年以内的Java程序员,当然不排除极高天赋的选手。在这个过程你并不追求代码质量(效率、结构和可扩展性),更多是模仿高工们的代码,实现应用逻辑。在这个过程一定要记住,要追求功能的完善与闭环,这个说起来简单,做起来往往有很多细节,千万不要指望产品经理,可能你们公司还没有此岗位。但是这对初级别程序员的习惯养成是关键时期。
效率级:当你对Effective Java这本书看的津津有味的时候,那么证明你开始进阶了!这一般常见3-5年的程序员,因为你开始对自己写的代码有讲究了,什么是单态,什么是工厂,如何控制异常等等,明白了代码重构的重要性,开始对各种技术框架品头论足,往往到了这个阶段的程序员前途光明!
模式级:设计模式不是书里面看出来的,而是经历了上个阶段的各种精益求精的技巧考究后,当你翻看不同的设计模式讲义时,心里会总有种似成相识的感觉,亦或者惊讶的赞叹:卧槽,原来可以这么搞啊!请相信我,这时候你的代码进入到了晦涩难懂的时期,源于过度运用设计模式会导致别人看不懂,当懂得推己及人的时候,自然就跳出来了!
架构级:进入这个阶段,应该有8-10年的开发经验,这个过程很容易进入管理路线,这是好事,但若能把持住自己,主心骨仍然继续深入技术探索当中,那么你就会发觉架构师的真正意义了,一件产品从创世到面世,架构师努力开拓出整体结构,又始终陪伴在产品的身边,守护着它的点点滴滴,就好像润物细无声一样,不断纠正和兜底技术团队在开发过程中的错误,让产品在正确的轨道静静等航行。
骨灰级:当你经历了很多事情,内功深厚,手中、心中已无剑,来什么新技术,直接了解技术框架就行了,再不成看看源代码,甚至可以提几个好的建议。这时候你更希望在某个应用领域成为名至实归的专家,更希望能将自己的所知所学用一种方式,也许是开源,也许是知识,影响更多的技术人。展开赞过评论1 - Linuxer的学习进阶之路
如果想要当一名厉害的程序员,最好的老师其实就是了解你的操作系统,而选择正确的操作系统是进步的关键所在,对于程序员来讲,操作系统的学习选择非Linux莫属,从现在大趋势来看,懂Linux就是必备技能了!
在长期的使用当中,你从Linux身上能了解到tcp/ip协议,网络连接与通讯,配置调参,文件和权限,shell命令和编程,性能观测,进程服务以及网络端口,等等
我从上大学开始玩Linux,蓝点Linux、中软Linux、Mandrive Linux、Debian Linux...,到现在二十年,老鸟一枚。总之程序员学习Linux操作系统,要经历三个阶段:
第一阶段,从会安装到图形玩家也就是懂得各种发行版的安装,例如:Debian、Ubuntu、CentOS、Redhat、Suse等。然后开始在Gnome,KDE,fvwm(高级水平)各种桌面系统进行美化和应用体验。这就是Linux应用和玩家级别。
第二阶段,从图形到终端,这时候就要开始大量云服务,数据库,应用服务的安装,配置和运行,让自己达到Linux系统管理员级别。
第三阶段,从命令到编程,这个阶段掌握了Linux的体系结构,可以搞定各种Linux策略配置,懂得了大量shell命令,这时候开始学习shell编程和Python编程,让Linux操作系统的所有问题都听你调遣和部署,那么你就进入到了Linux黑客阶段。展开赞过评论2 - 编程能力怎样才能突飞猛进?
想成为高水准的编程工匠需要经过三个基础方面的努力:1.看书、 2.阅读源代码、3.代码重构。
1. JAVA、Linux是我的擅长的核心领域,但我不排斥其他领域的技术书籍的学习和理解,包括:C/C++、C#、Windows编程、Unix网络编程、Python等。这是作为一位专业程序员应该具有的基本素养。另外并不是编程技巧好就自以为是个牛人了,那你就错了,还要更多在软件工程方面的去理解和感悟,那么人月神话、敏捷开发、团队之美这类书籍就也需要多读,多体会,多在工程实践中去理解。往往说一将无能,累死三军,不是说将军的武艺不够强,关键原因是将军总是赤膊上阵,不懂得指挥,团队就如无头苍蝇乱飞,那么再优秀的个人代码技巧也抵不上一个团队稀烂的开发工程。
2. 阅读源代码,当很多人只想着ctrl+c/ctrl+v赶紧解决完工好回家追王凯、靳东的新剧时,而黑客潜质的程序员,正在电脑面前阅读着大师们的杰作,想从框架的源代码中寻找到更优解的答案,因此很多人只能称之为码农。面对github浩如烟海的大师之作,就好像电影《七宗罪》里面老警探对着图书馆的保安说:“先生们,我永远也不会懂,有这么多书,知识的世界完全唾手可得,可你们呢?整晚打扑克牌”,可能很多人看到会反驳我。没有关系,若有心人能体会到其中的奥秘,对人生发展定大有裨益。
我在10年前就看完了JSF/MyFaces 80%的源代码,Springframework Core源代码,那时候极为推崇Rod Johnson的编程风格。去年把Hadoop HDFS的Client部分看了大半。每当阅读完这些源代码之后都会在相应的工作中受益无穷,不仅仅是编程,还有对软件架构洞悉的能力极速提升,这是千真万确的事实。
3.再说说重构的重要性,当你接手了一个项目,屎一样的if if if ... else else else ...,几千行嵌套的方法体时,你是不是脑海中出现了万只动物。请相信这不是一个人的力量,而是无数和你一样的程序员接手后经历了一样的愤怒,又不得不继续if else下去。这种烂代码是对程序员群体最大的羞辱。自己的代码永远有一个硬性要求,方法体绝不能超过100行,平均应该在10-20行之间。一个类可以重构为出更多的方法,解决不同方法的重复代码。
附图2是我收藏的重构第二版,可能是孤本,你猜猜为什么?展开等人赞过27 - 最近写书写到了influxdb,为此开发了一个数据采集、中转、流计算的Java案例程序,当做到中转和流计算的交互时,我用了两个线程和一个队列,也就是中转线程写add队列,流计算线程取poll队列,由于双方线程都是while(true),为了能达到队列没有数据就等待的效果,我又在双方线程中都搞了队列同步块、线程wait休眠和线程notifyALL唤醒,以达到双方唤醒和休眠互为切换,本质上形成了一边忙的时候,另一边就阻塞的效果。
当我志得意满的截了代码图给我的老朋友看到时候,他说:“没必要,队列用阻塞队列就行了,中转写队列用put,流计算取队列用take,线程阻塞过程让队列内部自己解决,比你自己写地要好得多。”
我听后就知道自己有多平庸了!瞬间被秒的感觉,按照阻塞队列的思路,代码中取消了一堆自己写得线程操作,不仅简洁,而且测试后,性能提升了不小。我的思路必须是一次批量写入队列多条,性能才会提升,而队列阻塞模式是只要消费端在队列中拿不到就一直阻塞等待,生产端完全不用顾及一次给队列批量写多少,这样就完全解放了生产端,完美符合我预期的目的。
总之,又深刻认识了那个道理,尽量用人家官方写好的组件,别自己重新发明轮子。#程言程语收集站#
展开赞过41