GoogleAppEngine开发指南【第一章】开发环境搭建及基础入门


1、Google App Engine是什么?

关于这个问题,恐怕没有什么回答明能比官方说明更明了、准确了。
《什么是Google App Engine?》 https://developers.google.com/appengine/docs/whatisgoogleappengine?hl=zh-CN
简单说来:Google App Engine是一个云平台,允许开发者在遵守其平台相关规则的前提下,将自己的应用部署在Google基础架构上。与自己购买VPS等方式的区别在于:你再也不需要管理这些硬件或系统了。你无需担心CPU是不是够用?内存是不是被耗尽?存储空间是否已满?这些事情Google已经帮你做好,因此你只需关心自己的核心业务如何实现就可以。当然,做任何事情都需要付出一定的代价,所以使用GAE也意味着需要遵守Google的相关规则。例如:不能编写Socket代码因为GAE只允许用户通过HTTP和HTTPS访问;没有本地文件读写;有限但一般足够的JRE白名单;任何情况下,必须在60秒中之内返回响应数据。请求处理程序不能在发送响应后生成子进程或执行其他代码。





2、Google App Engine不是什么?

从08年推出第一个版本至今,Google App Engine经历了许多变化。但从本质上将,它不属于IAAS(Infrastructure-as-a-Service 如亚马逊EC2),也不是SAAS(Software-as-a-Service如Salesforce)。实际上Google App Engine介于这两者之间,按照Google自己的描述来说,它属于PAAS(Platform-as-a-Service)。
有关于IAAS、SAAS以及PAAS之间的区别请看Google官方回应 https://developers.google.com/appengine/training/intro/whatisgae?hl=zh-cn

3、Google App Engine支持哪些开发语言以及有哪些服务?

目前官方支持的语言有:Go、Python、Java。由于GAE支持Java语言,所以它也支持那些能够运行在JVM上的其他一些语言,包括但不限于:Scala、JRuby、Groovy、Jython等。
上面说到运行在GAE上面的应用需要遵守“近乎苛刻”的规则才能生存。也许有人会问:“没有Socket通信,那我就没有办法构建我的应用了”。可真正的问题在于:作为一个web开发者,你需要那些底层OS功能干什么呢?“我需要我的应用和其他程序进行通信”。好吧,如果需要要这么做的话。想发邮件或者即时消息的话可以使用Mail API和XMPP API就足够了,不需要自己做那些底层操作。想使用其他网络应用吧?那就试试URLFetch吧!需要缓存?GAE提供了全局Memcache API呢!需要数据库?好的,如果你认为现在的NoSQL太过于新颖的话,也可以选择类似MySQL的Google Cloud SQL就好。除此之外还有用来存储Blob数据的Blobstore服务、处理图片当然离不开Images服务,还有给开发者使用的LogService服务。

4、实际存在的一些问题?

由于众所周知的原因,你不能直接访问Google App Engine首页及任何运行在其平台上的应用。这片文章不会告诉你如何使用一些特殊方法访问GAE,因为作为开发者这样的问题你应该自己解决。
既然访问GAE都这么折腾,还需要学它来干嘛?为什么不直接选择Sina App Engine?!问的好。如果你愿意选择的话,没有任何人可以阻挡。我也无心对GAE和SAE做深层次的比较,更不想在这片文章中夸大其词的称赞GAE或SAE。每个人都是自由的,拥有自由的权利去选择自己想要的平台。GAE适合什么群体使用?第一:特别适合海外app开发者;第二:适合那些有想法,并且抱着试一试的心态去做的开发者。GAE对于部署在其平台上的应用有着很多优惠条件,就当前而言免费用户可以:每个账户可以注册最多10个应用、每个应用拥有1G的存储空间、每月500万页面访问等。这些配置对于一个刚起步的开发者来说,已经足够用了。如果不够用也没有关系,可以通过少量的费用购买额外的配额。如果你的应用起步不错的话,这些投入却是已经算是很少的了。
虽然GAE支持Go、Python语言,但接下来的内容将以Java语言为主讲解如何在GAE上开发web应用并调试、部署。如果你喜欢Python或其他语言,可以去GAE主页查看相关语言的开发过程。以下的内容假设你已经学过并熟悉Java、JSP、Servlet、JSTL及其他常用web开发技术,并且对各种常见的企业级框架有一定的了解。

