微服务的时间和成本去哪儿了
<blockquote><p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613">2019 中国.NET 开发者峰会目前在国内的.NET社区还是很有影响力的,宣传的内容也都是比较新潮和前言的技术栈。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613">有一个不争的现实是基本上主题都是关于.NET Core的,以及基于该主题之上的延展。比如ML.NET相关的机器学习;基于.NET Core的微服务实战;传统转型.NET Core的实战;.NET Core在物联网的应用;.NET Core结合K8S的应用;.NET Core架构历史;.NET Core相关的云原生技术等等。可谓欣欣向荣,百花齐放,仿佛让人看到了.NET生态的重新崛起。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613">峰会的内容给开发者开启了一个明亮的窗口,但毕竟只是抛砖迎玉,真正落地开花还有很长的距离。</span></p>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613">本人在.NET Core上面落地过,对微服务也兴趣盎然,所以我重点倾听了刘腾飞老师的演讲,并做部分解读,从共鸣中写下个人感想,希望对您有所启发。</span></p>
</blockquote>
<h1 class="ql-long-13832613" data-header="2"><span class="ql-author-13832613">为什么选择微服务?</span></h1>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 虽然刘老师的说辞有点举重若轻,说的是因为执着和技术人的专研精神选择了微服务,甚至也对比和调研过,但是在只有四个人的团队里,连一张披萨都没有凑齐的前提下就“冒然”选型,显然不能让我信服。可能是刘大佬有比较充分的调研和把握,或者说有一定的技术自信。否则换成我,我是无论如何不敢带着四个缺少微服务实战经验的小伙伴贸然前进,除非我想把这个项目当成试验品。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 因为如果分层架构足够规范简单,团队规范足够精细,设计面向微服务的架构就足够解决问题,等团队和业务发展壮大后,再切换到微服务不迟。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 刘佬团队中间加过多少班,踩过多少坑,也许只有刘老师知道。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 演讲中插曲说:有一次加班到凌晨3点多,然后一起出来吃火锅。我听完除了敬佩还是敬佩。有句话叫哪里有岁月静好,因为有人替你负载前行。</span></p>
<h1 class="ql-long-13832613" data-header="2"><span class="ql-author-13832613">微服务难在哪里?</span></h1>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613"> 因为微服务确实需要比较高的门槛,具体可以参考我的另外一篇文章《漫谈何时从单体架构迁移到微服务?<span class="ql-author-13832613">》</span></span></p>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613"> 微服务的基础设施包括:</span></p>
<ul>
<li><span class="ql-author-13832613">CI、CD,限流,熔断,管理协作,分布式技术,</span></li>
<li><span class="ql-author-13832613">网关,服务监控,日志收集,重复代码</span></li>
<li><span class="ql-author-13832613">配置中心,负载均衡,发布成本</span></li>
<li><span class="ql-author-13832613">领域划分和明确</span></li>
<li><span class="ql-author-13832613">容器相关技术栈等等</span></li>
</ul>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 也就是说对于服务来说,单个服务变得简单,整体服务变得复杂。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 这些菜都端上来,如果没有很好的技术储备和高效管理和协作,估计是要不消化的。重点是刘大佬在演讲最后,仍然没有给提问者一个很好的关于<strong class="ql-author-13832613">分布式事务</strong><span class="ql-author-13832613">的解决方案。</span></span></p>
<h1 class="ql-long-13832613" data-header="2"><span class="ql-author-13832613">如何降低微服务的成本?</span></h1>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 这里的目的是探讨如何降低成本,所以我们必须要面对这些困难,一个一个的去解决。当这些困难的成本和单体一致或持续的接近单体的时候,我觉得上微服务就胸有成竹了。</span></p>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613"> 为此我们必须要梳理并识别以上的技术难点,这里挑选最核心的或者说最影响时间成本的点来展开。</span></p>
<h3 class="ql-long-13832613" data-header="3"><span style="color: rgba(255, 0, 0, 1)"><strong><span class="ql-author-13832613">引入K8S</span></strong></span></h3>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 面对JAVA的SPRING全家桶,刘佬采用K8S来解决,也就是说K8S自带微服务等大部分基础设施,比如配置中心不一定要用Appolo,使用K8S的ConfigMap就可以了;服务发现和注册也是K8S自带的。K8S解决了基础设施一半以上的问题,这个成本是非常低的。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 也就是说对微服务的学习成本,变成了对K8S的学习成本。这对开发人员来说是个福音,因为可以有现成的轮子,但是也不能高兴太早,因为K8S并不是一个容易掌握的技术。可以说K8S内容庞杂,官方文档也是大而全,想要一下子掌握它非一日之寒。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 剩下的另外一半成本在哪儿?我觉得服务划分,服务调用,相关提效工具的使用等等。</span></p>
<h3 class="ql-long-13832613" data-header="3"><span class="ql-author-13832613">服务划分</span></h3>
<p><span class="ql-author-13832613"> 前期服务的划分,包括基础服务,核心服务,网关选型,全链路监控等技术栈。包括但不限于如下表所示:</span></p>
<div class="ql-long-13832613" data-header="3"><img src="https://img2018.cnblogs.com/blog/127185/201912/127185-20191219144209939-1959941573.png" alt="">
<h3><strong class="ql-author-13832613">服务调用:</strong></h3>
<ul>
<li><span class="ql-author-13832613">服务在相互调用的时候,难免会产生重复模型,比如DTO。</span></li>
<li><span class="ql-author-13832613">使用HTTP请求的性能不足问题</span></li>
<li><span class="ql-author-13832613">采用gRPC</span>
<ul>
<li><span class="ql-author-13832613">采用gRPC后服务开发解决单体开发,减少冗余的代码,做到分布式部署和本地部署。</span></li>
<li><span class="ql-author-13832613">分布式跨服务访问,读写操作做分离,尽量只做查询,POST操作走异步消息事件。</span></li>
</ul>
</li>
</ul>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 刘佬提到的服务调用连续迭代了三个版本,这个坑给我很大启发,虽然我目前的服务没有采用gRPC,但是模型的代码重复已经开始冗余了。代码冗余不可避免,有没有更好的解决方案呢?有些人会觉得引入Abp框架来解决,最新的Abp Next。这是很好的轮子,但是问题又来了,Abp Next和K8S一样,如果团队没有好的研发型人员或者对Abp的使用有过几个项目垫底的人,那么Abp的引入可能会增加技术的复杂度,因为Abp在性能方面也是有坑的,何况Abp Next目前也在跟着迭代,文档都不是很健全。</span></p>
</div>
<h3 class="ql-long-13832613" data-header="3"><strong><span class="ql-author-13832613" style="color: rgba(255, 0, 0, 1)">工具使用</span></strong></h3>
<p><strong><span class="ql-author-13832613" style="color: rgba(255, 0, 0, 1)"> </span></strong><span class="ql-author-13832613" style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">工具是微服务基础设施的一部分,比如基于gitLab的CI,CD或者jenkins。都是服务自动化发布的利器。另外API接口膨胀后的管理,联调,测试,规范等等,如果没有管好API,前后端分离往往会降低我们的开发效率,因为互相等待是常有的事情,就算模拟好数据后,也不能保证不去做联调。</span></span></p>
<div class="ql-long-13832613" data-header="2"><span class="ql-author-13832613"><span class="ql-author-13832613"><span class="ql-author-13832613"><img src="https://img2018.cnblogs.com/blog/127185/201912/127185-20191219144255502-1923520858.png" alt=""></span></span></span></div>
<div class="ql-long-13832613" data-header="2">
<h1>终极价值</h1>
<p> 刘佬说:“微服务的终极价值在于服务的任意拼装组合。“</p>
<p> 好比乐高积木,比起单体粗苯的代码调整,显然是高效率解放生产力的。这种价值其实并不新鲜,从历史的维度看,从最小的函数封装,抽象,设计模式,类库,到进程交互,到最后亚马逊的微服务发明,无不在学习乐高思想。只是随着业务复杂度的增加,团队规模的膨胀,这个乐高的粒度不断的变大,变远,最后跨进程,跨域,分布式。</p>
</div>
<h1 class="ql-long-13832613" data-header="2"><span class="ql-author-13832613">提问和启发:</span></h1>
<p><span class="ql-author-13832613"> 在演讲结束的提问环节,问了三个问题我觉得很有质量,也是难点。</span></p>
<h3 class="ql-long-13832613" data-header="3"><strong class="ql-author-13832613">如何保持数据一致性?</strong></h3>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 刘佬的项目在数据一致性这块没有落地,具体原因没说明,但是我预估当初是业务优先所做的妥协。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 分布式事务具备一定的复杂性,是个很大的话题。分布式事务一般采用的是最终一致性,也就是CAP里面的三选二,通过牺牲实时来保证业务的高可用性。电商中如果不涉及到资金安全,比如虚拟钱包和货币等核心业务功能,一般不影响使用。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 而这里的最终一致性要落地好,技术上虽然不难,但是要落地完整,需要不少时间。</span></p>
<h3 class="ql-long-13832613" data-header="3"><span class="ql-author-13832613">如何解决K8S服务干扰?</span></h3>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 某个服务因为各种原因,比如代码不够健壮导致,或者因为ES的大内存需求,导致集群其他服务异常,甚至整个集群垮掉该如何解决?</span></p>
<ul>
<li><span class="ql-author-13832613">容器资源限制</span></li>
<li><span class="ql-author-13832613">核心服务抽离</span></li>
</ul>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 主要采用资源限制,但是资源限制会导致某个容器挂掉。可以通过<strong class="ql-author-13832613">资源告警和日志分析</strong><span class="ql-author-13832613">的方式快速定位容器并进行资源重新伸缩分配,特别是在生产环境。</span></span></p>
<h3 class="ql-long-13832613" data-header="3"><span class="ql-author-13832613">如何解决数据库运维?</span></h3>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 随着数据库和服务一起拆分,数据库也变多了,给数据库运维带来了极大挑战。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 拆分的痛点是表关联查询,因为所有的聚合都是服务的聚合,也就是数据库的Join没有了,替换成的是服务间的关联了,所以刘佬干脆弃用MySQL,全部采用MongoDB,充分发挥MongoDB优势。</span></p>
<p class="ql-long-13832613 ql-text-indent-1"><span class="ql-author-13832613"> 但是接下来的代价就是统计和报表的生成,这个难题也不复杂,可以通过数据同步,把MongoDB的数据同步到关系型数据库当中。</span></p>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613"> 对于业务统计或用户行为事件,会产生很大的数据量,可以在服务入口处做探针,比如在用户访问,下订单服务处埋点,把访问和统计数据同步到ES,发挥ES的威力,最后通过Dashboard来进行显示。</span></p>
<p class="ql-text-indent-1 ql-long-13832613"><span class="ql-author-13832613"> ppt</span></p>
</div>
<div id="MySignature" role="contentinfo">
<div style="padding: 10px 10px 10px 20px; border: 1px dashed #333; font-family: 微软雅黑; font-size: 12px" id="mySignature">
<!-- <span style="font-size: 10pt">希望以上分享对你有所帮助,感谢您的捧场。</span>-->
<br>
<strong><span style="font-size: 10pt">个人微信:</span></strong>沟通创造快乐,分享带来价值 <br>
<img src="https://images.cnblogs.com/cnblogs_com/jackyfei/1334006/o_221116135151_WechatIMG37.jpeg" width="150" height="150"> <br/>
<!--<strong><span style="font-size: 10pt">知识星球:</span></strong>为您提供更多更全的增值服务 <br> -->
<img src="https://images.cnblogs.com/cnblogs_com/jackyfei/1334006/o_250818073320_zsxq.jpg" width="150" height="150">
<!--<strong><span style="font-size: 10pt">我的视频:</span></strong><span style="color:#F39019">ABP vNext视频系列</span> <br>-->
<br>
个人作品:
数字基座 /
云身份认证授权
<!--我的视频 <br/>--><br>
QQ交流群 |
<!--知识星球-->
<br>
<p></p><div class="reward-btn">
<strong>打赏支持</strong>
</div>
<p></p></div><br><br>
来源:https://www.cnblogs.com/jackyfei/p/12067708.html
頁:
[1]