分类目录归档:BAE使用

BAE, make coding peanuts works better

【BAE专业版】搭建kibana对日志进行分析

简介 在上一篇文章中,我们介绍了如何将日志写入到ElasticSearch,但查询和展示需要自己编写代码。在这篇文章中,我们将介绍如何在BAE专业版上快速搭建kibana。 准备kibana镜像 Kibana 4.1官方Docker镜像:https://github.com/docker-library/kibana/tree/7ce21f8aa1e58443c3031fdbdf83a08ce34e49a4/4.1。 这里需要对Dockerfile进行简单修改,修改后的代码如下(更改部分已标红): FROM debian:jessie # add our user and group first to make sure their IDs get assigned consistently RUN groupadd -r kibana && useradd -r -m -g kibana kibana RUN apt-get update && apt-get install … 继续阅读

发表在 BAE使用 | 留下评论

【BAE专业版】如何将日志写入到ElasticSearch

简介 当拥有大量的BAE应用,查看日志和定位日志变得较为繁琐,而将日志写入到ElasticSearch,再通过ElasticSearch的强大搜索功能,即可满足日志的各种查询需求。这里将讲解一个简单的demo,将日志写入到ElasticSearch中。 创建百度ElasticSearch集群 百度ElasticSearch是一项托管服务,让您可以在百度云中轻松地部署、操作和扩展 Elasticsearch,完全兼容ElasticSearch开源API。这里我们以百度ElasticSearch为例,当然也开源自己搭建ElasticSearch集群。 ElasticSearch的url信息: ElasticSearch Url为http://elastic.baidu.com:8999/集群ID。百度ElasticSearch采用BasicAuthorization,user为superuser,password为创建时设置。 写日志到ElasticSearch中 因为百度ElasticSearch需要BasicAuth,可以通过如下代码创建认证的client: private WebResource createWebResource() { String url = “http://elastic.baidu.com:8999/cluser_id/index/type”; String user = “superuser”; String password = “password”; final ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); client.addFilter(new HTTPBasicAuthFilter(user, password)); return … 继续阅读

发表在 BAE使用 | 留下评论

tomcat+netty实现TCP连接服务

