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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Visual Studio Code 中创建微服务并不是一个直接的过程,你需要自己进行一些开发工作。但是,以下是一些步骤,可以帮助你开始创建微服务: 1. 选择一种合适的编程语言,如 Java、Python、C# 等。 2. 使用 Visual Studio Code 打开一个新的工作区,并创建一个新的项目文件夹。 3. 在项目文件夹中,使用选择的编程语言创建一个新的微服务应用。 4. 构建微服务的功能,例如实现数据存储、访问控制、服务间通信等。 5. 使用 Visual Studio Code 开发工具进行代码编写、调试、测试等。 6. 部署微服务到生产环境,并对其进行监控和维护。 7. 随着需求的变化,不断对微服务进行更新和改进。 注意,这些步骤仅是创建微服务的大致流程,每个具体的项目可能会有不同的步骤和方法。 ### 回答2: 要在VS Code中创建微服务,您可以按照以下步骤进行操作: 1. 安装VS Code:首,您需要安装最新版本的VS Code编辑器。您可以从VS Code官方网站上下载并安装适合您操作系统的版本。 2. 安装适当的插件:为了方便创建和管理微服务,您可以安装适合的插件。一些常用的插件包括REST Client、Swagger Viewer、Docker和Kubernetes插件。 3. 创建一个新的项目文件夹:在VS Code中选择一个适当的文件夹,右键点击并选择“新建文件夹”来创建一个新的项目文件夹。您可以将这个文件夹用于存储您的微服务代码和相关文件。 4. 添加微服务代码:在项目文件夹中创建一个新的文件夹,用于存储您的微服务代码。然后,在此文件夹中创建您的微服务的相关文件,例如主要代码文件、配置文件和测试文件。 5. 配置开发环境:根据您选择的编程语言和开发框架,配置适当的开发环境。这可能涉及安装和配置依赖项、设置环境变量和配置文件等。 6. 创建微服务端点:使用适当的编程语言和开发框架,在代码中创建您的微服务的端点。这些端点将根据您的需求提供相应的功能和服务。 7. 测试和调试微服务:利用VS Code提供的测试和调试工具,对您的微服务进行测试和调试。您可以使用REST Client插件发送HTTP求来测试API端点,并使用调试器来定位和修复代码中的错误。 8. 构建和部署微服务:根据您的需求,使用适当的工具和插件将您的微服务构建为可部署的包。例如,使用Docker将您的微服务容器化,并使用Kubernetes进行容器编排和部署。 9. 监控和维护:使用适当的工具和插件来监控和维护您的微服务。例如,使用Prometheus和Grafana进行性能监控和日志记录。 10. 代码管理和版本控制:使用VS Code提供的代码管理和版本控制工具,例如Git,来管理和跟踪您的微服务代码的变化和版本。 总结来说,在VS Code中创建微服务包括安装VS Code、安装插件、创建项目文件夹、添加微服务代码、配置开发环境、创建微服务端点、测试和调试微服务、构建和部署微服务、监控和维护、代码管理和版本控制等步骤。 ### 回答3: 在VSCode中创建微服务可以按照以下步骤进行操作: 1. 确保已经安装了VSCode和相应的插件 在VSCode官方网站上下载并安装VSCode,然后在扩展市场中搜索并安装适合微服务开发的插件,如Docker、Kubernetes等。 2. 创建一个新的工作区(Workspace) 打开VSCode,选择“文件”菜单中的“打开工作区”选项。在弹出的对话框中选择一个合适的文件夹并保存工作区文件。 3. 创建微服务项目 使用VSCode的终端或命令行工具,在工作区所在的文件夹内创建一个新的微服务项目。可以使用任何语言或框架来创建项目,如Java Spring Boot、Node.js Express等。 4. 编写微服务代码 打开VSCode,使用适当的插件配置文件并开始编写代码。根据框架或语言的规范,创建微服务的业务逻辑、API等功能。 5. 构建和调试微服务 使用VSCode的相应插件,如Docker和Kubernetes,构建微服务并调试代码。通过插件提供的命令或设置,配置相应的构建和调试选项。 6. 部署微服务 使用Docker和Kubernetes等技术将微服务部署到合适的环境中,如本地容器、云平台等。通过VSCode提供的插件,可以简化和自动化部署过程。 7. 测试和运行微服务 使用VSCode的测试框架或插件,编写和执行微服务的单元测试和集成测试。通过提供的命令或设置,可以方便地测试和运行微服务。 总之,在VSCode中创建微服务需要安装适当的插件,并按照以上步骤进行操作,可以快速、方便地创建、编写、构建、调试、部署和测试微服务
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值