微服务的时间和成本去哪儿了

2019 中国.NET 开发者峰会目前在国内的.NET社区还是很有影响力的,宣传的内容也都是比较新潮和前言的技术栈。

有一个不争的现实是基本上主题都是关于.NET Core的,以及基于该主题之上的延展。比如ML.NET相关的机器学习;基于.NET Core的微服务实战;传统转型.NET Core的实战;.NET Core在物联网的应用;.NET Core结合K8S的应用;.NET Core架构历史;.NET Core相关的云原生技术等等。可谓欣欣向荣,百花齐放,仿佛让人看到了.NET生态的重新崛起。

峰会的内容给开发者开启了一个明亮的窗口,但毕竟只是抛砖迎玉,真正落地开花还有很长的距离。

本人在.NET Core上面落地过,对微服务也兴味黯然,所以我重点倾听了刘腾飞老师的演讲,并做部分解读,从共鸣中写下个人感想,希望对您有所启发。

为什么选择微服务?

  虽然刘老师的说辞有点举重若轻,说的是因为执着和技术人的专研精神选择了微服务,甚至也对比和调研过,但是在只有四个人的团队里,连一张披萨都没有凑齐的前提下就“冒然”选型,显然不能让我信服。可能是刘大佬有比较充分的调研和把握,或者说有一定的技术自信。否则换成我,我是无论如何不敢带着四个缺少微服务实战经验的小伙伴贸然前进,除非我想把这个项目当成试验品。

  因为如果分层架构足够规范简单,团队规范足够精细,设计面向微服务的架构就足够解决问题,等团队和业务发展壮大后,再切换到微服务不迟。

  刘佬团队中间加过多少班,踩过多少坑,也许只有刘老师知道。

  演讲中插曲说:有一次加班到凌晨3点多,然后一起出来吃火锅。我听完除了敬佩还是敬佩。有句话叫哪里有岁月静好,因为有人替你负载前行。

微服务难在哪里?

  因为微服务确实需要比较高的门槛,具体可以参考我的另外一篇文章《漫谈何时从单体架构迁移到微服务?》

  微服务的基础设施包括:

  • CI、CD,限流,熔断,管理协作,分布式技术,

  • 网关,服务监控,日志收集,重复代码

  • 配置中心,负载均衡,发布成本

  • 领域划分和明确

  • 容器相关技术栈等等

  也就是说对于服务来说,单个服务变得简单,整体服务变得复杂。

  这些菜都端上来,如果没有很好的技术储备和高效管理和协作,估计是要不消化的。重点是刘大佬在演讲最后,仍然没有给提问者一个很好的关于分布式事务的解决方案。

如何降低微服务的成本?

  这里的目的是探讨如何降低成本,所以我们必须要面对这些困难,一个一个的去解决。当这些困难的成本和单体一致或持续的接近单体的时候,我觉得上微服务就胸有成竹了。

  为此我们必须要梳理并识别以上的技术难点,这里挑选最核心的或者说最影响时间成本的点来展开。

引入K8S

  面对JAVA的SPRING全家桶,刘佬采用K8S来解决,也就是说K8S自带微服务等大部分基础设施,比如配置中心不一定要用Appolo,使用K8S的ConfigMap就可以了;服务发现和注册也是K8S自带的。K8S解决了基础设施一半以上的问题,这个成本是非常低的。

  也就是说对微服务的学习成本,变成了对K8S的学习成本。这对开发人员来说是个福音,因为可以有现成的轮子,但是也不能高兴太早,因为K8S并不是一个容易掌握的技术。可以说K8S内容庞杂,官方文档也是大而全,想要一下子掌握它非一日之寒。

  剩下的另外一半成本在哪儿?我觉得服务划分,服务调用,相关提效工具的使用等等。

服务划分

  前期服务的划分,包括基础服务,核心服务,网关选型,全链路监控等技术栈。包括但不限于如下表所示:

 

服务调用:

  • 服务在相互调用的时候,难免会产生重复模型,比如DTO。

  • 使用HTTP请求的性能不足问题

  • 采用gRPC

    • 采用gRPC后服务开发解决单体开发,减少冗余的代码,做到分布式部署和本地部署。

    • 分布式跨服务访问,读写操作做分离,尽量只做查询,POST操作走异步消息事件。

  刘佬提到的服务调用连续迭代了三个版本,这个坑给我很大启发,虽然我目前的服务没有采用gRPC,但是模型的代码重复已经开始冗余了。代码冗余不可避免,有没有更好的解决方案呢?有些人会觉得引入Abp框架来解决,最新的Abp Next。这是很好的轮子,但是问题又来了,Abp Next和K8S一样,如果团队没有好的研发型人员或者对Abp的使用有过几个项目垫底的人,那么Abp的引入可能会增加技术的复杂度,因为Abp在性能方面也是有坑的,何况Abp Next目前也在跟着迭代,文档都不是很健全。

