创建微服务?请先回答这10个问题

原文地址:http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=401654497&idx=1&sn=5cac9aa4ae113592e1513c1ff70ea917&scene=21#wechat_redirect

乍一看微服务似乎很容易构建,但是要真正构建微服务,要完成的工作可比在容器里运行一些代码,并在这些代码间使用HTTP请求进行通信,要多得多。在开发新的微服务之前——必须得在新服务部署到生产环境之前——你需要回答下面这10个重要的问题。

1. 如何测试服务?

当考虑到测试时,微服务有一些优势和劣势。一方面,定义良好的一小段功能的小型服务的单元测试,要比测试整个大型应用程序容易得多。另一方面,要验证由很多微服务组成的整个应用程序的质量,则必然会显著加大测试的复杂度:无法运行单个命令来测试一个进程里的代码,大量集成的互相依赖的组件必须首先运行起来,才能验证其健康状况,并且需要在测试过程中一直保持其运行。

新的微服务是否既会进行隔离测试(使用单元测试或模拟依赖),也会连接到一些生产环境里实际会连接的服务上,在更贴近实际使用情况的“集成”或者“过渡”环境里进行测试?测试是否会合并性能验证和错误模式?是否所有测试都会自动化,或者需要人为干预测试的运行以及测试结果的查看?要让微服务可以简单,快速,并且自动化地进行测试,这鼓励开发人员维护测试,并且避免“破窗”问题。

2. 如何配置服务?

一旦新的微服务部署到生产环境里,如何才能影响其内部行为?这里包括基础架构的改动(比如,在资源池里改变最小进程数),以及一些应用程序级别的改动(比如,通过触发特性标志来启动新特性)。对于这所有的改动,要重点注意让这些改动生效是否需要重启服务。

3. 系统的其他部分如何使用该服务?

除非系统的其他组件的确需要使用某个服务,才有必要构建它,因此理解它们会如何使用该服务至关重要。

其他组件和这个新服务的交互是同步还是异步的?是否鼓励它们缓存来自该服务的响应?怎样重试并且保证结果的幂等性?新的微服务的在线时间的SLA是否匹配系统的其他组件?

需要清晰定义这个新的微服务所能够提供的响应延迟,调用该服务的组件必须知道这些指标。这样,当没有达到这些指标时,系统的其他部分才能够决定发出超时信号,中断当前操作,或者转到服务的另一个实例上。

4. 如何保护该服务?

除非在一个要求高度安全的环境里,大部分部署在防火墙后的微服务不需要过多操心服务内的安全性。在微服务之间添加大量的安全检查会带来巨大的操作复杂度,并且使得生产环境问题更难调试和修复。即使为服务内通信使用HTTP之上的HTTPS都会因为要求维护,部署以及保护一些正确签名的证书,而带来大量维护上的额外开销。

通常的方案是让流量在微服务间畅行无阻,同时使用应用程序级别的授权和认证,这样来保证应用程序级别的安全。

因此,系统里的其他组件应该能够给微服务发送请求,但是可能仍然需要同时传递一些认证数据,这些数据代表实际被批准的该请求最初的外部用户。这些数据永远不能是明文密码数据,可以使用类似JWT,OAuth,SAML和Auth0这样的技术。不管使用哪种方案,都需要清晰记录所用技术,最好包含在客户端库或者示例代码里,从而让其他开发人员能够轻松使用这个新的微服务。

5. 如何发现服务?

当新的微服务启动后,系统里的其他组件如何发现它?发现服务的流程越简单,可能的复杂度就越小,但是之后面临的问题就会越多。比如,最简单的方法(当然也很容易出错)就是在其他依赖于该服务的组件代码或者配置里硬编码微服务的地址。这样确实能够工作,直到服务地址发生变动,或者直到在其他域里启动了该服务的多个实例。这显然不是推荐的方式。

使用间接技术,比如DNS名称,能够一定程度上更好地隐藏微服务的地址,但是这样的方案也有自身的缺陷:找到一个合适的TTL值,强制重做名称解析,保证DNS缓存行为一致,等等。从设计上看,DNS并没有考虑服务的可用性,这会使得应用程序的组件将请求发送到一个无人侦听的IP地址,会很浪费时间,并且因为尝试找到能够工作的实例而干扰到实际的运营。这也会让开发人员的体验非常糟糕,因为使用DNS作为路由机制通常会导致开发人员需要频繁修改其/etc/hosts文件。

最复杂的方案里,高可用的数据库和数据同步服务(比如ZooKeeper)可能会用作当前可用并且工作良好的微服务的注册处。这样的方案要求更多的技术投资,并且需要小心处理,保证发现服务本身不会成为单点故障点(Single Point of Failure,SPOF)。微服务启动时,会将自身注册到这样的注册服务里,微服务关闭时则会将自身移除。如果微服务意外终止或者死锁了,它们也会被自动地从注册处移除。记住,发现服务并不仅仅是找到什么在运行——知道什么不可用也非常重要。

