一、什么是微服务
微服务就是一些协同工作的小而自治的服务。它有以下两个特性:
1. 很小,专注于做好一件事
在单体应用时代,我们把所有的业务模块都写在一个系统内,随着新功能的增加,系统的代码库会越来越大,以至于想要知道该在什么地方做修改都很困难。虽然系统内划分了模块,但事实上这些模块的界限可能很难维护,相似的代码随处可见,使得修复 bug 或实现更加困难。
内聚性是指把因相同原因而变化的东西聚合到一起,把不同原因而变化的东西分离开来。微服务将这个理念应用在独立的服务上,根据业务的边界来确定服务的边界,这样就很容易确定某个功能应该放在哪个服务中。根据业务模块拆分之后就可以很好的避免由于系统代码库过大而衍生出来的相关问题。
关于服务拆分的粒度问题,需要考虑的因素:服务越小,微服务架构的优点和缺点也就越明显。服务越小,独立性带来的好处就越多,但是管理大量的服务也会越复杂。
2. 自治性
微服务是一个独立的实体,可以独立的部署,服务之间通过网络调用进行通信。对于一个服务来说,我们需要考虑的是什么应该暴露,什么应该隐藏。如果暴露得过多,那么服务消费方会与该服务的内部实现产生耦合,从而降低服务的自治性。
二、微服务带来的好处
1. 技术异构性
我们可以在不同的服务中选择合适该服务的技术实现。
2. 弹性
在单体系统中,如果部署系统的服务器出了故障或者系统内某个模块的功能代码导致 CPU/ 内存使用率过高,那么则会导致整个应用都不可用。而微服务则不会有这种问题,某个服务出现问题不会影响其他服务的正常运行。
3. 扩展
单体系统只能作为一个整体进行扩展,即使系统中只有一小部分存在性能问题,也需要对整个服务进行扩展。如果使用微服务,那么我们只需要针对需要扩展的服务进行扩展,比如访问率高的服务我们可以部署多几个节点。
4. 简化部署
单体系统中即使只修改了一行代码,也需要重新部署整个系统,影响范围大,出问题的可能性更高。微服务中只需要部署对应的服务,不会对其他服务产生影响。
5. 与组织结构相匹配
各个服务由小团队开发维护,避免出现过大的代码库,从而获得理想的团队大小及生产力。
6. 对可替代性的优化
在庞大的单体系统中,如果我们要修改 / 删除里面的某些代码带来问题的可能性更高,而微服务的代码量较小,在需要重写替换时风险更小。
三、微服务带来的挑战
1. 微服务的部署与运维
如何能更高效的部署服务以及保证服务的高可用性。
2. 分布式带来的复杂性
需要处理分布式事务或者与 CAP 相关的问题。
3. 微服务的监控
包括服务可用性的监控、服务调用链路的监控。
以上内容根据《微服务设计》整理。
四、哪些情况下不适合使用微服务架构
结合本人的经历,总结了以下几种情况可能不适合采用微服务架构。
1. 想快速上线产品
如果公司想短时间内快速上线一款产品来验证市场,那么此时采用微服务架构并不一定合适。因为微服务架构本身带来的复杂性,使得我们不仅要开发业务需求,还得解决微服务架构方方面面的技术问题,而其中的某些技术问题还是很难解决的,比如分布式事务等问题,这样一来必然会拉长项目周期,导致产品无法按时交付市场。而如果此时采用单体架构去开发,只需要专注业务需求即可,待到产品取得成功并逐步发展时,再转型至微服务架构也不迟。
2. 团队微服务技术基础较薄弱
如果技术团队成员没有良好的微服务理论或者实践基础,对开发人员而言:那有可能造成的一个问题是,在他们编写代码时,还是按照单体应用的思想去编写代码,比如在跨服务跨库调用的场景,完全不会考虑到分布式事务的问题,容易造成业务服务数据的不一致,从而引发故障。对于运维人员而言:如果不具备自动化部署能力,那么要部署 N 多个服务,这将是一件痛苦的事。所以在采用微服务架构之前,请确保团队成员已经具备微服务架构的理论或实践基础。
3. 系统规模较小
如果系统规模较小,业务模块可能不超过 5 个,同样不适合采用微服务架构。因为对于微服务架构来说,复杂性是一个重要的考虑因素,可能要解决微服务架构带来的复杂性会比开发系统需求更难,这样未免显得有些得不偿失。
4. 只是想体验微服务
现在微服务的热度很高,有的技术团队可能想体验一把,于是就准备在项目中引入微服务。但是在这之前要先想清楚是否能 hold 住,否则只会在采坑的路上越走越远,其实对于公司来说是不关心具体的技术实现的,公司领导只关心业务需求能否实现。对我们开发而言,也应当以实现业务为主要目标。
总的来说,由于微服务架构带来的开发与运维的复杂性,如果存在上述的一些问题,建议不采用微服务架构。
五、微服务的实践
微服务架构技术选型包括 Spring Cloud 和 Dubbo,两者之间的区别对比在网上有相关资料,这里不再赘述。总的来说 Spring Cloud 是微服务架构的一套完整的解决方案。
Spring Cloud 提供了一系列的组件来支撑微服务,一些推荐使用的基础组件包括:
- 服务注册发现:Eureka
- 服务网关:Zuul
- 服务调用:Feign
- 软负载均衡:Ribbon
- 限流熔断:Hystrix
- 配置中心:Apollo(备:携程开源,推荐使用)
- 日志监控:ELK
- 服务调用链路监控:可选的有 CAT、Zipkin、SkyWalking
虽然 Spring Cloud 提供了完善的组件,但是在具体的实践过程中还是会有一些坑要踩。
六、总结
在我们享受微服务带来好处的同时,也得接受它带来的挑战,能否实施微服务也要结合实际情况,从实际出发。
另外一个很重要的点是,制定开发规范,提高代码的质量,别留下太多的技术债务,做到这些虽然不容易但是很重要。
如果文章对你有帮助的话,给文章点个赞吧。
如果有写得不正确的地方,欢迎指出。
文章首发公众号:会跳舞的机器人,欢迎扫码关注。