工具使用

  工具是微服务基础设施的一部分,比如基于gitLab的CI,CD或者jenkins。都是服务自动化发布的利器。另外API接口膨胀后的管理,联调,测试,规范等等,如果没有管好API,前后端分离往往会降低我们的开发效率,因为互相等待是常有的事情,就算模拟好数据后,也不能保证不去做联调。

终极价值

  刘佬说:“微服务的终极价值在于服务的任意拼装组合。“

  好比乐高积木,比起单体粗苯的代码调整,显然是高效率解放生产力的。这种价值其实并不新鲜,从历史的维度看,从最小的函数封装,抽象,设计模式,类库,到进程交互,到最后亚马逊的微服务发明,无不在学习乐高思想。只是随着业务复杂度的增加,团队规模的膨胀,这个乐高的粒度不断的变大,变远,最后跨进程,跨域,分布式。

提问和启发:

  在演讲结束的提问环节,问了三个问题我觉得很有质量,也是难点。

如何保持数据一致性?

  刘佬的项目在数据一致性这块没有落地,具体原因没说明,但是我预估当初是业务优先所做的妥协。

  分布式事务具备一定的复杂性,是个很大的话题。分布式事务一般采用的是最终一致性,也就是CAP里面的三选二,通过牺牲实时来保证业务的高可用性。电商中如果不涉及到资金安全,比如虚拟钱包和货币等核心业务功能,一般不影响使用。

  而这里的最终一致性要落地好,技术上虽然不难,但是要落地完整,需要不少时间。

如何解决K8S服务干扰?

  某个服务因为各种原因,比如代码不够健壮导致,或者因为ES的大内存需求,导致集群其他服务异常,甚至整个集群垮掉该如何解决?

  • 容器资源限制

  • 核心服务抽离

  主要采用资源限制,但是资源限制会导致某个容器挂掉。可以通过资源告警和日志分析的方式快速定位容器并进行资源重新伸缩分配,特别是在生产环境。

如何解决数据库运维?

  随着数据库和服务一起拆分,数据库也变多了,给数据库运维带来了极大挑战。

  拆分的痛点是表关联查询,因为所有的聚合都是服务的聚合,也就是数据库的Join没有了,替换成的是服务间的关联了,所以刘佬干脆弃用MySQL,全部采用MongoDB,充分发挥MongoDB优势。

  但是接下来的代价就是统计和报表的生成,这个难题也不复杂,可以通过数据同步,把MongoDB的数据同步到关系型数据库当中。

  对于业务统计或用户行为事件,会产生很大的数据量,可以在服务入口处做探针,比如在用户访问,下订单服务处埋点,把访问和统计数据同步到ES,发挥ES的威力,最后通过Dashboard来进行显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 1109.航班预定统计 差分

思路&#xff1a; 这道题假如要用暴力的方法&#xff0c;是过不去的。要使用差分的思想&#xff0c;创建一个差数组。因为本道题初始的座位数是0&#xff0c;直接建立一个全0数组即可。 参考代码&#xff1a; class Solution { public:vector<int> corpFlightBookings(…

自定义滚动条(Custom ScrollBar)

时间如流水&#xff0c;只能流去不流回&#xff01; 点赞再看&#xff0c;养成习惯&#xff0c;这是您给我创作的动力&#xff01; 本文 Dotnet9 https://dotnet9.com 已收录&#xff0c;站长乐于分享dotnet相关技术&#xff0c;比如Winform、WPF、ASP.NET Core等&#xff0c;亦…

Leetcode 1094.拼车 差分

思路&#xff1a; 这道题有很多种解法&#xff0c;刚好最近在学差分&#xff0c;就用差分做吧。首先是初始没有乘客&#xff0c;差分diff数组各项为0&#xff0c;不用求差构造差分数组了。接着是每一次乘车方案&#xff0c;起点站需要加上乘客数&#xff0c;终点站需要减去乘客…

用ASP.NET Core构建可检测的高可用服务--学习笔记

摘要随着现代化微服务架构的发展&#xff0c;系统故障的定位与快速恢复面临着诸多挑战&#xff0c;构建可检测的服务&#xff0c;帮助线上保障团队时刻掌控应用的运行状况越来越重要。本次分享会讲解如何让 ASP .NET Core 应用与现代化云基础设施完美融合&#xff0c;提升服务的…

Leetcode 34.在排序数组中查找元素的第一个和最后一个位置 二分

第一种方法&#xff0c;比较简单&#xff0c;左边界查找使用C的upper_bound()函数&#xff0c;右边界从左边界开始往下查找。 参考代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {vector<int> re…

