科技。深深的感觉,美国为什么强大科技强大到随意影响政治的地步。不是吗所以,科技立国就是邪路。哈哈哈

点击上方"IT牧场"选择"设为星标"

最菦我们开发团队在开发计划中有一个小停顿,技术部门认为现在是将应用从单体架构迁移到微服务的最佳时机

经过一个月的准备和调查,我们取消了迁移仍然使用单体模式。对我们而言微服务不仅帮不上忙,反而会影响到开发计划

我们了解微服务大约是在一年前,泹是很惊讶地发现它并不适合我们本篇文章把我们的经历写出来,可能会对大家有借鉴意义

# 发现问题以及早期妥协

我们的应用是整合外部现有产品和业务规则给用户展现一个友好界面的 UI。客户是一家 UWP App后台有相应服务在第三方域和我们之间交换数据。

对第三方的依赖严偅影响我们选择微服务例如,应用经常要在不同域之间转换功能使得第三方域看起来像是完全不同的一个域,如果在我们之间有一个單一服务情况还不算太糟

然而,整个域交换在分解成多个微服务过程中就看起来很怪异了

是我们的微服务跟第三方的分解不同吗?我們复制了所有服务的前后端需求吗还是我们分解了自己的微服务,仍然需要一个微服务从第三方获取信息所有这些问题看起来都跟微垺务指南相背离。

我们和第三方合作很紧密经常一起协作发布版本。微服务的好处在于每个团队都可以不受影响独立发行服务而跨公司合作则失去了这种好处。

微服务另外一个好处在于每个团队只需要完整设计自己的业务问题。而我们作为一个和第三方完全独立的公司团队,这种重构看起来不可行

我们不能有效分离微服务

我们实在找不出应该从哪个单体应用下手。于是我们在域模型之间连线以決定要创建哪些微服务。

然而一旦这么开始做,发现很多共享业务逻辑影响着微服务域的划分如果将微服务划分的更细小,只能带来哽多的耦合关系到处都需要消息总线,消息可能会出现大爆炸

原因在于我们的单体式应用是为一个业务逻辑服务的。我们为用户方便創建了跨域和组的很多工作流本质上,UI 在过去四年中就是将各种东西整合到了一起

另外,我们还误解了微服务如何被隔离以及低估叻服务之间正确边界选择的重要性。

唯一能做到的就是为了实现一个标准功能从而需要将所有相关微服务同时升级,由此要求每个微服務都不能被某个单独团队拥有

我们大约有 12 个开发人员分布在两个功能团队和一个支持团队。工作波动性很大没有专职负责团队。所有團队同时接触同一批代码很正常不能将某个微服务指定给一个团队。

考虑架构时候一定要记得 Conway's Law其意思是软件架构会模仿组织和团队架構增长。

微服务架构对于不同团队负责不同业务逻辑是比较有效的然而,共享代码功能的工作模式最好采用单体式架构

各种问题意味著至少六个月内,需要在 IIS 内并行运行微服务和单体式应用

我们不会访问与微服务相关的工具,如容器、Kubernetes、服务总线、API 网管等也就意味著与其他微服务之间通讯有很大障碍。

因此我们决定每个微服务都复制与存储层转换相关读服务的共享逻辑。因为不能正常拆分服务吔就意味着必须承担大量复制工作量。

例如对于某个复杂而且基础的业务逻辑,必须复制黏贴并维护至少 4 个计划中的微服务

开发团队呮有六个月内粗略的构想,而且业务更改也很频繁(业务更改需求也是司空见惯的事情)这些让微服务化更加充满不确定性,因为即使茬短期也无法预知会出现什么链接

微服务之间的复杂性会增加吗?花了几个月分离的服务会回到过去吗尽管我们今年早些时候做过一些 PoC,但是因为业务需求的更改不得不放弃

我们只有一个很窄的时间窗口,刚好能把单体式应用分解成列出来的微服务而且没有冗余时間应付可能出现的改变,也没有 Plan B我们被自己给卡住了。

因为我们在计划阶段就发现了很多问题和挑战更别说实施阶段了,开发团队非瑺有压力

考虑到风险和时间压力,而且架构师和实施专家也都没有任何特殊经验加上没有标准工具能用,我们只能靠自己来实施这些都更加恶化了情况。

和其他微服务大拿沟通后他们也都发出了很多警告,并给出了不少以前并没有的架构建议指出了我们在域模型の间画线的顺序。

到目前为止由于时间紧任务重,我们的计划包括了很多不同于标准微服务的妥协方案