5、开发环境搭建

下载并配置Google App Engine SDK
为了能够使用GAE提供的各项服务,必须先行安装GAE SDK。针对不同操作系统及不同开发语言,GAE提供了相关SDK包供开发者使用。
Google App Engine SDK 下载地址 
https://developers.google.com/appengine/downloads
对于Java语言来说,由于其跨平台的特性,因此不管是何种操作系统都下载同一个开发包。截至本文编写时,GAE SDK最新版本号为:1.7.5且大致大小为91.8M。请注意,百度搜索结果中存在许多国内下载地址,为了保证代码安全及一些可能出现的其他原因,强烈推荐去Google官方地址下载(上述)。不论出于何种原因,最好不要从国内下载任何关于GAE的相关程序或代码。下载完之后将该zip包解压只硬盘某处即可。
使用Eclipse IDE作为开发工具
首先安装Eclipse之后再安装Google Plugin for Eclipse。Google Plugin for Eclipse其中包含Android开发插件ADT、GWT及Swing开发插件以及GAE相关插件。你可以根据自己的喜好决定安装其中部分或者全部。本文之后的内容将使用Eclipse 3.8/4.2 (Juno)作为开发工具。请注意,不同版本的Eclipse需要不同版本的插件,因此在选择时需要慎重。否则安装插件过程中可能会出现意外。在安装方式上,国内用户强烈推荐独立下载zip插件包本地安装的方式。由于众所周知的原因,选择在线升级可能出现意外。
Eclipse 3.8/4.2(Juno)在线升级地址: 
https://dl.google.com/eclipse/plugin/4.2
各版本Google Plugin for Eclipse独立zip升级包下载地址: https://developers.google.com/eclipse/docs/install-from-zip
安装完Eclipse以及Google Plugin for Eclipse之后,还需在Eclipse中指定Google App Engine SDK配置路径(也就上上一步下载的zip包解压路径)。在Eclipse中选择:Perferences>Google>App Engine之后在其中制定SDK安装路径。

6、万恶的Hello World