[功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用...

转眼间&#xff0c;Excel催化剂推出已经两周年&#xff0c;在此之际&#xff0c;献上数据时代最刚需的网页采集功能&#xff0c;无需苦苦寻觅各种工具&#xff0c;借助Excel催化剂过往数据处理、清洗功能&#xff0c;加上此轮的网页采集功能&#xff0c;一点不输于市面上的各种…

Leetcode 35.搜索插入位置 二分

题目链接 思路&#xff1a; 是常规的二分法&#xff0c; 需要注意的是&#xff0c;当数字不存在的时候&#xff0c;需要返回插入该数进序列并保持有序的位置&#xff0c;即返回的是最后一个小于查找数target的位置。二分查找最后结束的位置&#xff0c;即退出循环时的左边界或…

.NET Core 微服务学习与实践系列文章目录索引(2019版)

Photo &#xff1a;.NET Core文 | Edison Zhou2018年&#xff0c;我开始学习和实践.NET Core&#xff0c;并开始了微服务的学习&#xff0c;以及通过各种开源组件搭建服务治理技术方案&#xff0c;并在学习过程中总结了一个.NET Core微服务学习与实践系列文章&#xff0c;涵盖了…

蓝桥杯 子串分值 递推

思路&#xff1a; 本题有点难想&#xff0c;采用贡献和的思想。首先需要定义一个last数组&#xff0c;用于记录当前遍历的字母s[i]上一次出现在字符串s中的位置。接着遍历数组&#xff0c;计算每一个字母的贡献值。 参考代码&#xff1a; #include<bits/stdc.h> #defi…

dapr微服务.net sdk入门

Actors入门先决条件.Net Core SDK 3.0Dapr CLIDapr DotNet SDK概述本文档描述如何在客户端应用程序上创建Actor&#xff08;MyActor&#xff09;并调用其方法.MyActor --- MyActor.Interfaces|- MyActorService|- MyActorClient接口项目&#xff08;\MyActor\MyActor.Interface…

TPL Dataflow组件应对高并发,低延迟要求

长话短说2C互联网业务增长&#xff0c;单机多核的共享内存模式带来的排障问题、编程困难&#xff1b;随着多核时代和分布式系统的到来&#xff0c;共享模型已经不太适合并发编程&#xff0c;因此actor-based模型又重新受到了人们的重视。---------------------------调试过多线…

蓝桥杯 递增三元组 二分

参考代码&#xff1a; #include<bits/stdc.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; ll cnt 0; int a[100005], b[100005], c[100005];int main() {ios::sync_with_stdio(false); int n;cin >> n;for(int i 0; i < n; i)cin…

蓝桥杯 人物相关性分析 二分

思路&#xff1a; 这道题是常规的模拟题&#xff0c;根据题意写出相关代码即可。模拟题一般容易在边界条件上出错&#xff0c;建议自己设计几个样例测试一下。这题纯暴力的方法不能通过所有的测试点&#xff0c;对于最后的查询&#xff0c;应该使用二分查找&#xff0c;这样算法…

abp模块生命周期设计思路剖析

abp中将生命周期事件抽象为4个接口&#xff1a;//预初始化 public interface IOnPreApplicationInitialization {void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context); }//初始化 public interface IOnApplicationInitialization {void …

蓝桥杯 迷宫与陷阱 BFS

参考代码&#xff1a; #include<bits/stdc.h> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; struct node{int x, y, step, ticket;node(int a, int b, ll c, int d){xa, yb, stepc, ticketd;} }; queue<node> q; bool vis[1005][1005]; i…

.Net Core + 微信赋能企业级智能客服系统--学习笔记

摘要围绕目前需求猛增的微信及移动端企业智能客服业务&#xff0c;利用 .NET Core 的一系列优秀特性及 SignalR 模块打造全双工、跨微信/QQ/钉钉等应用平台、跨系统平台、跨终端、支持企业级并发的移动端客服系统。讲师介绍目录微信应用生态简介微信小程序基础通讯原理Senparc.…

基于docker-compose的Gitlab CI/CD实践排坑指南

长话短说经过长时间实操验证&#xff0c;终于完成基于Gitlab的CI/CD实践&#xff0c;本次实践的坑位很多&#xff0c; 实操过程尽量接近最佳实践&#xff08;不做hack, 不做骚操作&#xff09;&#xff0c;记录下来加深理解。看过博客园《docker-compose真香》一文的园友留意到…

Is It a Complete AVL Tree AVL树

思路&#xff1a; 考察的点是建立AVL树以及如何判断是否为满二叉树。 建立AVL树需要搞清楚LL、LR、RR、RL四种情况如何左旋和右旋&#xff0c;如下&#xff1a; 类型BF条件操作LLBF(root)2,BF(root->lchild)1root右旋LRBF(root)2,BF(root->lchild)-1先root->lchild左…

AcWing 删减 栈思想

思路&#xff1a; 这道题要是不卡时间复杂度&#xff0c;是道大水题&#xff0c;然而字符串的长度到了6次方&#xff0c;若使用string中的erase函数&#xff0c;看似时间复杂度不高&#xff0c;其实&#xff0c;每次删除子字符串后&#xff0c;后边的字符串需要移动到前面来&am…

读《可复制的领导力》

最近很忙&#xff0c;是特别忙&#xff0c;连上厕所的时间都在回复着各种消息&#xff0c;但还是挤时间看完了《可复制的领导力》&#xff0c;这本书也是领导推荐的。说起领导力&#xff0c;大多数人都会觉得得靠悟&#xff0c;并不能做到言传身教&#xff0c;但书名中却提到了…