刘地生|微服务的实践

简介:
一. 为什么大家都在谈微服务?
背景:随着互联网业务的极速增长,不仅仅体现在用户的增长,你的代码规模也会有直观体现。伴随系统规模的上升,传统的单体架构就像一艘不断变大吨位的巨轮,变得越来越笨重。系统规模所带来的挑战也不断影响着相关的参与者。开发者开发一个新功能、重构一小段代码、引入一个新技术变得不再敏捷可控。测试者的回归测试边界难以琢磨。部署一次变得小心翼翼或提心吊胆。这些都让应对变化变得迟钝。

是的,那个老头(Martin   Flower)又出现了,又捣鼓出一个新概念【微服务】。他确实很喜欢捣鼓概念(不做过度解读) 微服务其实也不是那么新,它的提出之前,大家已经在服务化的路上走了好一会了。或者叫SOA或者叫ESB。都尝试解决服务规模导致的开发问题、重用问题、治理问题等等。当然微服务也不完全跟他们一样,至少为了适应现在的新环境提出了一些自己理念。如更快的应对变化,应对云环境的适配等等 我们可以从中感知它的一些明显特点:它能独立开发、测试、部署,是一个可以独立提供某项垂直业务的完整服务,把一件事做的足够好。

  1. 二. 我们希望的微服务是什么样子
微服务已然是一个独立自治的王国。那所希望的这个王国应该是什么样子?或者说我们希望软件的乌托邦长什么样? 从根本上来说微服务是一个偏向技术的架构模式,那么从技术使用方的角度来看它的方方面面。
  • ● 学习成本:不想为了用它得先学习准备个10天半个月,这跟我爱不爱学习新东西无关
  • ● 使用简单:不希望一个hello   world比开发一个功能还艰难
  • ● 迁移成本:已经有很多系统在维护中,不希望大动干戈,推倒重来是一定程度的犯罪(你无法保证建立的新世界比原来好)
  • ● 易于测试:希望一个单元测试或者集成测试很快就能跑起来
  • ● 高性能:不会有性能瓶颈,引入的负载小
  • ● 部署简单:部署也是成本,自动化,不进行人工环境干预。适应各种环境,最大利用硬件资源
  • ● 易于监控:完善的日志记录,出现问题能被监控、告警,对系统运行状态及各种指标能随时掌握
  • ● 易于运维:对突发事件有运维调度能力,防止雪崩效应。可以对系统进行弹性伸缩,快速的拉起和优雅关闭等等

  1. 三. 实现微服务
必要性和需求已经提出,现在需要将空中楼阁变成一块块的技术砖头
  • ● 微服务自身实现
服务路由、负载均衡、容错、限流、健康检查、监控、日志、网络通信、序列化、配置管理、SPI、测试等等,不过这些feature具体依赖与特定微服务框架的设计
  • ● 部署
在当前硬件资源都在走向虚拟化的进程中,让系统部署成一个无状态进程是很有必要的,不预设环境,同时加快启动效率。这就需要对其库依赖自给自足、代码与配置隔离、系统支持优雅关闭、日志统一管理等等。比如Springboot的依赖管理及进程管理等等做的就很完善,而Docker的容器资源隔离已经快要成了事实上的标准
  • ● 其他