GAE应用程序使用标准的Servlet结构作为web应用架构,因此GAE应用程序的组织结构和大多数的Java Web应用程序一致。最好的学习方式莫过于直接查看(学习)GAE SDK中包含的演示用例了。你可以在{googleappengine_home}/demos找到Google提供的13个实例项目并观察其结构。
01项目文件夹
02       src文件夹
03            (Java源文件)  
04            META-INF文件夹
05       war文件夹
06            (JSP文件、图片、样式、脚本……)
07            WEB-INF/
08                lib文件
09                classes文件夹
10                web.xml
11                appengine-web.xml
你可以手动新建上述目录结构并将适当的内容放置在其中。或者你也可以选择复制{googleappenginehome}/demos/newproject_template作为你的新项目,该目录是提供给开发人员使用的项目模板,其中搭建了项目结构并做了一定的配置。 如果你选择使用Eclipse IDE开发GAE应用,那么可以从菜单中选择:File-->New-->Google-->Web Application Project来新建一个GAE项目。注意在新建时将“Use Google Web Toolkit”选项去掉,因为我们不需要它。 接下来我们在src文件夹中新建java包并在其中新增一个Servlet类,重写其中的doGet()及doPost()方法。其部分代码如下:
01package com.barrywey.gaeguide.chapter01.web;
02
03import java.io.IOException;
04import java.util.logging.Logger;
05
06import javax.servlet.ServletException;
07import javax.servlet.http.HttpServlet;
08import javax.servlet.http.HttpServletRequest;
09import javax.servlet.http.HttpServletResponse;
10
11public class HelloWorldServlet extends HttpServlet {
12
13private static Logger logger = Logger.getLogger(HelloWorldServlet.class.getName());
14
15protected void doGet(HttpServletRequest req, HttpServletResponse resp)
16        throws ServletException, IOException {
17    logger.info("开始运行GAE中的Servlet代码!");
18    resp.setCharacterEncoding("utf-8");
19    resp.setContentType("text/html");
20    resp.getWriter().println("<center><h1>我的第一个Google App Engine应用!</h1></center>");
21    }//end of doGet()
22 }
千万别忘记将上述Servlet信息配置到web.xml文件中,如下:
1<servlet>
2    <servlet-name>HelloWorldServlet</servlet-name>
3    <servlet-class>com.barrywey.gaeguide.chapter01.web.HelloWorldServlet</servlet-class>
4</servlet>
5
6<servlet-mapping>
7    <servlet-name>HelloWorldServlet</servlet-name>
8    <url-pattern>/hello</url-pattern>
9</servlet-mapping>
此外,你也会在项目结构中发现在war/WEB-INF/appengine-web.xml文件。该文件是GAE应用的核心,所有关于GAE应用的相关配置都将在其中展现。目前,该文件中的内容大致如下:
01<?xml version="1.0" encoding="utf-8"?>
02<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
03      <application></application>
04      <version>1</version>
05
06      <threadsafe>true</threadsafe>
07
08      <system-properties>
09            property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
10      </system-properties>
11</appengine-web-app>
节点中包括若干子节点对GAE应用进行配置。 节点是你将要部署的GAE应用的id,在申请GAE应用时确定。而目前属于开发过程,尚未申请对应的id因此可以留空。 节点表示GAE应用对应的版本,其内容可以是数字、字母。在你的GAE应用程序上传过程中,AppCfg会根据你指定的版本决定是重新上传新版本代码还是覆盖原有版本代码。不同版本的应用可以通过不同的URL访问,其大致URL如:
http://versionid.latest.yourapp_id.appspot.com
关于apengine-web.xml文件的DTD描述,可以在{googleappengine_home}/docs文件夹中找到,感兴趣的朋友可以详细研究。因为该文件是GAE的核心文件之一,限于篇幅等原因这里就不再详细描述。今后的开发过程中将会经常接触该文件,留做以后讲解。
在Eclipse中右键单击项目并选择:Run As → Web Application就可以运行该项目。好的开发者应该经常习惯断点调试,因此建议选择: Debug As → Web Application。完成之后在Eclipse Console可以看到GAE项目启动过程,GAE应用将会部署在本机8888端口。 运行效果图

7、关于GAE的请求(Request)

可以看出,GAE其实就是对Servlet环境的一种封装。因此只要懂得如何编写Servlet就可以编写GAE应用。但GAE所提供的环境又与标准的Servlet环境有若干区别。这些不同点或由于安全性问题导致,或由于其他一些特殊因素考虑。请注意:GAE背后运行着成千上万的服务器,GAE会自动调整服务器的数量以匹配不同的请求。因此,某一时刻客户端发送过来的请求有可能被分发给许多服务器中任何一台。即使同一个用户发送过来的多个请求,我们也不能保证会被分发给同一个服务器处理。这很可能和之前我们见过的传统web响应模式有区别,因此需要更多的关注。
客户端发送的HTTP请求可以包含若干头部信息(Http Headers),为了安全起见,GAE对以下头部信息进行过滤:
Accept-Encoding 
Connection 
Keep-Alive 
Proxy-Authorization 
TE 
Trailer 
Transfer-Encoding
此外,GAE还新增了一些特殊的头部信息供开发者使用,其内容说明如下:
X-AppEngine-Country 
该头信息中包括了发送请求的客户端所在国家代码。国家代码基于ISO 3166-1 alpha-2标准,GAE会根据请求IP地址判断并返回该内容 
X-AppEngine-Region 
该头信息包括了发送请求的客户端所在地区。注意:该头信息只在X-AppEngine-Country起作用的情况下才有意义。如:X-AppEngine-Country返回的是“US”,且X-AppEngine-Region返回“ca”,那么“ca”指“California”而不是“Canada”。对于大部分中国开发者而言,该信息则表示“省”的概念。 
X-AppEngine-City 
该头信息包括了发送请求的客户端所在城市。 
X-AppEngine-CityLatLong 
该头信息包括了发送请求的客户端所在位置出Latitude(谷歌纵横)代码。

