Java开发者的PaaS指南

阅读原文

摘要: 简介 我从事软件开发工作已有20多年,在此期间,我参与了各种不同的环境下,各类软件系统的搭建工作,其中大部分系统都以Java和web技术为核心,当然其他技术也有所接触。同时,我也有幸参与了从开始到交付的整个软件开发过程。

简介

我从事软件开发工作已有20多年,在此期间,我参与了各种不同的环境下,各类软件系统的搭建工作,其中大部分系统都以Java和web技术为核心,当然其他技术也有所接触。同时,我也有幸参与了从开始到交付的整个软件开发过程。不过在基础设施这一块,我没有参与太多。另外,我也创建过一些服务器,但大多数生产基础设施的构建都是由基础设施团队完成的。我认为这很常见。提供生产级基础设施是一项专门的任务;需要了解安装、配置和强化操作系统、数据库、负载平衡器、防火墙等方面的知识。坦率来讲,这都不是我特别感兴趣的,尤其身在软件行业,我们都需要不断地去学习新知识、新技能,新技术的更新换代实在太快。

记得三年前,我在匈牙利布达佩斯的Craft Conference上,曾就我的一个名为Structurizr的创新应用程序和与会者进行了多次探讨。这个程序的初期演示是在Rackspace的Ubuntu上运行的,但牵扯到了一系列基础设施和操作上的问题,这些问题的解决不在我的能力范围内。会中我收到的一个建议是, 我可以去关注一下Pivotal Web Services这个 PaaS云服务。我确实也在泽西运营一些当地学校的编程俱乐部时接触过这个服务,但没有考虑过它是否能承载我自己的应用程序。

1、Pivotal Web Services

与Cloud Foundry

Pivotal Web Services是一个基于Cloud Foundry的商业服务,提供“平台即服务”(PaaS)。从本质上讲,Cloud Foundry通过API提供了一个应用程序部署平台,可以将部署在公有云、私有云或是数据中心服务器上的底层基础结构抽象出来。

假设你正要在Apache Tomcat Web服务器上构建一个Java web应用程序。那么,在其能在网络上运行之前,你需要在某处提供服务器,安装Java和Apache Tomcat Web服务器。你还需要强化服务器、配置SSL、定期应用补丁等,如果你还想通过使用两个实例来提高恢复能力,那还需要启动第二个服务器,重复前面的步骤,并配置这两个服务器,来支持例如负载平衡器。

当然,你还可以,也可能会,使用Vagrant, Chef, Puppet, Docker等这些自动化配置和部署工具来自动化大部分的操作步骤。

当Cloud Foundry命令行界面安装完成之后,如果我们想部署一个Java .WAR 或.JAR文件,只需要简单地运行一个“cf push”命令,就可以将它部署到Pivotal Web Services 这个PaaS云服务上。仅此而已! 我还可以使用“cf scale”命令来请求Pivotal Web Services来纵向扩展应用程序,例如添加更多的RAM,或把应用程序横向扩展,例如添加更多实例。

如果需要更新应用程序,则要用到另一个“cf push”命令。但这么做会中止当前实例的运行,并将其替换为新版本,因此会有一些服务停止时间。然而,Cloud Foundry PaaS云平台使得通过命令行接口来进行蓝绿部署变得非常容易。如此一来,Java开发人员就可以不具备底层基础设施专业知识的前提下,也在几分钟内建立一个“零停机时间(zero-downtime)”(即服务不会停止)的连续交付通道。

2、基础设施上层的应用程序

正如Joshua McKenty在最近的一个关于思科云的播客中所讲的,Pivotal Web Services和Cloud Foundry为开发者提供了一个更高的抽象层。软件开发人员的职责是处理应用程序,而不是基础设施或容器。

目前,业内关于Docker容器的讨论很火热。我认为Docker是一项了不起的技术。但是,软件开发人员更多的还是要专注于处理应用程序,而不是去关注容器技术或基础设施。我认为关注Docker技术是对大多数软件开发人员本职工作的干扰,对此,我会在另一篇博客里进行阐述。

3、供应商锁定(Vendor Lock-in)

在上文中,我介绍了平台即服务(PaaS),并讨论了如何使用Pivotal Web Services PaaS云服务和Cloud Foundry PaaS云平台来实现应用程序的快捷部署,且无需担心任何底层基础设施的问题。 一个比较常见的误区是,大家总觉得使用Cloud Foundry PaaS云平台(以及Pivotal Web Services PaaS云服务或其他项目)会导致供应商锁定(Vendor Lock-in),从而不能轻易转换云服务提供商。

回过头来再看Structurizr,它是用于可视化和文件记录软件架构的一组工具,系统图示如下:

c3e04f6ae8d410c223b727dc2077015146763a72

