下一步该了解什么?
我们在这本小册子里面介绍了非常多的知识,但是它远远不够涵盖一切!我们需要知道,这只是冰山一角,有非常多的微服务所涉及到的领域在本书中没有探讨。在最后这个章节,我们将会简要的介绍一些你必须了解的概念,并将这些联系留给读者进行深入研究。
配置
配置(Configuration)是分布式系统中非常重要的部分,而在微服务架构中变得愈发重要和困难。我们需要在配置和不可变递交(Immutable delivery)之间寻求平衡,因为我们不希望出现服务的碎片化。例如:我们需要能够改变日志级别,在A/B测试上切换特性,配置数据库连接或者使用秘钥或者密码,我们回顾之前介绍的三个Java微服务框架,但是每个框架的配置方式略微不同,那么在非Java环境下的微服务配置方式又会变成什么样子呢?
如果以配置的形式存在,不同的需求就会在一样的代码基础上,生成不同的镜像,这就是碎片化的开始
为了能够在容器中,技术无关的进行配置管理,我们需要采用技术无关的方式在容器中进行配置。在Docker环境中,我们能够通过注入环境变量的方式来进行配置,Kubernetes更是推荐我们这样进行配置。Kubernetes也提供了相应的APIs,将Secrets
注入到容器中,而在Secrets
中可以放置用户名、密码以及私有秘钥等诸多配置内容。Kubernetes在最近也添加了ConfigMaps
(类似Secrets
),它被用来完成应用级别的配置,在解耦Docker镜像中的配置同时,它可以支持通过环境变量或者文件的方式注入配置。如果一个应用能够以配置文件或者环境变量的方式消费配置,那就可以使用Kubernetes来完成配置而不需要引入复杂的配置服务和客户端。在Kubernetes下对微服务的配置,可以做到技术无关,而配置也被作为集群管理的基础设施。
在kubernetes中,secret对象类型主要目的是 保存一些私密数据,比如密码,OAuth tokens,ssh keys等信息。将这些信息放在secret对象中 比 直接放在pod或docker image中更安全,也更方便使用
日志,Metrics和跟踪
不可置疑,微服务架构也会带来诸多缺点,尤其是对日志、Metrics和跟踪带来的影响很大,随着系统被拆分成为一个个独立的部分,就需要更多的工具投入来支持你看到全局。当你以可伸缩的方式运行服务,特别是在每个组件都有可能失败的情况下,我们需要收集服务的信息以及服务相关的数据(类似Metrics和跟踪信息)而不用理会容器是否存活。接下来,介绍一些途径和方法当你考虑设计日志,Metrics和跟踪策略相关的功能:
- 开发人员暴露他们的日志
- 聚合/中心化
- 搜索与相关性
- 可视化以及图表
Kubernetes通过插件的方式,允许添加集群级别的日志和Metrics收集功能。典型的解决方案包括,syslog
、Fluentd
或者Logstash
,它们可以将日志从服务中拖走,以流的形式投机到中心化的聚合器中。有些人会使用消息中间件的形式来解决日志收集,目的是提升可用性,这也可以理解。ElasticSearch
是一个非常好的聚合日志方案,它支持伸缩以及索引,并且你可以在前端架设Kibana
,它能提供良好的仪表盘展示和搜索界面。除此之外,还有一些Prometheus
、Zipkin
、Grafana
、Hawkular
和Netflix Servo
方案供选择。
事实上ELK作为实际方案已经运作很长时间了,它们分别是
ElasticSearch
、Logstash
和Kibana
持续递交(Continuous Delivery)
在第五章中讨论过不可变递交,它对于微服务而言是至关重要的,当我们拥有了大量小的服务后,我们现有的手工流程就无法支撑微服务的构建,换句话说,当每个团队都能够运维自己的服务时,我们就需要一个统一的方式来避免出现运维瓶颈以及人肉错误。一旦我们采用了微服务架构,我们需要洞悉并了解服务的反馈,只有这样才能帮助我们走的更远。当业务需求改变了,我们通过迭代开发,将需求在系统中进行了实现,我们就会不断的分步发布系统,事实上,我们需要一套可以运行的软件交付流程。这个流程是由许多子流程组成的,它们通过交汇点等特定节点连接而成,理想中,我们希望能够自动的完成构建、测试以及部署。
就像Docker和Kubernetes,提供给开发者内置的工具,使之能够做到滚动升级、蓝绿发布或者canary releases的部署策略。显然这些工具并不是专门用来做这些工作的(比如:Amazon或者Netflix在Linux容器之前就已经广泛使用这项技术),但是容器能够使我们更加容易的做到。你能够使用持续集成工具,例如:Jenkins以及Jenkins流程,用它以及Kubernetes来连接你的构建和部署流程。可以通过了解fabric8和OpenShift
项目来学习如何将Kubernetes与Jenkins流程集成起来。
总结
本书是一个以实践为主导,使用流行的Java为服务框架来一步一步构建分布式系统的教程。微服务不是本书讨论的唯一技术解决方案,人也是复杂系统中的重要组成部分,需要使人时刻保持伸缩以及敏捷,在系统发展的同时,也要考虑组织结构的调整。
在介绍了使用Java框架来构建微服务后,我们需要构建、部署和管理它们。使用现有的技术来进行微服务的伸缩性维护非常困难,因此我们使用类似Docker和Kubernetes来帮助我们进行构建和部署,并使用类似不可变递交的最佳实践。
当我们开始通过Docker和Kubernetes来构建、部署微服务,我们可以使用本地环境来完成这些工作,为此我们使用了RedHat Container Development Kit
以及运行在上面的RedHat OpenShift
来完成部署工作。
译者将其改造为Kubernetes的本地版,minikube
最后我们接触了一点重要的基本概念,例如:配置、日志、Metrics和持续递交,但是我们没有触及注入:安全、自服务等其他数不清的话题,但是并不代表着它们不属于微服务的范畴。
我们希望这本书对你有用。
关于作者
Christian Posta 是RedHat的架构师和中间件专家,他是一名作家、博主和演讲家。他作为Apache ActiveMQ
、Apache Camel
、Fabric8
以及相当多项目的committer。他花费了大量的时间再可伸缩web应用以及帮助企业创建大规模分布式系统,而这些在现在被称作微服务。他热爱分享和指导,并指导团队通过分布式原理、微服务、devops以及cloud-native来获得项目的成功。闲暇时刻,他会和他的妻子Jackie以及两个女儿Madelyn和Claire来渡过美好时光。
关于译者
魏鹏,阿里巴巴集团技术专家。2009年硕士研究生毕业加入阿里巴巴中国网站技术部,曾担任中国网站交易平台架构师,主导了交易系统服务化工作,设计实现的数据迁移系统高效的完成了阿里巴巴中国网站交易数据到阿里巴巴集团的迁移工作。目前在阿里巴巴中间件技术部的应用容器与服务框架组从事Java应用容器Pandora和服务框架HSF的相关工作,其中Java应用容器Pandora是阿里巴巴中间件运行的基础,而服务框架HSF则是阿里巴巴集团实现服务化的主要解决方案,二者在阿里巴巴拥有最为广泛的使用量。个人平时喜欢阅读技术书籍,与同事合著了《Java并发编程的艺术》一书,并翻译一些国外优秀文档,爱总结,喜分享,对Java应用容器、多线程编程以及分布式系统感兴趣,深知“路漫漫其修远兮,吾将上下而求索”,希望能够和大家多多交流共同进步。