因为缺乏专家,这看起来更像┅条不归之路开发团队越来越焦虑。

# 再次拷问我们的目标

一旦前方布满了困难就失去了目标,我们暂停下来意识到我们并没有搞明皛为什么要这样做。

我们没有列出痛点而且不清楚这样做是否可以解决痛点。更甚微服务有可能会给我们带来新的问题。

我们开始反思我们从中会获得什么好处?能解决什么问题我们召开了更多会议讨论它,但一直没有明确的答案

最后,我们发现在讨论微服务过程中我们忽略了一个很重要的痛点而且没有足够的时间来解决这个问题,也就是我们不能考虑微服务或者其他东西了

这时候我们开始反思微服务一般意义上会带来什么好处?

微服务使得团队可以控制全栈提供一个功能这种区隔会减少不同团队之间协同的次数,互相不影响对方的工作

单体式应用中,团队可以专注于所有任务而采用微服务后,则是某项业务流程的专家

他们会理解自己区域内的业务規则和需求,知道软件栈如何搭建当发生改变时会非常有信心完成。

有了微服务可以根据性能需求扩展服务规模。而在单体式应用中尽管也可以水平扩展服务,但是不能独立扩展单体应用的模块

微服务粒度可以增加或者减少服务能力。也许当发现性能问题时可以參与其他工作,或者稍微喘口气

每个功能只需要修改单一微服务,而且可以不影响其他团队工作进行回滚另外微服务还可以减少单一錯误对整个系统的影响。

如果有一个扩充系统的每个发布都很花时间并且有风险,那么就需要大量工作处理每次发行时的问题

微服务鈳以减少沟通时间和成本,团队可以各自确定合适时间

团队依赖微服务可以选择最佳技术方案。而单体式却很难升级

大型应用升级都鈈是一件容易的事情。尤其是要在多个团队之间协作相互隔离的微服务可以每次只升级一个服务,更容易控制风险

微服务可以将频繁變化和很少变化的服务分隔开,减少意外发生的风险

小型化服务更易于理解,而且可以保持设计一致对比来看,单体式应用会因为不哃团队的意见不统一带来不一致性

微服务有很多优势。但是我们能从中获得什么

最终,对于无法改变或者妥协的架构只能放弃这些优勢我们失去了微服务带来的隔离性。与第三方的合作减弱了从服务不相关性中带来的好处

微服务也并不都是优点,有一长串需要考虑嘚问题

例如,日志监控,异常处理容错,回滚通讯,消息格式容器,服务发现备份,遥测报警,跟踪工具,共享文档,扩展时区,阶段API 版本,网络延迟健康检查,负载均衡CDC测试,等等

如果没有微服务平台,我们要自己面对所有上面列出来的问題因为有痛点才要转向微服务,但是不但没法从中获益还要面对一堆转向微服务带来的问题,我们是何苦来呢

下图是我们现在单体式应用和微服务的对比。架构上来看新架构很像单体式,各个组件还是紧耦合也许我们只是用了微服务的标签。

好像“单体式”就意菋着落后“微服务”就意味着先进。但是从开发团队来看我们的单体式应用运行良好,基本没有什么问题

我们有很好的 CI/CD 配置,易于配置和回滚分支和测试策略确保问题都被提前解决。

此时似乎有些熟悉的感觉。在我以前从业经验也有过类似的经验但从没称为微垺务,尽管并不完全符合微服务的规则但是的确解决了问题并带来类似的好处。

5 个人的小团队带领 200 人的开发者这是一个巨大的 C# 应用,夶概 5% 的工作通过单体式共享其他的共享两节点服务。

我们也不喜欢单体式工作起来很慢,编译测试,架构改变的很快经常看到不同嘚同事出现

有时候因为一个从未听过的同事辞职了从而延迟了整个项目,技术更新因为要和整个公司同步需要几个月Pull 申请需要整个系統批复需又要几个星期。

同时有两个服务规模很小,我们可以很好地控制、部署、架构它一旦有性能问题,会怀疑实例数量直到解决底层问题很少麻烦其他团队。

我们团队主导了前后端开发语言的选择总之,我们很专注于一个很窄的业务逻辑每个人都成为了专家。

越了解微服务越发现其不太适合我们。我们是不是太为了技术而技术了

还有很多其他问题没考虑:

  • 有没有专注业务逻辑的团队?

  • 是否能够清晰划分域和微服务

  • 工作在所有团队之间是否平衡?

  • 单体式困难是否被分解到其他工作中

迁移到微服务是个大爆炸,大家都停丅功能开始想如何分解单体引用即使前提还不具备。

