微服务是或微服务架构是一种软件设计技术。是一种将应用程序构建为一系列松耦合服务的架构建风格。 它具有如下好处,比如通过简化开发、测试和调试步骤来提高模块化,从而让开发者的生活变轻松,同时有助于持续集成和持续交付。本文将主要关注于Restful微服务。其实大多数工具都可以使用,无论你用哪几种语言/体系结构 。 下面我们来看有哪些技术和可用的工具:
任何编程语言都可以实现微服务,都可以使用不同的基础设施。其主要的技术是微服务通信,包括同步,异步,以用使用什么协议,比如RESTful、Message服务等。 根据业务需求,我们需要选择通信机制和协议。 微服务架构组件大致可分为如下: 1)API网关 2)负责均衡设备 3)服务发现 4)服务 5)数据库或缓存 我们在本篇文章讨论和组织使用不同的技术栈,供各位参考。
如同我们日常工作要记录,每天睡前的日志一般,任何微服务的体系结构和设计的重要性也是不言而喻的。我们对文档的内容和样式也会感到些许麻烦,值得庆幸的是,有很多模板可以供我们选择:比如Arc42,一个免费开源的工具。除了生成结构化体系文档外,如果要生成公开服务API文档,则可以用Swagger,Apiary和ReDoc等工具,帮助我们生成公开服务的API。
微服务的开发与任何其它类型的应用程序开发类似。任何开发者选择的IDE,比如使用Eclipse或IntelliJ,还有其它文本编辑器,比如Atom、Sublime以及其它任意一种版本管理系统,无论是客户端/服务器模式的的SVN,Perforce或分布式系统如Git,Visual Studio Team Service,这些都可以用。 要构建和运行测试,我们需要有Maven、Ant等软件项目管理工具。 要存储生成的工件,可以用Nexus和Artifactory这些开源工具来完成。如果你需要让构建和测试自动化,还有Jenkis和Bamboo这样的自动化工具。
代码Review是对任何编程语言编写的源代码进行审查。它的作用是为了检查明显的逻辑错误,满足需求,确认最佳实践等。 审查可以通过结对编程,非正式演练或正式审核流和来实现。有一个正式的审查流程是非常有价值的。 SmartBear协作工具支持全部的VCS/SCM工具,如Git,Subversion,Perforce和ClearCase等软件,可以跑在Windows,Linux和Mac上。 Crucible是Atlassian公司提供的另一款支持VCS的流行工具,支持Git,SVN,CVS,Perforce等。 另外,还有Gerrit和Phabricator等免费和开源的代码审查工具供你选择。 除此以上,我们还应该重点关注代码质量的持续检查,通过静态分析代码来执行自动检查,检测错误、代码异味等,我们可以使用像Sonarqube和PMD等工具来完成以上的需求。
日志记录是任何服务都很重要的特性和功能之一。任何服务,我们都需要访问日志和服务日志。如果我们只是存储日志,它不会增加任何价值,我们需要有一些机制来分析这些日志来理解这些内容。
在一般情况下,所有的应用程序和Web服务器都会提供访问日志和错误日志。访问主要是跟踪外部传入的请求和参数、主机名、响应状态等,错误日志是用来记录应用程序出错或其它异常的错误内容。
可以在每个服务或基础架构中存储处理此类日志。但是,需要从每个服务中生成日志。在编写日志逻辑的同时,需要开发者考虑添加时间、源(类方法、类名称等),错误的严重级别以及如消息、栈跟踪等内容。这样,当我们看到日志句柄时,可以马上知道哪个服务生成了日志事件,以及生成该事件的服务位置。 然后,找到导致该问题的方法并执行。 重点,开发者需要一种将一系列事件追溯到源头的方法,即使需要遍历很多个服务。我们提供的解决方法是在请求进行日志体系结构时,使用唯一的标识符,在请求完毕时也使用相同的标识符。 当一台服务器处理多个不同类型的客户端时,日志输出的格式是混合在一块的。而MDC(Mapped Diagnostic Context - 映射诊断上下文)是用于区分来自不同源头交叉的日志输出工具。
维护服务的日志,其生命周期具有如下优势:它具有完全独立于其它服务,可以选择最适合的日志策略。同时,它也有缺点:每个人服务都需要实现一个日志策略,这些日志是冗余的,会增加各个服务之间修改日志行为的复杂性。
在这种方法中,每个服务都将日志发送给中央服务,中央服务知道如何处理,比如存储或者向其它的日志服务器发送日志。
简单的查看日志不是分析日志的最佳解决方案。这里有一些工具可以帮您更轻松的查看、搜索和分析日志。Splunk和Kibana(由ELK Stack开发)是两个查看日志的著名工具。 Spring Cloud Sleuth是一个基于MDC(Mapped Diagnostic Context)概念的Spring Cloud项目,我们可以在日志上下文中轻松提取想要的值,并显示出来。 推荐使用Zipkin,它是一个分布式跟踪系统,可帮助收集延迟等问题需要的时间数据。
与单元测试一样,集成测试需要涵盖所有的场景,这非常重要。我们可以选择从TDD到BDD或ATD的任何方法。像Randoop和Junit-tools这样的工具可以帮助我们在编写代码后,生成Java单元测试用例。 可以使用Postman,Karate以及ZeroCode帮助我们开发集成测试。我们详细介绍一下: 持续集成与持续交付(CI/CD):CI与CD是实现微服务取得成功的之关键因素。没有一个好的CI/CD流程,我们没有办法实现微服务承诺的敏捷性。 CI和CD的几个关键流程:持续集成、持续交付和持续部署,可以用XebiaLabs的产品来实现持续交付和集成的漂亮视图。
除了单元测试和集成测试之外,我们还应该执行其他类型的测试,如压力负载和性能测试。 Apache JMeter是一个非常不错的工具,还有一个叫Blazemeter的一个工具,它允许将目标KPI设置为失败标准并跟踪一段应用的时间性能,然后将多个测试合并为一个运行,同时还生成精细的报告。 想要解决性能瓶颈等问题,比如确定内存泄漏还是了解线程等问题,还可以使用jProfiler等应用程序分析器。
与微服务相关联的最常见的挑战之一就是监测。除了要知晓该服务是否正常响应外,还需要了解系统的其它部分,如数据库,消息中间件等,监测这些重要组件是否工作正常。除此以外,开发者还希望取得各种指标,比如已经处理请求的数量、吞吐量、负载、出错数量等。为了收集服务的单个操作的统计信息(指标),我们可以使用工具如Coda Hale/Yammer Jave Metrics Library或Prometheus客户端。 收集完这些数据指标后,可以使用Grafana,Prometheus或AWS Cloudwatch等工具来监控。 到目前为止,与大家已经讨论了目前各种可用的技术与工具。但是世界正在迅速变化,只知道现有技术已经不够了,我们开发者需要超越今天的解决方案,并为未来发展做好准备。 开发者为了保持最新技术与工具,不断成长。可以尝试做的事情如下: 1、利用网络,印刷品和社交媒体; 2、参加学习与培训; 3、积极实践; 4、参与技术社区或会议 5、贡献开源代码。 祝各位周末愉快! 作者:Biplab Pal |
|