6. 负载增加时服务如何扩展?

如果某个微服务在应用程序里的确很有价值,那么使用其的开发人员会不断增加,随着使用的增长,流量会激增。新的微服务有设计良好的扩展计划,这对于运营团队非常重要。

微服务是否能自动扩展?是否有状态驻留在内存里,导致自动扩展和请求路由很困难(比如,用户会话状态)?如果有的话,分区策略是什么?

如果能事先了解大幅扩展时微服务的哪个部分会首先出错会很有用。对于由数据库支持的服务而言,计算能力(比如,位于自动扩展组里的EC2实例)通常能够持续扩展直到数据库不堪重负。对于真正的无状态服务而言(比如,不从数据库读取也不写入的计算型微服务),首先会出问题的可能是位于实例集群之前的负载均衡器。这两种情况都有对应的解决方案,不过在部署微服务的第一个版本时,这些方案并不一定需要就位。但是,需要详细了解新的微服务的限制,这样才能在生产环境能力达到上限之前就知道服务扩展的天花板位于何处。

7. 该服务如何处理其依赖错误?

即使微服务的范围非常小,它也可能依赖于系统里已有的其他服务或者monolith程序。比如,大部分应用程序事务需要查看客户信息,因此用来访问客户记录的服务通常是提供业务价值的大部分服务的依赖。

如果新的微服务依赖于任何其他服务,当这些依赖服务故障时会发生什么至关重要。使用固定的请求超时时间是个好的开始,但是添加流程断点可能会更好。所依赖服务的所有者应该也希望其使用者在故障发生时使用类似指数延迟的技术,来避免惊蛰问题的发生。

这种场景很好测试,因为其测试只需要所依赖服务不可用即可。但是,务必记住所依赖服务API的调用失败可能会有很多种原因,这些故障表现也各不相同。

8. 系统的其他部分如何处理该新服务的故障?

取决于在新微服务的高可用能力上投资多少,也取决于其支持何种事务,这可能并不是个重要的问题。比如,一个简单的运营日志微服务,通过UDP异步发送数据,可能出现几分钟的故障,但是这对于应用程序的主要业务事务并没有任何影响。但是,异步处理信用卡事务的微服务如果发生故障,则可能严重损坏电子商务系统,那么这种故障场景就必须严格测试,并为之做好应对准备。

因此,即使范围有限的微服务(或者其开发人员)不需要担心系统的其他部分如何使用这个新组件,系统级别上关于每个服务如何依赖于其他服务的考量能够帮助避免连锁故障,也能帮助确保应用程序的整体性能。

9. 该服务如何升级?

可能大家倾向于认为Docker这样的容器技术,和Ansible这样的部署自动化工具使得升级变得不那么重要,但是微服务的维护需要考虑很多这些已有工具无法解决的其他方面的问题。

定义升级策略,并且决定微服务支持的部署复杂度级别十分重要。想用新版本取代旧版本时,canary测试,蓝/绿部署,特性标志,以及response diff’ing这些,比起简单的滚动升级而言,要求更多的时间和投入。

为微服务API的升级定义界线和策略对于依赖于其的组件更为重要。比如,一次只允许某个API的JSON schema添加一个改动,这样使得服务能够持续改进,并且不要求其使用者每次都必须随之升级。但是,向XML响应负载里添加新字段时,如果其使用者每次都做XML schema验证的话就会导致严重的问题。因此如果规律升级新的微服务,向其API对象添加越来越多的字段,那么需要在其文档里清晰记录,告知其服务的使用者。

最后,要了解如果新版本有问题时,微服务如何回滚,以及如何考虑“回滚判断指标”。

10. 如何监控并度量服务?

如果你的公司已经有了应用程序监控的标准,那么就应该使用这些标准,借助已有的监控生态系统。注意不能忽略已有标准——或者更为严重地——使用新的监控工具而运营团队之前完全没有使用过。

如果你的公司还没有高质量的应用程序监控系统,向应用程序添加新的微服务可以作为推动监控系统搭建的起点。这对于之前都是监控大型monolithic应用程序,现在才开始向微服务架构迁移的企业来说尤其重要:一系列互相连接的微服务的运营监控需求要比单个大型的monolith程序的监控需求复杂得多。

无论选择哪种监控方案,是自己开发,选择开源软件还是商业软件,微服务的开发人员都应用能够完全访问其组件的监控和度量数据。如果缺失这样的透明度,那么就无法实现完整的反馈回路,开发人员就无法知道如何在生产环境里改进其服务,也无法在发生问题时帮助快速诊断出问题所在。

总结

并不要求大家对上述10个问题的每一个都有特别详细的答案,但是需要对每点都加以考虑,并且知道微服务可能会带来的架构上的限制。比如,一开始新的微服务部署时可能并没有考虑灾备和域故障容忍,随后升级来包含这样的能力。了解微服务当前能做什么,不能做什么至关重要,思考上述问题的答案能够帮助持续改进服务,最终演进成为成熟的,弹性的,可靠的系统组件。

