运行环境 ################## .. highlight:: java 基本环境 ============== SAE Java 环境以 OpenJDK 1.7 和 Jetty 9.2 为基础构建而成(过去的OpenJDK 1.6以及Jetty 7继续支持使用),平台运行在CentOS-6.x 64位Linux环境下。 在平台中可以使用 Java 网络开发工具和 API 标准为 Java 运行时环境开发应用程序。应用程序使用 Java Servlet标准与该环境进行交互,并且可以使用常用的网络应用程序技术,例如 JavaServer Pages (JSP)。 平台中的Java 运行时环境使用 Java 7。该环境包含 Java SE Runtime Environment (JRE) 7 平台和库。只要不超过沙盒限制,应用程序就可以使用任何JDK库或第三方API功能。当然你也可以在应用中使用SAE提供的各种云服务。 平台基本特点: + 支持JDK 1.7原生语言,支持J2EE标准 + 多层安全沙箱立体防护,保证应用隔离性 + 良好的兼容性,开放了几乎所有权限,无移植成本 + 完全分布式环境,分布式Session + 故障时JVM自动重启,持续故障时,JVM自动漂移,增加可靠性 + JVM自动伸缩,JVM数量随着应用的访问冷热变化 + JVM自动回收,长期没有任何访问时,降低用户成本 + 完整的本地模拟环境,Eclipse插件支持 + 支持各种流行Web框架,应用零成本迁移 + 支持Socket作为Client端 + 支持在应用中动态创建线程 .. _jvm-auto-recyle-and-scale: JVM自回收/动态伸缩: 若JAVA应用长期没有任何访问(大概3个小时左右),SAE会将所有JVM回收,回收后,JVM不再产生任 何费用。当应用下次被访问时,所有JVM会被再次唤起。JVM动态伸缩是根据您应用的实际的线程数,自动增加或减少JVM数量。 JVM数量: JVM数量也即应用节点数,可选数量为1至4个,可根据应用实际需求选择。当然我们建议你选择2个或以上JVM数量(分布式部署),这样可以利用SAE的负载均衡技术,在出现某个节点宕机等极端情况时,仍然能够保证访问正常(只有正常的节点才处理请求)。当然如果选择1个JVM,也不用担心宕机导致应用请求中断的问题。平台提供的JVM自动漂移技术,使你应用节点在宕机情况下立刻漂移出故障的环境(漂移时间取决于应用启动时间)。 JVM监控: 我们将之前应用创建时运行的默认监控应用直接集成进了开发者的应用之中,所有应用不需要修改任何代码即可通过 http://$appname.sinaapp.com/jconsole 访问。 在这个监控应用中,开发者可以看到当前JVM运行的各种状态信息(内存,gc,等等)。 .. image:: /images/java-jconsole.png 沙箱 ========== 沙箱是Java平台中的用于保护应用数据和代码安全的组件,沙箱对平台中的各应用间做了以下隔离: + 代码隔离:应用间不能相互访问且互不影响 + CPU隔离:不会出现被其他应用抢占CPU情况 + 内存隔离:每个应用都是一个单独的Java进程 + IO隔离:各应用独享一定量的IO,不受其他应用影响 此外平台采用多维立体沙箱保护措施,使得平台中的应用安全坚不可摧。虽然沙箱拥有以上强大的保护功能,但却未对Java原生库做过多的限制,除了以下内容: + 应用程序只能读取应用工作空间内的文件(应用有存储文件需求可使Storage) + 暂不支持UDP(完全支持TCP/SSL/HTTP/HTTPS) + 不支持生成子进程 环境变量 ============= 在Java语言环境中应用的应用名、AccessKey和SecretKey等环境变量可以通过 ``SaeUserInfo`` 对象的多个公共静态方法来获取。 ============== =============================== 环境变量 获取方法 ============== =============================== 应用名 SaeUserInfo.getAppName() 应用AccessKey SaeUserInfo.getAccessKey() 应用SecretKey SaeUserInfo.getSecretKey() 应用版本 SaeUserInfo.getAppVersion() 应用TmpFS路径 SaeUserInfo.getSaeTmpPath() ============== =============================== 详细请参见 `SaeUserInfo的API说明 `_ 。 本地IO ============ 考虑到安全和分布式问题,Java运行环境对本地的IO做了限制: + 应用可以以只读权限访问应用目录以及Java语言的系统库目录。 + 可写TmpFS + 为最大程度降低应用移植的难度,Java为Storage提供了File封装,用户可以像读写本地文件一样来读写Storage。 其中TmpFS的路径可以通过SaeUserInfo对象的getSaeTmpPath()方法来获取。该路径具有写权限,用户可以往该目录下写文件。 .. warning:: + TmpFS内的文件生命周期和请求周期相同,请求过后文件将被销毁; + TmpFS是本地临时文件,不能持久化存储,分布式环境中的其他节点无法读取; + 每个应用拥有自己独有的TmpFS; + TmpFS的文件为纯内存存储。 日志系统 ============== Java 平台环境为每个应用提供了一个日志空间,应用的访问日志,JVM启动和关闭日志,代码输出日志以及服务使用日志都能在日志中心中查看。此外应用使用log4j输出的日志也会被记录在日志中心里 日志分类 -------------- 如上所述,日志中心根据输出类别对日志做了划分 ============================================ ================================================ 类别 输出日志 ============================================ ================================================ HTTP 访问日志,应用运行时输出日志(System.out和log4j) JVM 应用启动,关闭和重载输出的日志 Storage/MySQL慢查询/RDC/Mail/Cron/TaskQueue 对应服务使用日志 ============================================ ================================================ 各种类日志又进行了进一步的级别划分,下表详述了各级别日志输出情况: =========== ================================================ 级别 输出日志 =========== ================================================ requests http非静态资源访问日志,server端的访问 debug log4j.debug,log4j.trace error log4j.error,log4j.fatal,(jvm启动关闭error日志) warning log4j.warning,system.err,(jvm启动关闭warn日志) notice log4j.info, system.out,(jvm启动关闭info日志) resources http静态资源访问日志,如.jpg文件 =========== ================================================ log4j配置 --------------- Java 平台目前提供log4j自定义配置功能,使用log4j输出的日志可通过应用中的log4j.properties来配置。需要注意的是只有输出到console的日志才能发送到日志中心。 下面给出一个log4j.properties的范例 .. code-block:: ini log4j.rootLogger=debug,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} %5p %c\:(%F\:%L) %n - %m%n Session ============ SAE Java平台中的应用部署在分布式环境中,因此SAE为每个应用提供了分布式Session功能,以保证Session能多节点共享。Session信息使用分布式的Memcache进行存储,读写速度非常快。 分布式Session的使用和Servlet标准一样,用户通过session.setAttribute()的方式来存储数据。分布式Session服务默认为关闭状态。 如果要使用分布式session功能,需在war包中的web.xml中增加一个元素 ```` ,Session默认有效期为30分钟,如需调整可在应用的web.xml文件中自行设置。 .. code-block:: xml 30 .. warning:: 1. Session信息使用分布式Memcache存储,因此存储到Session中的对象必须实现 ``java.io.Serializable`` 接口; 2. 由于Session信息采用Cache存储,有较小的丢失概率,所以建议用户将重要信息存储MySQL中; 3. 如果应用不需要使用分布式Session功能,建议在web.xml中去掉元素以提高性能。 框架支持 ============== Java 平台提供了非常宽松的编程环境(almost all permission),大部分流行的Web框架都能运行在平台里。 以下是能顺利在SAE中运行的框架: + Spring 3.x + Struts 1.x/2.x + Hibernate 3.x + MyBatis + Dwr + Play 1.x 外网访问 ============ Java运行环境支持使用 ``URLConnection`` 、 ``Httpclient`` 、 ``Socket`` 等客户端抓取外网页面。