数据与框架无关性、对使用者语言中立、服务的升级、分布式会话状态、事务如何处理等等。这些问题可通过中立第三方工具或服务解决,如protocol   buffers、json这种扩展性良好中立的结构来对数据进行序列化,统一会话认证服务解决状态问题、事件源回溯来解决事务等等。已不单单是微服务本身的问题 实现的考量及调研 鉴于公司技术栈的异构多语言特性,基于契约优先gRPC与基于REST的Netflix   微服务组件集纳入我们的视野。从高性能、适合复杂环境的通用性、中立性、优雅关闭、简单易用性等比较。gRPC这种带有契约优先及基于RPC调用的框架基本可满足要求。 gRPC有什么问题?对分布式环境下的负载均衡、服务注册调用没有提供支持。基于契约所适配的代码易用性较差,业务逻辑实现被gRPC侵入、对生命周期管理的扩展较弱等等。这些都与易用性存在着Gap。 如何消除这些Gap? 引入gateway层,消除分布式系统的路由寻址、负载均衡、注册反注册、流量控制,增强系统的分布式环境适应能力。不对协议做破坏性再封包,实现透明兼容; 抽象endpoint模型,简化调用关系和扩展生命周期。将生命周期管理进行扩展,不再局限与gRPC自己的生命周期。简化调用模型,在endpoint之间对等通信或走gateway通信。 引入基于契约的代码脚手架,自动生成易用性、可读性良好的Stub、消除或减小使用gap,见下图。

整体架构

实践过程中我们的各种抉择:
  • ◆ 代码优先   VS契约优先
代码优先意味着实现简单,能够快速执行。问题也很明显,可能绑定在具体某个语言,面对多语言环境打通成本较高。 契约优先的中立性提供了一个中间桥梁,让面向多语言成为了可能,基于契约的元信息,为后续治理和演进提供的入口点。缺点是需要进行多语言适配。 鉴于公司环境,团队之间异构语言的特点。我们接收契约优先带来的适配,为后面的基于元信息的使用及扩展提供空间

  • ◆ HTTP+REST   VS   RPC
HTTP+REST有什么问题?给了无限的自由和想象空间,对服务约束完全靠提供者的自觉。特点是简单,对开发使用友好。当然也有自由的代价,治理起来困难,连接的无状态,缺失多路复用、服务端推送等等 RPC对通信双方定义了数据约束,连接大多基于长连接以获得性能的提升及附带的服务端推、调用链路监控埋点等等,增强了系统的附加能力。缺点是对调用端提出了新的要求。 综合来看,RPC从性能、契约优先来说具有优势,如何做到扬长避短呢?有个观点叫没有什么事是加一层解决不了的。从这点出发,引入gateway层,让REST与RPC的优点进行融合,在gateway层提供REST的接入能力

  • ◆ 客户端治理   VS   服务端治理
客户端治理需要有有注册中心来提供配置、服务端信息的寻址、负载均衡等等以确定调用最后的调用方式,客户端需要完成很多工作,在一些限制环境如移动端APP受到限制 服务端治理为客户端减压,简化客户端复杂度,为限制环境下的调用提供可能。不足是调用链路多引入了一层,会产生一定的性能损耗,gateway同样带来扩展能力(如流量的管控、灰度发布、服务路由、负载均衡、健康检测等等),及更好的client适应性 出于对多环境客户端的适配性,gateway扩展的能力及治理能力,gateway的损耗我们是愿意接受的

  • ◆ 外部管理VS进程自治管理
外部管理(如tomcat)让用户不用关注自身的起始、消亡,带来的不足是对生命周期的管理相对减弱、部署的依赖管理扩散。 进程自治可以加强其对自身生命周期的管理,高内聚,不将依赖扩散。一定程度代理部署的便利及不同部署环境的适应性(如云环境)。为优雅关闭提供切入点。进一步增强对系统的可控性。 从对环境适应性和对生命周期的管理能力考虑,进程自治有着不可忽略的优势,

  • ◆ 配置与代码耦合VS配置与代码的分离
配置和代码一起带来的是开发的简单,不足也很明显,面对不同环境的,部署多套代码增加复杂度 分离后优点明显真正做到只部署一套代码。配置信息按环境独立配置,不受环境制约,随时调整

  1. 四. 让微服务快速落地