时间: 2024-10-12 16:34:34

创建微服务?请先回答这10个问题的相关文章

创建微服务请先回答这10个问题

系统提示你的任务[幻灵泪]第一阶段完成,正式开启下一阶段任务,请进入幻灵结界内,杀死20名幻灵剑士,并且收集它们身上残留的灵力宝石! 箭雨如电,瞬间就把乱舞春秋插成了刺猬,盾牌之上满是乱箭,好在后面还有不少的永恒牧师在加血,否则乱舞春秋这个盟主肯定要当场壮烈了! 带着一种人飞速的杀了过去,傲世是个二级行会,两万左右的玩家在平原上铺开,浩浩荡荡的一片,驻地里,似水年华的一众人依仗着城防,正在展开对战. 把秦韵带回工作室,其实我心里还是有些七上八下,非常忐忑,因为我不知道凌雪和凌月会对这件事有什么意

使用Spring Boot创建微服务

过去几年以来,"微服务架构"的概念已经在软件开发领域获得了一个稳定的基础.作为"面向服务架构"(SOA)的一个继任者,微服务同样也可以被归类为"分布式系统"这一类,并且进一步发扬了SOA中的许多概念与实践.不过,它们在不同之处在于每个单一服务所应承担的责任范围.在SOA中,每个服务将负责处理广范围的功能与数据领域,而微服务的一种通用指南则认为,它所负责的部分是管理一个单独的数据领域,以及围绕着该领域的相关功能.使用分布式系统方式的目的是将整体性的

JHipster创建微服务及相关微服务架构组件介绍

参考链接: jhipster官网 jdl官方语法文档 JHipster中文文档-CSND博客 在线使用jhipster创建应用 在线使用jdl生成器创建数据表和相应服务端代码 一.创建微服务 微服务是一种JHipster应用程序,它没有前端(必须在网关)上生成Angular前端),并且可以与JHipster Registry一起配置,发现和管理. 创建微服务应用 安装: 安装Java 8 from the Oracle website. 安装Node.js from the Node.js we

代码大爆炸|用Spring Boot创建微服务的21种代码描述(上)

代码大爆炸|用Spring Boot创建微服务的21种代码描述(上)

IDEA使用SpringBoot 、maven创建微服务的简单过程

使用IDEA新建一个简单的微服务 1. 打开IDEA,File -> New  -> project 打开如下图1-1所示的对话框 图 1-1 2.点击"Next"按钮,如下图2-1所示: 图 2-1 3.继续点击"Next"按钮,然后是"finsh",则工程即建立下来,pom.xml文件填写如下所示: <modelVersion>4.0.0</modelVersion> <groupId>Spri

Spring Cloud+Docker创建微服务容器实例

1. 配置windows环境 安装windows版的docker 此步骤可自行百度一下安装方式. 配置maven环境变量 在path中添加maven的bin目录,正常情况下,maven的MAVEN_HOME已经存在了,在此基础上加/bin即为maven的path环境变量 在path中添加 在命令行中执行mvn --version,检查maven的配置是否正确 2. 配置intellij idea 打开windows版的docker,在settings窗口中勾选Expose daemon on t

微服务指南走北(一):微服务是什么

微服务"Microservices"已经成为软件架构最流行的热词之一.网络上看到很多关于微服务的文章,但是感觉很多离我们还很遥远,并且没有找到多少真正在企业场景中应用的实例.此处省略一万字~~~~于是想要将自己最近一段时间使用微服务以及通过看大师们的文章的所思所想梳理出来,分享出来,以供大家参考(热切欢迎大家拍砖,头破血流最好). 什么是微服务 记得刚看到微服务的时候,注意点在微字上,然后才是服务,初步理解为:将整块儿的服务拆分成多个类似工具类的微小web服务,供其他服务调用,每个服务

用 Python、 RabbitMQ 和 Nameko 实现微服务

用 Python. RabbitMQ 和 Nameko 实现微服务 原创 07-17 17:57 首页 Linux中国 "微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的.可扩展的服务是保障代码演变的最好选择.在 Python 的世界里,有个叫做 "Nameko" 的框架,它将微服务的实现变得简单并且强大. 微服务 在最近的几年里,"微服务架构"如雨后春笋般涌现.它用于描述一种特定的软件应用设计方式,这种方式使得应用可以由多个独立部署的服

【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-translator/ "微服务"的概念在 2014 年正式提出之后,越来越多的团队开始用它来设计自己的业务系统,各种微服务框架和开发过程管理方法也同时兴起.不断成熟.微服务设计方法清晰地定义了各个开发团队的业务边界,微服务框架以不同的方式实现了服务之间的协作与集成,根据康威定律我们可以推导这