选择”开发者技术前线 “星标🔝,内容一触即达。点击原文更多惊喜!
开发者技术前线 汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。
为什么大公司一定要使用微服务?
在看 真爱
作者:superhj1987
www.rowkey.me/blog/2019/05/30/msa/
这几年在 Java 工程师招聘时,会看到很多人的简历都写着使用了 Spring Cloud 做微服务实现,使用 Docker 做自动化部署,并且也会把这些做为自己的亮点。
而比较有趣的这其中以小公司出来的人为绝大多数,大的公司出来的人简历上倒是很少提这些东西。
对于我自己来说,从 2015 年就开始关注这一块,看过马丁·福勒最开始的关于微服务的论文、也看过不少对微服务的论证的英文文章和书,也研究过 Spring Cloud、Sofa 等开源实现以及 Service Mesh。
考虑到我们公司研发团队人力不足、基础设施不完善,当初是没有推行微服务的。
但随着看到上述的那种简历越来越多,有时候我也会疑问:难道真的不用微服务就落后了吗?公司的同事如果不掌握这些就真的没有竞争力了吗。
而随着最近公司业务的逐步提升,研发人员越来越多,借着在梳理公司的微服务落地计划时,也梳理了一下微服务的相关知识点,也是本文的主要内容。
架构模式有很多,微服务不是唯一的选择也不是什么银弹。国内绝大多数中小公司引入微服务都是在盲目追新,也能看出做此种技术选型的工程师基础架构素质的不足。
“你必须长的足够高才能使用微服务”。微服务基础设施,尤其是容器技术、自动化部署、自动化测试这些不完备,微服务形同虚设,不会带来什么质的提升。
微服务架构的关键不在于具体的实现,而在于如何合理地划分服务边界以及组织架构是否相匹配。不考虑研发团队的规模和组成就盲目上微服务是不良的技术选型。
Spring Boot 是 Spring 全家桶的上层封装,并不是什么崭新的技术,也不是什么值得成为自己杀手锏的技术。
Spring Cloud 中 Spring Cloud Netflix 的组件是经过生产环境验证的,其他的则建议慎重选择。
微服务是什么
small
automated
lightweight
单一职责
关注分离:控制与逻辑相分离
模块化和分而治之
用服务进行组件化
围绕业务能力进行组织
是产品而非项目
端点智能化和哑管道: 控制逻辑都在端点,管道仅仅是传输
全自动化部署
语言和数据的去中心化控制
面向失败设计
渐进式设计
优点:模块的强边界;独立部署;技术选型的多样性。
缺点:分布式带来编程复杂度,远程调用的消耗;舍弃强一致性,实现最终一致性;操作复杂性要求有一个成熟的运维团队或者运维基础设施。
为什么要采用微服务
需要解决包括自动化部署、监控、容错处理、最终一致性等其他分布式系统面临的问题。即使已经有一些普遍使用的解决方案,但是仍然是有不小的成本的。
多人开发一个模块/项目,提交代码频繁出现大量冲突。
模块间严重耦合,互相依赖,每次变动需要牵扯多个团队,单次上线需求太多,风险大。
主要业务和次要业务耦合,横向扩展流程复杂。
熔断降级全靠 if-else。
微服务 1.0:仅使用注册发现,基于 Spring Cloud 或者 Dubbo 进行开发。
微服务 2.0:使用了熔断、限流、降级等服务治理策略,并配备完整服务工具和平台。
微服务 3.0:Service Mesh 将服务治理作为通用组件,下沉到平台层实现,应用层仅仅关注业务逻辑,平台层可以根据业务监控自动调度和参数调整,实现 AIOps 和智能调度。
微服务架构
先决条件
快速的环境提供能力:依赖于云计算、容器技术,快速交付环境。
基本的监控能力:包括基础的技术监控和业务监控。
快速的应用部署能力:需要部署管道提供快速的部署能力。
Devops 文化:需要具有良好的持续交付能力,包括全链路追踪、快速环境提供和部署等,还需要快速的反应能力(对问题、故障的快速响应),开发和运维的协同工作。
一个微服务由一个团队维护,团队成员以三人为宜。
单个团队的任务和发展是独立的,不受其他因素影响。
团队是功能齐全、全栈、自治的,扁平、自我管理。
基础设施
①最基本的基础设施
②提升外部服务对接效率和内部开发效率
③提升测试和运维效率
④进一步提升运维效率
架构设计模式
如下图所示:
后台采用微服务架构,微服务可以采用不同的编程语言和不同的存储机制。
前台采用 BFF 模式对不同的用户体验(如桌面浏览器,Native App,平板响应式 Web)进行适配。
BFF、API Orchestration Layer,Edge Service Layer,Device Wrapper Layer 是相同的概念。
BFF 不能过多,过多会造成代码逻辑重复冗余。
可以将网关承担的功能,如 Geoip、限流、安全认证等跨横切面功能和 BFF 做在同一层,虽然增加了 BFF 层的复杂性,但能够得到性能优势。
服务拆分
基于业务逻辑拆分
基于可扩展拆分
基于可靠性拆分
基于性能拆分
先少后多、先粗后细(粒度)
服务纵向拆分最多三层,两次调用:Controller、组合服务、基础服务
仅仅单向调用,禁止循环调用
串行调用改为并行调用或者异步化
接口应该幂等
接口数据定义严禁内嵌,透传
规范化工程名
先拆分服务,等服务粒度确定后再拆分数据库。
微服务框架
上面讲述了微服务架构的众多基础设施,如果每一个基础设施都需要自己开发的话是非常巨大的开发工作。目前市面上已经有不少开源的微服务框架可以选择。
Spring Boot
Spring Boot 是用来简化新 Spring 应用的初始搭建以及开发过程的。其虽然不是微服务框架,但其设计的初衷本质就是微应用的底层框架,因此非常适合用于微服务基础设施的开发以及微服务的应用开发。
尤其对于 Spring 技术栈的团队来说,基于 Spring Boot 开发微服务框架和应用是自然而然的一个选择。
Dubbo&Motan
Dubbo 是阿里开源的服务治理框架。其出现在微服务理念兴起之前,可以看做是 SOA 框架的集大成之作。
但其仅仅包含了微服务基础设施的部分功能,诸如熔断、服务跟踪、网关等都没有实现:
服务发现:服务发布、订阅、通知。
高可用策略:失败重试(Failover)、快速失败(Failfast)、资源隔离 - 负载均衡 :最少活跃连接、一致性 Hash、随机请求、轮询等。
扩展性 :支持 SPI 扩展(service provider interface)。
其他 :调用统计、访问日志等。
Spring Cloud
Spring Cloud Netflix 是 Spring Cloud 的一个子项目,是 Spring 对 Netflix OSS 的集成实现。
基于 Netflix 的大规模使用,其中的已经被广泛使用的组件包括:
Eureka:服务注册和服务发现
Ribbon:弹性而智能的进程间和服务通讯机制,客户端负载均衡
Hystrix:熔断器,在运行时提供延迟和容错的隔离
Zuul:服务网关
此外,另一个子项目 Spring Cloud Alibaba 则是 Alibaba 开源的基于 Spring Boot 的微服务框架,主要是对阿里云服务的支持。
Service Mesh
上述的微服务框架都是侵入式的,服务化的过程都需要进行代码改造。Service Mesh 则是下一代微服务架构,最明显的特征就是无入侵。采用 Sidecar 模式来解决系统架构微服务化后的服务间通信和治理问题。
如下图所示:
目前主流的开源实现包括:
Linkerd 和 Envoy:以 Sidecar 为核心,关注如何做好 Proxy,并完成一些通用控制平面的功能。缺乏对这些 Sidecar 的管理和控制。
Istio 和 Conduit:目前最为流行的 Service Mesh 实现方案,集中在更加强大的控制平面(Sidecar 被称为数据平面)功能。
前者由 Google 和 IBM 合作,并使用了 Envoy 作为 Sidecar 部分的实现;后者则是 Linkerd 作者的作品。
相比起来,Istio 有巨头背景,功能强大,但可用性和易用性一直不高,Conduit 则相对简单、功能聚焦。
Sofastack
蚂蚁金服开源的构建金融级分布式架构的一套中间件。包括微服务开发框架、RPC 框架、服务注册中心、全链路追踪、服务监控、Service Mesh 等一整套分布式应用开发工具。
特别值得一提的是 SOFAMesh。其实对下一代微服务架构 Service Mesh 的大规模落地方案实践,基于 Istio 改进和扩展而来,应该是国内最为成熟的开源 Service Mesh 方案。
综上,目前公司技术团队技术栈是 Spring,并且已有服务的实现都是基于 Dubbo。
因此选择 Spring Cloud Netflix 做为基础的微服务框架,对其中不成熟或者缺乏的组件,选择业界更为成熟的组件替代即可:
API 网关:Zuul。
服务注册中心:Dubbo。
配置中心:Disconf。
服务监控&全链路追踪:CAT。
服务开发框架:Spring Boot。
日志监控、告警:ELK+Elasalert。
流量控制:Sentinel。
消息队列:Kafka。
参考资料:
What’s so bad about monoliths anyway…?!
Microservice
MicroservicePremium
Microservice Trade-Offs
MicroservicePrerequisites
MonolithFirst
服务怎么拆?
BFF@SoundCloud
Service Mesh 及其主流开源实现解析
END