当我们在说快速落地的时候,我们在说什么?可能说的是易用性。如何将易用性提速? 使用者来说:是不写或写很少的额外代码,是迁移很简单,对原有系统影响最小。是测试起来不增加困难,是部署起来没有那么多依赖条件。是随时能感知系统运行状态。而这些都需要完善的工具提供支持。 工具篇 简化集成:如java平台下的系统大部分的类依赖都由spring管理,而Springboot更是在其基础上进一步解放了spring的使用成本。借助Springboot   starter的能力,将微服务快速集成并拉起,将使用成本降低到一个注解就完成对系统的集成。经验:将注解设计成与具体框架无关性,只表示为元信息,不随意扩散依赖。然后在具体框架上完成对注解的识别(如spring里参见ImportBeanDefinitionRegistrar)

部署:基于目前虚拟化出现在各个层面,这意味着进一步获得了自动化能力。通过如docker这种工具可以快的提升部署能力

运维监控:针对自身业务,提供相应的系统支持

  1. 五. 附录
自我介绍:刘地生,融数数据基础架构部架构师。曾就职于去哪儿、百度、ONEAPM从事相关分布式系统架构设计、研发和性能优化工作。目前主要负责融数数据微服务平台的架构设计和开发工作。




问答环节


Q1:api gateway使用开源产品还是自己开发,是否有必要自己开发?

A1:gateway是自己基于netty开发的,看需求和对可控性的要求来决定是否自己开发。如果觉得开源的产品不符合你想要的要求,那自己开发也是一条没有太多选择的路。


Q2:能解释一下什么是代理,什么是存根,以及它们的关系是什么吗?

A2:这个问题不是很明白你具体指的上下文,按我个人的理解,代理是在原有事情上包装一层,但是做的事情的核心没变。存根是一种降低使用复杂度的手段,生成一些重复、复杂的代码来减少使用者的负担。存根可能会使用到代理模式。


Q3:netty也适合做实时返回的交api gateway开发?netty发布的是什么协议的api?

A3:netty跟实时不冲突,只要你是长连接,那么它就具备接收和推送的能力。关于协议你只要在实现的时候不对原协议做破坏,那么它就是一个透明的穿透。我们内部的实现中,netty工作在http2上。


Q4:你们gateway有什么功能点?单机qps多少?

A4:现阶段具备注册发现、健康检查、负载均衡、反向代理、流量控制等功能。单机QPS在空包的情况下13万,1k数据包情况下3万左右,5k数据包的情况下1万5左右


Q5:spring boot很火,版本迭代速度很快,一些模块改动很大,但这给开发和部署带来一定的困惑,并且新人如果没接触过springMVC的话很容易掉入坑里,因为自动化程度很高,很多时候错误莫名其妙,也看不到里面发生了什么,这些问题如何解决?

A5:springboot的加载机制其实是很严谨的,都是在各种condition情况满足下才会加载,部署的话其实应该比原来更简单才对,它提供的maven 打包插件打出一个jar就能进行部署。如果说坑那可能是没有按照springboot的约定实施造成的,它提供了很多机制去查看它的状态,比如各种http的endpoint,官方参考文档应该会帮上大忙。


Q6:从esb  soa转微服务,原本进程内的调用关系变成了网络调用,一次rpc变成了几次或者几十次rpc,同等条件下性能损失严重。这个问题如何得到解决?

A6:任何问题都有两面性,从开发的可维护性和降低复杂度等、部署的效率,故障影响的范围等等来说,微服务有很大的优势。你提到的性能问题,可能是服务的拆分过细导致,但不管怎么拆,从一个调用被拆成几十次调用肯定是粒度有严重问题,提高性能可以从按业务单元合理拆分粒度、合理的网络规划及部署、提高微服务本身性能等方面着手。





来源:中生代技术

原文链接

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
4月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1925 10
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
795 86
|
9月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
513 12
|
监控 持续交付 API
深入理解云计算中的微服务架构:原理、优势与实践
深入理解云计算中的微服务架构:原理、优势与实践
624 83
|
11月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
783 17
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
265 32
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
11月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。