8、关于GAE的响应求(Response)

客户端发送请求(Request)之后,GAE调用对应的请求处理代码并执行,之后将执行的结果发送给客户端(标准B/S模式)。响应发送的数据大小限制为32M。如果响应大小超过此限制,服务器将会返回500错误。请注意,此大小限制不做用于从Blobstore或Google Cloud Storage中返回的数据。后者用来读取文件以及操作其他数据,其大小限制对于普通的响应来说具有更为宽大的支持。
此外,如果客户端发送的请求中的 HTTP 头部信息指示客户端可以接受压缩 (gzip) 内容,GAE将自动压缩响应数据并附加相应的响应标头。它使用 Accept-Encoding 和 User-Agent 请求标头确定客户端能否可靠地接收压缩响应。自定义客户端可通过将 Accept-Encoding 和 User-Agent 标头值指定为“gzip”,强制进行内容压缩。
同样处于安全考虑,以下响应头(Response Headers)信息将被过滤:
Connection
Content-Encoding
Content-Length
Date
Keep-Alive
Proxy-Authenticate
Server
Trailer
Transfer-Encoding
Upgrade


9、关于日志及控制台

GAE应用中可以使用 java.util.logging.Logger 将信息写入应用程序日志。你可以使用管理控制台(Administration Console)查看和分析应用程序的日志数据,或使用 appcfg.sh requestlogs 下载日志数据。管理控制台可以识别 Logger 类的日志级别,并且以交互方式显示不同级别的消息。Servlet 写入标准输出流 (System.out) 和标准错误流 (System.err) 中的所有内容都由 GAE捕获,并记录在应用程序日志中。写入标准输出流的行将以“INFO”级别记录,写入标准错误流的行将以“WARNING”级别记录。任何记录到输出或错误流的日志记录框架(如 log4j)都适用。但为了细化对管理控制台日志级别显示的控制,日志记录框架必须使用 java.util.logging 适配器。对于日志的配置信息,我们可以GAE目录中找到{googleappenginehome}/config/user/logging.properties及log4j.properties文件,可以将logging.properties复制到WEB-INF/classes中使用日志框架。或者也可以将该日志配置文件放置在war目录中的任何地方,之后在appengine-web.xml文件中对系统属性java.util.logging.config.file进行配置。如下所示:
1<system-properties>
2        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
3  </system-properties>
如果你选择Eclipse IDE作为开发工具,则以上信息全部都已经有Eclipse帮你完成好了,直接使用即可。(这不就是为什么我们要使用IDE的原因之一么?!)

10、本讲小结

本次内容主要讲解了GAE的一些概念,及基础的入门信息。我们了解到GAE其实就是标准的Java Web结构中编写Servlet代码而已,只要稍微熟悉Java Web技术的开发者都能很快上手。此外,也了解到appengine-web.xml文件是GAE应用的核心,所有GAE应用相关的配置都将在此文件中展现。另外,由于安全因素考虑,GAE对每个请求(Request)及响应(Response)中的头信息(Headers)进行了一定的过滤。在编写代码过程中,要积极发挥日志文件的作用,一旦出现问题可以根据日志帮助分析并纠正。
接下来,动手试试看吧!注意:不会总结的人是永远不会有进步的!因此当你完成每次学习之后,一定要对自己所学的知识进行总结。






No comments:

Post a Comment