前不久,Pivotal 举办了“云原生机制下的微服务”技术沙龙,该活动从微服务这个时下大热的话题入手,讨论了如何建立起“快速试错”和“自动化第一”的DevOps 文化。会议上,来美国硅谷的Pivotal 的Spring 技术专家Josh Long 进行了题为“云原生Java”主的分享,InfoQ 对Josh 进行了采访,探讨了企业如何落地微服务和Spring 的相关工具等问题。
InfoQ:您在演讲中为什么要引用 Deming 的话“改变并非必要,生存并非强制”来阐明你对微服务的看法?
Josh: 面对商业世界中错综复杂的变化,微服务是一种反应举措,它最大的好处是可以帮助企业快速运转,减少业务中间的沟通成本。微服务的团队很小,对应的概念是“两个披萨团队”,即团队点外卖的时候叫两个披萨就够吃了。这种微型的团队往往只需专注于产品的一个可交付性能,这样做的好处是,团队成员之间可以高效并产生快速创新的好想法。如果公司不采用微服务化,依旧保持大型的团队,那么就无法拥有业务更新和产品交付的速度优势,失去了相应的速度就会面临着死亡的威胁,而很多个小团队则可以快速灵活地应对新的变化。
另外,对于大部分的商务业务而言,软件交付至关重要。Uber 和滴滴看起来像是出租车公司,但是他们实际上都是由软件驱动的公司;Netflix 似乎是一家视频租赁提供商,但是它本质上也是一个软件公司;同样 Airbnb 也不是一个连锁的民宿企业,它们同 Google、Apple 这样的软件巨头一样可以快速交付产品。可想而知,如果同行业的其他竞争者不能够相应地提高交付速度,那么大家在市场上的差距将会越来越大。大公司如果继续将技术作为一种成本或者负担就落伍了;技术是核心价值的创造者,也是核心竞争力的体现。
InfoQ:可否阐述一下“云原生”、“微服务”、“DevOps”的关系?这些概念最适合于怎样的 IT 背景和需求?
Josh: 其实这些概念的最终的目的都只有一点:速度最大化。这里的速度包括开发、测试、集成、交付、云计算等所有环节的速度。DevOps 的核心内涵是开发和运维之间可以更好的沟通;微服务则可以让开发团队更快地研发并测试新想法、交付新产品并及时发现新问题;云原生则包涵微服务和 DevOps。软件公司最需要做的事情就是在整体层面建设云原生的软件,从而提高速度。但是,云原生也不止于微服务和 DevOps,提高速度还需要 TDD、持续集成、持续部署等各个环节的配合。当下的企业都需要云原生来进行快速而可靠的交付。
InfoQ:您刚才说“快速而可靠地交付软件”,但是往往速度也意味危险,能解释下如何理解“可靠”吗?
Josh: 这是一个悖论。在大多人看来,速度和质量是矛盾的。有人觉得快速的产品交付会遇到更多的问题,还有一些公司认为软件快速部署是非常危险的事情,要测试每一个环节并且坚持要有人工参与并检验代码,为此花费数月才可以交付产品,但是这并不是正确的方式,在任何应用的开发和修改都会有问题。关键不在于想方设法地完全地避免问题,而在于解决问题的速度是否能让客户更加满意。
所以,我认为应该采用云原生体系,以自动化的方式持续部署应用。自动化令你在一天之内有可能有好几次部署,每一次都可以反馈问题,那么你就拥有了很好的一个时间段来快速地解决这些问题。应用的问题出现之后被快速解决,这才是关键之处,人为地耗费精力检查代码,滞后服务发布的时间,这种做法是没有必要的。
事实上,提高了交付速度也意味着提高了问题的发现和反馈周期的速度,从而可以更快速地修复问题。其次,如果将所有的环节都自动化,那么可以大大减少来自人工操作的错误。所以我不认为速度会带来危险,相反,速度是必要的,并且可以降低风险,它最终会带来更好的结果。
不过这种改变也确实带来了难题。微服务本身就要求快速交付,不过如何将不同的微服务快速整合,解决分布式系统的复杂性才是微服务化之后面临的真正的挑战。如果微服务对应的每个团队不进行整合沟通,那么实际上是拖延了时间,增加了复杂性。
InfoQ:对于微服务带来的复杂性,您能给出一些通用的建议吗?
Josh: 通常而言对于这类问题是有一些可推荐的架构设计范式的,云原生的十二要素是一个范式,还有一些其他的范式,如:
- 服务注册和自动发现
- 配置集中管理
- 微服务的断路器:异常传导隔离
- 最终一致性与事件流
- 客户端自动负载均衡
- API 网关
- 单点登录(SSO) 与安全
InfoQ:在云原生和微服务化的过程中,Spring 生态系统中的各个工具可以起到怎样的作用?Spring 的生态系统越来越大,你怎么看使用者对所用功能都进行了解、理解和再利用的难度增大的情况?
Josh: Spring Boot 是初级的入门框架,用来构建单一的微服务,可以自动化许多建立服务的配置工作;Spring Cloud 则用来应对众多微服务组成的分布式系统的复杂问题;当有很多不同的应用和不同的系统工作时,这时就需要 Spring Cloud Foundry 用来搭建云原生平台。这三个工具是 Pivotal 的基石。
在使用了 Spring Boot 和 Spring Cloud 之后,再使用 Spring MVC、Spring Integration、Spring Data、Spring Security 等配套组件会更加容易,因为不用再书写过多冗余的代码。
用户其实并不需要了解 Spring 的所有组件。Spring Boot 和 Spring Cloud 是两个基础框架,除此之外,用户可以根据业务和技术需要,再选型和添加其他的 Spring 组件。
InfoQ:演讲中提到 Spring Boot 和 Spring Cloud 都可以帮助缩短产品兑现的时间,除了这个具体作用之外,Spring 生态系统还有哪些广义上的目标?
Josh: Pivotal 最初起源于 20 余年前的 Pivotal Labs,彼时公司推崇的通过是敏捷技术开发帮助企业快速交付更好的产品。在后来的发展中,我们发现运维负担过重,需要帮助,所以我们设计了 Cloud Foundry 来自动化大量的运维工作。Spring Boot 大大简化了一个独立服务的建立,Spring Cloud 则降低了建立分布式系统的复杂程度。我们的大数据组件 Spring Data Flow、RabbitMQ、Greenplum 等可以帮助数据工作者建立大数据解决方案、更快地进行数据解读。我们非常非常在意如何能更快地运作,这个目的影响着我们的决策。
现在我们在做机器学习、IOT 等,是共性问题的解决方案,并且是提供给开发人员的解决方案。我们希望他们可以更快速地交付更好产品。很多企业都自主研发软件去解决他们自身特定的业务需求,我们感兴趣的是怎样承载这些企业自研的软件。
InfoQ:数年来您一直是 Java 和 Spring 的死忠粉,能否谈谈为什么?
Josh: 我是 Java Champion,我热爱 Java 和 JVM,这是个非常强有力的平台,并且它有着世界上最大的使用群体之一。若干年前我自己创业时就已经使用了对我帮助极大的 Spring Boot。我发现 Spring 系列除了基础方案之外,还有很多专业细分的解决方案,这些方案很强大而有效。要知道,Java 语言的世界里面并没有哪种模块或工具能够帮助简化工作,而 Spring 的出现有效并出色地填补了 Java 的空白。如果使用 Java 但是不使用 Spring,就需要做好多重复工作;而我本人并不喜欢写那些重复性的代码。我笃信 Java 和 Spring 技术本身,并且相信它能够帮助很多人。
此外,我非常推崇开源技术,我个人非常认同 Pivotal 将每一个技术都开源的做法。现在我是一个 Spring 产品的代码贡献者,而 Spring 的开源软件的贡献者中有好多聪明绝顶的人,人们可以通过使用产品而避免代码的复写。Netflix、阿里巴巴、百度都是 Spring Boot 和 Spring Cloud 的使用者, 这些使用者又会反过来优化 Spring,正所谓前人栽树,后人乘凉,现在的开发者可以分享到前人的智慧与劳动成果,这就是开源技术的魅力所在。
InfoQ:你是开源领域的程序员,但是也活跃在各类知识分享活动上。工作会不会被这种分享活动影响呢?
Josh: 我是 Pivotal 技术团队的工程师,每天都坚持编写代码,在大部分演讲中我几乎都是全程代码演示,因为对于全世界的程序开发者而言,代码是最直接的语言和表达方式,更易懂。我也是 Java 冠军,是 Spring 项目的倡导者,六年来我一直在做的事情就是在单独开发者和整个社群之间架起一座沟通的桥梁。参与 Spring 相关的活动使我可以深入社群,获得大家的反馈。我也关注我们的客户,但并不是从商业的角度去做产品宣传。我的核心工作是向程序员们更新技术动态、收集他们的意见,然后反馈到 Spring 软件研发和发展中,这两类事情其实是相辅相成的。
InfoQ:你认为成长为一名杰出的程序员需要具备哪些技能?
Josh: 从更优秀的人身上学习。我并不杰出,但是我希望有一天我可以变得杰出。开源技术就是一个很好的学习资源,原因有二:首先,你可以重复使用代码,将更多的精力集中到你更关心的部分;其次,你可以从开源代码中学习,很多全球顶尖的程序员都为 Spring 项目贡献代码,你可以通过他们写下的代码学习,将代码写得简洁易懂是非常了不起的能力。
学习要具有持续性,每次都是设定一个小的易于实现的目标,然后一点点地进步。这在现在并不困难,因为现在有很多已经写好的开源项目,大框架和大部分工作已经被实现了,你只需要关注细小的事情、设定细小的目标。
在 Spring 的团队中,我是最笨的一个,还有很多厉害的同事堪称我的英雄,从一开始加入团队的时我就是在仰视他们。作为 Spring 项目的宣传者,我会获得最多的赞扬,但是我所贡献的代码比起来我们团队的工作只是小巫见大巫。
我并不认为高智商是成为杰出程序员的必要条件,但是你一定要时刻葆有学习的好奇心。即使你不聪明,但如果你一直学习,那么不用等很久你就会聪明起来,编写程序是一个关乎逻辑的工作,当然还需要一些创造力;不过,通常而言人们做的事情并不符合逻辑,程序员试着保持逻辑性,但是偶尔会偏离,这就是为什么我们会有程序漏洞。大部分人和人之间的智商差距都不是很大,关键在于你有多大的好奇心、有多么努力。并不是每个人都能像爱因斯坦,爱因斯坦之所以聪明绝顶是因为他可以比别人更快地学习,天才往往可以比其他人更好地学习。所以,不断学习才是最提高自身的关键要素,天才毕竟是少数的。学习资源网上有很多开源项目,比如 Spring 技术社区就是一个很好的资源,你也可以在线上与其他人交流讨论问题,这是一个很好的不断提高学习能力的方式。如果想成为更好的程序员,我们一定首先要成为更好的学习者。
此外,我认为学习型企业很重要。员工没有好坏,员工只是企业的一部分,如果企业的机制不良使得做错事情的几率提高,那么员工很可能就会犯错。如果在一个企业中学习很难机会很少,那么你就不会学习;如果在一个企业中很容易写不良代码,那么你就会写不良代码;如果一个企业不提倡敏捷,那么你就不能快速工作。所以,从企业层面而言,为了实现不同的目标,他们需要进行不同的调整。每个程序员都需要一个好的企业环境来贡献和交付好的代码。
评论