总而言之,经过身份验证的用户使用Structurizr Client函数库(Java 和.NET)可创建和上传软件架构模型,并通过web查看这些模型的内容。Structurizr使用SendGrid这个电子邮件服务平台发送电子邮件,所有支付处理都是由Taxamo和 Braintree支付工具服务一起完成的。这里也用到了其他一些云服务(例如CloudFlare、Pingdom和Papertrail),但在图表中没有显示。

从一个(C4模型)容器角度来看,Structurizr如下图所示(图表中忽略了外部服务,因为它们与此次讨论无关):

bcba786ffd9c7c2ee14934844f27cc1271f35bbd

从本质上讲, Structurizr由一个运行在web浏览器(服务于HTML、CSS和JavaScript)的客户端应用程序组成,而服务器端包含一个Java web应用程序服务https://structurizr.com,和另一个Java应用程序服务https://api.structurizr.com,再加上一些数据存储(MySQL数据库管理系统, Redis缓存和Amazon S3云存储服务)。这两个Java web应用程序都运行在Pivotal Web Services这个PaaS云服务上。

这两个Java web应用程序都基于Spring MVC框架,并按照“twelve-factor methodology”中所说明的一系列原则实现的。实际上,从技术角度来看,这两个程序都只是设计在云平台上运行的典型Java web应用程序。两个程序都是无状态的,不会向本地文件系统写入重要信息。

4、供应商锁定(Vendor Lock-in)

和迁移成本

接下来让我们来谈谈供应商锁定(Vendor Lock-in),正如Sam Newman说的那样,“不要一提到供应商锁定(Vendor Lock-in),就自然想到迁移成本”。 Structurizr的所有开发都是在Mac上使用IntelliJ IDEA完成的,而Vagrant虚拟机运行环境管理工具则被用来运行本地的MySQL数据库系统和Redis缓存拷贝。在代码库中,没有任何东西与Cloud Foundry PaaS云平台有关,我也没有在本地运行Cloud Foundry相关的内容。Java应用程序是部署到本地运行的Apache Tomcat实例的标准Java EE.WAR文件。

推送(Push) Structurizr“Web应用程序”(使用“cf push”命令)会导致Web应用程序被部署到Pivotal Web Services 上,并且可以在https://struct-web.cfapps.io的URL中使用。想要把这个web应用程序迁移到另一个云服务提供商的话,以下是我需要进行的一些操作。

1.首先我需要找到另一个支持Java 8,Apache Tomcat 8.x服务器的PaaS云服务,或者构建自己的服务器。另外,Java虚拟机(JVM)还要求安装"Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files",这是因为web应用程序在存储数据时使用了一些强度更高的加密算法。

2. 考虑到web应用程序多个实例在运行(显然,Pivotal Web Services PaaS云服务在单一的URL后进行处理),我需要对这个设置进行镜像。

3. Structurizr.com域的域名服务器(DNS)正由CloudFlare管理,为映射新的部署位置,一些别名(即CNAME)记录需要更改。

就是这么简单。虽说部署脚本需要更改,但不需要对代码进行任何变动。Pivotal Web Services 这个PaaS云服务确实提供了一些基于Cloud Foundry PaaS云平台的附加功能,比如它们的数据仪表板,这对监控和管理很很方便,但这些并不是应用程序的关键组成部分。总之,我并遇到没有任何供应商锁定的问题(Vendor Lock-in),而且迁移成本很低。毕竟,我的Java web应用程序很普通,并不依赖于Cloud Foundry PaaS云平台。

至此,你可能会想,“等等,那数据存储呢?”,这是另一个话题。接下来,我将分享在Pivotal Web Services PaaS云服务中可用的市场服务(Marketplace Service),以及为什么我不做推荐。

5、应用市场服务

(Marketplace Service)

从这部分开始,我想说,我个人确实喜欢且推荐Pivotal Web Services PaaS云服务和Cloud Foundry PaaS云平台来作为部署Java应用程序的方法, 它们能显著简化部署流程,并带来出色的性能表现。我在Pivotal Web Services PaaS云服务上运行Structurizr已经三年多了,几乎没在核心平台上发现有什么问题。但应用市场服务(Marketplace Service)则另当别论。

除了提供一个用于运行代码的部署平台之外,大多数像Pivotal Web Services、Heroku、AzurePaaS云服务这类的平台还会提供“应用市场服务(Marketplace Service)”集合。本质上,这些是附加服务,可以让用户方便地访问数据库、信息传递提供程序、监视工具等,在我写这篇文章时,Pivotal Web Services PaaS云服务应用市场(Marketplace)包含很多当下比较流行的技术; 比如MySQL、 PostgreSQL、 Redis、 Memcached、MongoDB、RabbitMQ等。

6、MySQL 即服务


阅读原文请点击

猜你喜欢

转载自blog.csdn.net/qq_42154484/article/details/80842448