服务依赖

一般来讲,在拆分为微服务后。经历一段时间的业务规模发展后,我们的服务都是具有比较多的依赖。像是:

一个服务依赖其他多个服务

我们发现业务初始依赖的是 ServiceA,结果跑了一段时间后。服务依赖越来越多,还出现了更进一步依赖,Service A 依赖 B、C,他们背后又调用了一大堆的服务。

同时 ServiceA 依赖的服务,还存在跨业务组的情况,也就是一个普通的业务调用,可能关系到多个业务组的协调:

一次调用涉及 3 个业务组

虽然从图示来看,只有 3 个业务组。但,一个月前可是都是依赖自己。

说明小咸鱼作为业务组 A 的维护方,他所依赖的业务团队正在不断地增大,大家都在用力产生新的服务依赖。

假以时日,这个服务的依赖必然变的非常多(不过,小咸鱼并没有意识到这一点)。

开发环境

终于,在小咸鱼维护了一段时间后。这一个业务产品,成功走过了尝试期。他有了好几位新同事,在迭代的过程中,联调的诉求出现了。

小咸鱼麻利的利用组织里的公共开发环境搭建起了服务:

公共开发环境

小咸鱼辛辛苦苦的找了其他几个组,让大家都往上面 Push 自己的服务,解决了这一个迭代的联调的问题。

但,好景不长。业务压力总是大的,大家都维护着复数的 f 分支。这时候就遇到了新问题:

不同业务组期望依赖不同

业务组A,期望依赖的是:

  • ServiceA:v0.1.0。

  • ServiceB:v0.2.0。

  • ServiceC:v0.3.0。

业务组B,期望依赖的是:

  • ServiceA:v1.1.0。

  • ServiceB:v1.2.0。

  • ServiceC:v1.3.0。

好家伙,在同一个集成开发环境中,大家期望依赖的服务版本压根不一样。联调起来挺费劲,甚至存在一些风险。

例如:你在开发环境,联调时你以为你依赖的 ServiceB 的 v0.2.0 版本,跑的也好好的。结果其实其他业务在晚上把他更新为 v0.5.0 版本了,接口还是兼容的,但内在逻辑是变了的。当然,你也没有发现这个问题,因为是 “细微” 的修改。

但上到测试环境后,很快就会出现被测试同学打回来的情况。以此往来多了,你就会成为团队里质量不好的那一位 TOP1 了...

这问题怎么解决呢?

解决方案

针对微服务架构下的开发环境,核心还是要看公司内的基础设施建设的怎么样。

公共 dev 分支

若只是基础底蕴不够深厚,钞能力也不够的,一般会采取 dev 分支合并的方式。也就是在 ServiceA 上建立 dev 分支,专门用于集成开发环境。由开发同学配合脚本等,进行维护和应用。

虽然容易出现不同分支,影响到同一块的内容。但由于同一个 Service 一般会由 1~3 个人(小团队)经手维护,都坐在附近,基本可以控制冲突。

甚至有的小伙伴,为了谨慎起见。合并前会反向合并到自己 f 分支,再跑一遍自己的自动化接口测试,以确保正确。

当然,测试环境也是一样的问题。在业务迭代的过程中,常常有多个功能在同时开发,会拉多个分支。

  • 如果开发、测试环境只有一套,就意味着要么团队内部商量好时间。

  • 轮流使用测试环境,要把不同功能的分支代码合到某个分支再统一解冲突,再联调和测试。

这个方案只能治标,但不能完全治本。

多泳道环境

说白了,可能还是需要多套环境来解决。当你期望是某一个泳道用来发布某一个特性分支时。对应的发布系统就会给其相关联的组件打上泳道标识,自然也就能知道依赖的是谁了。

如下图:

一个服务存在多个泳道

一般客户端会带上泳道标识的 Header,再一路透传下去。所有相关 Proxy 会根据 Header 内的标识进行选择。

考虑到有的服务在功能特性中并没有变更,因此会有 master 和功能泳道的区别,会再根据 Proxy 的规则进行选择。

当然在这块也可以结合服务发现的机制去做,具体看技术选型上的差距了。

总结

微服务化后,N 个服务如何联调,就是开发人员的一个大头疼问题。而人一多,业务压力一大,很可能会出现一个服务同时多个分支并行开发的情况。

也就会导致开发、测试环境同一时间遇到这个烦人问题,我们可以通过公共分支,又或是多泳道的方式解决。

但两者都存在不同程度的缺点:

公共环境,需要公共分支,需要人为的一定介入。

