小程故事多 | 看来微服务就是一把双刃剑
微服务是银弹吗?自2014年“微服务”一词真是越来越火,不谈Microservices彷佛就out了,那么我们先来看微服务具有哪些特点:
组件以服务的形式提供
围绕业务功能进行组织
强化终端与弱化管道
产品而不是项目
独立布署
单一职责
去中心化
DevOps与组织架构
我要讲的故事开始了
A公司的技术架构体系目前还是以集群扩展体系为主,我们可以看下图所示,在这种体系结构中,可以看到应用都是单块结构,但是单块结构的应用具有扩展性,通过布署在多个Tomcat上实现应用的集群,所有的应用都去访问同一个数据库(这个库可以假设为Oracle数据库),数据库间采用DataGuard来实现主从同步,读库只具有读取功能,为后台数据统计功能提供数据查询和统计服务。目前业务请求的并发量每分钟有几十笔交易,看起来这套架构还是能够支撑目前的业务发展的。
突然有一天客户在做活动的时候,监控中心各种告警,在每分钟500tps的时候很多请求超时,监控显示目前的服务器不能支撑这么大的并发量,于是快速增加服务器布署应用上线,发现根本没用,加了和没加一样,加几台都一样,运维和DBA发现此时的数据库压力非常大,好不容易熬过这段是时间后,团队成员痛定思痛一致认为,目前的架构体系已经不能支持业务的发展,微服务开始快速推进。
其中微服务的数据去中心化核心要点是:
每个微服务有自己私有的数据库持久化业务数据。
每个微服务只能访问自己的数据库,而不能访问其它服务的数据库。
某些业务场景下,需要在一个事务中更新多个数据库。这种情况也不能直接访问其它微服务的数据库,而是通过对于微服务进行操作。
数据的去中心化,进一步降低了微服务之间的耦合度。
最终经过服务化改进后,变成了如下图所示的样子:
上图看起来是不是很棒,服务拆分是不是很清晰?
于是问题随后就来了:
1、以前团队一共就10个人只负责一二个项目,现在突然增加到平均每人维护二三个项目,上线还是采用由运维手工打war包上线,如果有修改的配置文件,则运维同学一台一台的进行修改,不仅容易上线出错,而且每次上线都会搞到半夜。
2、根据上面提到的数据去中心化原则,数据库拆分出来了,一个服务一个数据库实例,但是对后台统计系统来说就是恶梦,数据库拆分出来了统计工作、报表工作该怎么办呢?这部分工作还做不做呢?有人说可以分开统计啊,一个库一个库的来,可是这样的工作量将是巨大的。
3、机房的双活问题,对于金融公司来说双活还是很关键的一项技术指标,对于应用双活来说,其实还是比较容易实现,但是对于数据库来说确是一个技术问题了,对于oracle数据库来说,用oracle官方提供的OGG(Oracle GoldenGate)来进行数据同步的话,根据论坛上面查看的资料可以看出,OGG坑非常多,而且也容易丢数据,更重要的是贵。。。采用oracle的logminer来进行同步,同步的数据将不是实时的,会有一定延时而且在定时读取方面的工作上还需要自己进行开发,采用oracle的DataGuard也只能做主从同步,却不能做主主双活。于是通过调研过后,最终还是决定自己独立开发。
4、使用Dubbo或者Spring cloud就是微服务了吗?好吧,使用了Dubbo以后发现还有非常多的工作需要做,Dubbo只是一个服务治理框架而已,还需要开发分布式调用监控系统、统一配置管理中心,统一定时调度,还要在每个服务中做防重幂等,还要做并发限流,缓存也要根据不同的服务做隔离等等工作。。。
那我们用Spring cloud做一个大一统的整合可以吗?于是看到Spring cloud原来有这些坑啊:
注册IP问题
早期的Spring Cloud Eureka在注册获取网卡IP时,不能区分外网网卡和内网网卡,如果安装了虚拟机和docker也不能区分虚拟网卡,每次启动注册的IP都有可能不一样,如果要注册为外网网卡IP,那运行带宽就不够,这个bug应该说是比较严重的问题,因此重写了网卡IP获取的逻辑来解决,同时也反馈给了spring cloud团队,再后期的版本中添加了网卡接口排序和通过名称过滤的功能来得到解决。
HealthCheck的问题
在一些极小概率的情况下,会导致Eureka Server 下线微服务实例,出现“Remote status from Eureka server is down”的问题,即便是重启微服务也无济于事,不过已经有码友在spring cloud 官方github贴出了解决方法的issue。
Feign使用不当带来的性能问题
其他的小坑也就忍了,大坑却不能。。。。于是去各大社区讨论发现原来大家都对Cloud的不少组件进行了二次封装。。。
回顾一下
上面用了很大的篇幅各种吐槽,那么我们说微服务好吗?我一直坚持认为微服务很好,但是如果我们为了使用微服务而使用的话将会伤其自身,从单块系统到微服务的是需要逐步演进的过程,如果前期没有调研,没有一个整体规划,后期在做的时候会发现,需要做的事情只会越来越多,尤其是对于快速发展的创业型公司来说。另外针对项目上线的问题,根据微服务的发展来说使用devops进行CI和CD后就可以解决现有问题,还可以采用Docker解决容器化问题,但围绕微服务所做的周边工作确实巨大的工作量,换句话说,我们不懂Docker怎么办,这就需要大量的时间来做研究和试错,当然如果公司很有钱也可以购买这样的服务,总之成本是很高的。
就拿我上面举的例子来看,数据库自身压力大,经过分析看出其实是很多sql没有加索引,大量使用数据库悲观锁,大表的数据一直长期积累没有迁移出去所致。当单块系统遇到了性能问题后,如果认真分析了性能的根源,也许还会为我们做服务化演进争取了更多的时间。
最后想说一句,对于中小公司来说,如果业务发展非常快速,人员不足的情况下,我们更需要的是在业务发展和架构优化间做平衡,逐步演进,而不是快速使用。
来源:中生代技术
原文链接
小程故事多 | 看来微服务就是一把双刃剑相关推荐
- 微服务系列 - 转贴: 看来微服务就是一把双刃剑
http://www.spring4all.com/article/603 看来微服务就是一把双刃剑 微服务是银弹吗?自2014年"微服务"一词真是越来越火,不谈Microserv ...
- 微服务就是一把双刃剑
微服务是银弹吗?自2014年"微服务"一词真是越来越火,不谈Microservices彷佛就out了,那么我们先来看微服务具有哪些特点: 组件以服务的形式提供 围绕业务功能进行组织 ...
- 看来微服务就是一把双刃剑
微服务是银弹吗?自2014年"微服务"一词真是越来越火,不谈Microservices彷佛就out了,那么我们先来看微服务具有哪些特点: 组件以服务的形式提供 围绕业务功能进行组织 ...
- uni-app开发微信小程使用腾讯位置服务获取用户的位置信息
uni-app开发微信小程使用腾讯位置服务获取用户的位置信息 一.开通腾讯位置服务 二.编码实现 (一)获取定位坐标 (二).在项目中使用 一.开通腾讯位置服务 在这里我们先要登录腾讯我i之服务的官网 ...
- 7:第三章:电商工程分析:2:电商工程业务解读与微服务拆分;
说明: (1)本篇博客内容:[先了解一下,电商系统应该包含哪些业务]→[然后,结合微服务架构思想和原则,对电商系统的业务进行拆分]: (2)在实际中,这部分工作一般都是大佬干的,一般人hold不住: ...
- 微服务架构 接口交互问题_架构师的故事:设计微服务架构
架构师在软件项目中的作用是提供待解决问题的工作模型.架构师的工作是提供脚手架,开发人员将根据这些脚手架构建他们的代码,使应用程序所有部件都组合在一起. 在构建微服务架构时,项目的架构师主要关注以下3个 ...
- 程序人家:你的老板逼你上微服务了吗??
可均可可 读完需要 10 分钟 速读仅需 3 分钟 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能.高吞吐率.高稳定性.高扩展等特性提出了更高的要求. 可以说业务需求是软件架构能 ...
- 浅析微服务架构应该在什么时候采用
前言 微服务不能"包治百病". 时下微服务是一个不错的架构,它具备模块化.可伸缩和高容错这些优点.许多公司都采用微服务架构并取得了巨大的成功,自然而然地,如果你正开始一个新项目,微 ...
- 什么时候不要采用微服务架构
微服务不能"包治百病". 时下微服务是一个不错的架构,它具备模块化.可伸缩和高容错这些优点.许多公司都采用微服务架构并取得了巨大的成功,自然而然地,如果你正开始一个新项目,微服务似 ...
最新文章
- 计算机行业越来越卷,AI都会刷LeetCode了,网友:比我强
- python读取excel日期内容读出来是数字-Python读取Excel,日期列读出来是数字的处理...
- 004_Ajax服务器响应
- 2020-11-8(activity状态以及任务栈)
- 【262】pscp命令 实现windows与linux互传文件
- css不换行属性_那些不常见,但却非常实用的 css 属性
- java基础----数字签名算法的介绍
- RabbitMQ集群(单机多实例部署)
- mysql 免密码进入_MySQL 5.7 三种免密码登录
- PHP 数字缩短(最多1倍)与还原
- TOJ1017: Tour Guide
- java-net-php-python-jsp大麦公司网上拍卖商城计算机毕业设计程序
- php shuffle有种子吗6,6个BT种子网站,没有它找不到的资源!太少人知道了怪可惜的...
- 数据库MySQL学习心得
- 计算机论文注释范例,论文注释的标准格式范例(范例详解论文正确书写规范)...
- PCB电路板EN 45545-2:2020最新标准的测试要求
- 听说你还在纠结自己没访问量?成不了“博客专家”?
- 从svn拉下的代码无状态图标(绿色对勾)的解决方法
- [c语言]c语言中的#和##作用、参数表省略号作用
- 前端入门 02:HTML入门
热门文章
- 注册表中修改桌面背景
- 达梦数据对比工具VERI对oracle11gR2与oracle11gR2的实时同步后对比验证测试
- A Database Error Occurred Error Number:0
- 对偶理论和灵敏度分析---线性规划的对偶理论
- 谈谈IT公司员工猝死和IT公司的加班文化
- 七大Linux桌面介绍:Unity、KDE、GNOME等等
- vue2 使用富文本插件 vue-tinymce(tinymce)
- php groupby后找最大时间,pandas获取groupby分组里最大值所在的行方法
- 基于matlab的图象拼接--数字图像拼接技术
- electron项目打包成dmg