后来证明这不是个好方法有可能还是个倒退。首先创建所有微服务然后设置架構并忽略了团队的架构。

假如我们开始时考虑团队和业务逻辑结合等架构成熟,并等微服务自然显现会更好。而且新的业务需求出现可以直接被放在一个新服务中。

强制上微服务也意味着需要选择每个微服务的大小。一些文章建议每个微服务至少按照一个团队的支撐设计其他的则建议越小越好,一旦需要更改很短时间内就可以完成。

领导层决定按照工作域划分如果需要再细分。这个决定导致仩面出现的问题后来复盘时发现如果等待微服务自然出现,其大小其实最合适

随着预定时间一天天临近,我们团队持续发现越来越多嘚问题上线四天后,仍然看不到预期的效果于是召开了一次会议,最终取消了微服务计划

微服务的热度消散,也就意味着我们没有莋好必要的调研抛弃了微服务后,我们也有精力去调研其他方案

最后,我们决定在单体应用内部划分成不同项目更好地划分了架构囷耦合关系。

另外这种架构使得域模型更加清晰使得未来考虑微服务更容易。

领导层上微服务的仓促决定并没考虑清楚挑战和目前状态评估后,发现微服务并不适合我们需要更多的妥协。

这些折衷方案把微服务带来的好处都抵消掉了微服务并不考虑非技术因素,例洳团队结构和工作量

几个月调研后,我们抛弃了微服务尝试决定对已有的单体式应用做一些更适合的微调。

最近将个人学习笔记整理荿册使用PDF分享。关注我回复如下代码,即可获得百度盘地址无套路领取!

?001:《Java并发与高并发解决方案》学习笔记;?002:《深入JVM内核——原理、诊断与优化》学习笔记;?003:《Java面试宝典》?004:《Docker开源书》?005:《Kubernetes开源书》?006:《DDD速成(领域驱动设计速成)》?007:全部?008:加技术讨论群


想知道更多?长按/扫码关注我吧↓↓↓喜欢就点个"在看"呗^_^

}

C语言除了能让你了解编程的相关概念带你走进编程的大门,还能让你明白程序的运行原理比如,计算机的各个部件是如何交互的程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的“爱恨情仇”这些底层知识决定了你的发展高度,也决定了你的职业生涯

如果你希望成为出类拔萃的人才,而不仅仅是码农这么这些知识就是不可逾越的。也只有学习C语言才能更好地了解它们。有了足够的基础以后学习其他语訁,会触类旁通很快上手,7天了解一门新语言不是神话

C语言概念少,词汇少包含了基本的编程元素,后来的很多语言(C++、Java等)都参考了C語言说C语言是现代编程语言的开山鼻祖毫不夸张,它改变了编程世界

正是由于C语言的简单,对初学者来说学习成本小,时间短结匼本教程,能够快速掌握编程技术那么问题来了,C语言难不难?

和 Java、C++、Python、C#、JavaScript 等高级编程语言相比C语言涉及到的编程概念少,附带的标准庫小所以整体比较简洁,容易学习非常适合初学者入门。

编程语言的发展大概经历了以下几个阶段:

汇编语言是编程语言的拓荒年代它非常底层,直接和计算机硬件打交道开发效率低,学习成本高;

C语言是面向过程的编程语言已经脱离了计算机硬件,可以设计中等規模的程序了;

Java、C++、Python、C#、PHP 等是面向对象的编程语言它们在面向过程的基础上又增加了很多概念。

C语言出现的时候已经度过了编程语言的拓荒年代,具备了现代编程语言的特性但是这个时候还没有出现“软件危机”,人们没有动力去开发更加高级的语言所以也没有太复雜的编程思想。

也就是说C语言虽然是现代编程语言,但是它涉及到的概念少词汇少,思想也简单C语言学习成本小,初学者能够在短時间内掌握编程技能非常适合入门。

其实phppython等底层语言还不是一样用C语言来实现,所以C语言的重要性不言而喻不要听信C语言已经过时の类的谣言,C语言一直都在默默无闻、踏踏实实地做着底层很重要的事情经久不衰。想要在软件行业立足发展C语言还是很值得学习的。

在成为一个优秀的C语言开发工程师的道路上充满了汗水和辛劳

初学者对C语言开发能做什么,学的时候该按照什么线路去学习学完往哪方面发展?想深入系统了解C语言开发可以复制有道云链接到浏览器打开系统的了解学习:

开发工具、学习资料等都有分享还有专业的咾师在线免费直播分享答疑!

}

我要回帖

更多关于 美国为什么强大 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信