netty是一个异步的、事件驱动的网络应用程序框架,通过netty可以简化TCP和UDP的socket服务开发(注:目前BAE不支持UDP协议)。 BAE提供的是标准的servlet container环境(tomcat和jetty,本文主要以tomcat为例子),那如何在这样的环境下初始化netty并实现TCP连接的服务呢? 在servlet container环境中,可以通过实现ServletContextListener接口来监听应用启动和停止的事件,我们只需要在启动事件的处理方法中初始化netty即可。 让我们来看一个具体的例子,该例子改编自netty官方的Echo Server例子。 首先,我们需要实现一个ServletContextListener,在contextInitialized方法中初始化netty,让netty监听9000端口: package test; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class StartNettyServer implements ServletContextListener { @Override public … 继续阅读

发表在 BAE使用 | 留下评论

gradle+svn轻松搞定java代码上传

背景 在BAE基础版和专业版上,java应用通过war包文件部署的时候,总会遇到一些小麻烦: BAE专业版的svn/git有单文件40M的限制,所以在专业版的svn/git中上传超过40M的war包(很多war包都会超过40M)是不可行的 BAE基础版的svn/git,以及BAE专业版的打包上传,虽然没有单文件大小限制(BAE基础版的svn/git有所有文件加起来不能超过100M的限制),但是每次有任何改动,都需要上传整个war包,导致每次上传耗时很长 解决的办法很简单:将war包中的文件,解压到BAE专业版或基础版的svn/git中的ROOT目录下(tomcat为ROOT目录,jetty为root目录),再上传。 这样,既能避免了BAE专业版svn/git单文件40M的限制(war包中解压出来的文件一般不超过40M),也能避免每次都要上传整个war包的问题(只需要上传war包中有变化的文件,像依赖的jar包文件一般都是不会发生变化的)。 本文主要介绍,如何通过构建工具gradle,实现打war包、解压war包、上传svn的自动化流程。 注:本文并不包含gradle的使用教程,如果你并不熟悉gradle,建议阅读以下gradle入门系列文章: Gradle入门系列(1):简介 Gradle入门系列(2):第一个Java项目 Gradle入门系列(3):依赖管理 Gradle入门系列(4):创建二进制发布版本 Gradle入门系列(5):创建多项目构建 Gradle入门(6):创建Web应用项目 方案 要实现打war包、解压war包、上传svn的自动化流程,只需要在gradle的构建脚本build.gradle中增加一段脚本,并执行gradle publish命令即可。 首先,在build.gradle中增加以下内容: // 使用war插件打war包 apply plugin: ‘war’ // svnUrl为BAE基础版或专业版的svn地址,可在控制台复制获得 def svnUrl = ‘https://svn.bce.baidu.com/…/’ task updateSvn << { if (file(‘svn’).exists()) { exec { workingDir ‘svn’ … 继续阅读

发表在 BAE使用 | 留下评论

BAE玩转截图对比测试

BAE的截图测试可以精确地截取页面中某一元素的快照,单独的截图测试一般用于获取图源,作为后续图片处理分析的基础,而截图对比测试则可以用于页面样式的监控。网站的更新迭代往往伴随着页面样式布局的更新,而一些较为重点的元素,有时希望固定其样式不受样式更新的影响,截图对比测试就可以用于监控页面某元素,利用md5对比,捕捉其细微的变化。 以百度凤巢广告样式为例:广告样式模板的更新很快,每次ci都有可能会影响现有广告的样式,截图对比测试可以检测到广告样式是否变化,从而判断这次ci是否存在bug。 在截图对比之前,首先会使用截图测试获取一张基准图片,在bae自动测试中创建一个截图测试,指定页面url和被截取元素的查找方式即可。

发表在 BAE使用 | 留下评论

BAE玩转死链测试

由于网站的不断更新、内容更替、自身的bug等原因,页面中难以避免得会存在死链。死链会影响用户的浏览体验,而页面关键位置尤其是推广广告中发生死链,会直接影响网站主的收益。 死链主要分为协议死链和内容死链。协议死链是指通过HTTP协议状态码明确表示网页已无阅读价值,HTTP协议状态码400以上均为明确的死链,对用户的体验影响很大。 内容死链主要是由网站自身变化引起的,网页可以正常打开但是内容毫无价值,例如帖子被删除、内容已转移、空间被关闭、信息已过期、交易已关闭、页面未找到等。

发表在 BAE使用 | 留下评论

使用BAE本地日志系统来定位错误 – node.js篇

在互联网时代,我们的代码都是部署在远程,而且还有可能同时被好几个实例运行。这样的情况使得使用调试器的代价变得非常大。因此,查看log成为了我们最主要的调试手段。 这里,我们以node.js为例,来说明BAE中的本地日志系统是如何帮助我们查找错误的。 在node.js中,最简单的打印log的语句莫过于console.log(…)了。按照惯例,每一个函数的入口都应该有log。而且在错误发生的时候,应该使用console.error(…)来记录每一个错误。

发表在 BAE使用 | 留下评论

【BAE3.0使用系列】JVM参数和Jetty(或Tomcat)可配置

BAE3.0的JavaRuntime提供了Jetty(java-jetty)和Tomcat(java-tomcat)两种Servlet容器供开发者选择。同时提供了JVM启动参数,Jetty和Tomcat的配置文件可配置的能力,给开发者更大的灵活性。

发表在 BAE使用 | 留下评论

【BAE用户使用分享】 通过端口服务一步一步实现SSH登陆

BAE资深用户子午随风,在成功使用端口服务实现SSH登陆后,将使用步骤分享了出来供大家参考,征得作者同意后,我们将其转帖到这里。(原文地址:通过端口服务一步一步实现SSH登陆)

发表在 BAE使用 | 留下评论

【BAE3.0使用系列】BAE2.0应用迁移至3.0指南

1       概述 本文针对有成熟BAE2.0应用的开发者,为其提供迁移到BAE3.0的协助。首先介绍BAE3.0迁移的必要性,以及迁移开发的注意事项,然后介绍迁移的基本流程,并介绍了如何通过迁移协助页来保留2.0的数据库以及域名资源。 BAE3.0的wiki页:http://developer.baidu.com/wiki/index.php?title=docs/cplat/bae BAE3.0的控制中心:http://developer.baidu.com/console

发表在 BAE使用 | 留下评论