多泳道环境,需要的基础设施建设较多,同时 MySQL、Redis 等公共介质也是一个问题,成本也是运维的一个考虑因素。

☞第一门编程语言的选择无关紧要?☞“我想再当一次 CEO,所以我离开了 IBM。”
☞中国 47% 程序员使用 Java、薪资中值达 21000 美元,揭晓 2021 开发者生态系统现状!

微服务的灾难:折磨人的环境!相关推荐

  1. dubbo k8s 服务发现_将Dubbo微服务迁移到k8s集群环境中前的思考与落地

    将Dubbo微服务迁移到k8s中的思考与落地 说到容器化,不得不提kubernetes这个集群编排系统,它是一个开源系统,用于容器化应用的自动部署.扩缩和管理. Kubernetes 将构成应用的容器 ...

  2. 基于.net的微服务架构下的开发测试环境运维实践

    眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...

  3. 漫画 | 只敢私下吐槽,不敢拿上台面,这才是微服务的灾难!

    公司的高层对这个通用语言用得很好 到了编程的阶段,需要转化成代码,要用英文来表达了. 从中文到英文的转换,往往丢失一部分业务信息,产生一部分信息噪音,或者发生概念上的偏移. 很快, 在不同的系统,甚至 ...

  4. Dapr微服务应用开发系列1:环境配置

    题记:上篇Dapr系列文章简要介绍了Dapr,这篇来谈一下开发和运行环境配置 本机开发环境配置 安装Docker 为了方便进行Dapr开发,最好(其实不一定必须)首先在本机(开发机器)上安装Docke ...

  5. 微服务日志配置以及在生产环境怎么查看日志?

    欢迎关注博主公众号:[矿洞程序员]文章由陈晓阳原创. 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料. Logback默认配置的步骤 (1). 尝试在 classpath下查找文 ...

  6. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理

    摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境 ...

  7. 使用阿里云ACM简化你的Spring Cloud微服务环境配置管理 1

    摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境 ...

  8. 如何用ACM简化你的Spring Cloud微服务环境配置管理

    摘要: 本文我们就如何使用阿里云ACM这样的配置管理产品在Spring Cloud中替代Spring Cloud Config帮助简化环境配置管理做一个简单的示例,帮助你理解基于ACM来简化微服务环境 ...

  9. 在公司的微服务上搞破坏真是太开心了

    这是四年前伦敦一个技术大会上的一场非常独特的分享,没想到一场技术大会上能有这么幽默的另类架构师,作者以反讽的形式举出了 10 个微服务环境下对系统搞破坏的 tips.我看了很多遍,其中的案例其实日常研 ...

最新文章

  1. UI设计师面试如何操作才能获得高薪
  2. 对抗粉尘攻击——CashShuffle正在保护BCHer隐私
  3. ssh框架点击按钮就404_设置404错误页面的5大关键因素
  4. Spring 3.2矩阵变量是什么? –第2部分:代码
  5. 从numpy里加载_PyTorch强化:01.PyTorch 数据加载和处理
  6. 让AI学习AI:自动化机器学习的概述、发展和研究意义
  7. 加油卡 格式判断 java_JAVA实验_题目8
  8. 城市天际线 android,都市天际线安卓手机版
  9. 导入项目到IDEA报javax/xml/bind/DatatypeConverter错误?
  10. java switch null,如何在switch中使用null
  11. 虚拟机安装CentOS系统详细步骤。
  12. STM32F103基于固件库创建工程模板
  13. Bada IDE编译
  14. 现在流行的少儿编程是不是再收大家的智商税?来看看最中肯的回答
  15. 用计算机术语写毕业寄语,毕业寄语大全一句话
  16. 2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践
  17. PLSql连接oracle64位
  18. revit管线插件:当前楼层怎么显示楼板以下的给排水管道?
  19. linux内存不足导致tomcat宕机
  20. FL Studio乐理教程之和弦进行

热门文章

  1. 剑指offer——2.实现Singleton模式
  2. 小技巧 ----- Java算法题中的输入输出
  3. java类装载器原理
  4. 【C++ Primer】第五章学习笔记(循环和关系表达式)
  5. Java多线程编程(1)--Java中的线程
  6. 基于ssh的多节点之间互信通信的实现
  7. JSP页面报错:“Uncaught SyntaxError: Unexpected token ”
  8. springmvc.xml或spring.xml 能运行配置文件总是出现错误
  9. Python中的传值和引用
  10. HTMO DOM部分---小练习;列表之间移动、日期选择、好友选中、滑动效果、滚动条效果、飞入飞出效果。...