在上一篇文章中,我们部署了如下一个ambry集群:
下面,我们来为这个集群做简单的测试:
首先,简单介绍下Ambry的API:
1.GET /healthCheck 这个API用来检查集群状态是否完好。 我们访问(相当于直接GET):xx.xx.8.133/healthCheck,看到返回:
HTTP/1.1 200 OK
Content-Length: 4
GOOD
2.POST / 这个API用来传入需要存储的对象和元数据并保存在ambry中,ambry会返回保存信息。 在你的Request Header中,需要提供你要保存对象的元数据:
Request Header | Type | Required? | Description |
---|---|---|---|
x-ambry-blob-size | Long | Yes | 你要保存对象的大小,这个一定要准确,否则会上传失败 |
x-ambry-service-id | String | Yes | 你可以通过这个字段设定是哪个服务上传的对象 |
x-ambry-content-type | String | Yes | 对象类型 |
x-ambry-ttl | Long | No | 对象存活时间,默认是-1,即无限时间 |
x-ambry-private | Boolean | No | 是否是私有对象,默认为false,即任何人可以访问 |
x-ambry-owner-id | String | No | 通过这个属性指定对象的拥有者 |
x-ambry-um- | String | No | 如果用户想自定义一些属性,需要以这个开头,可以指定任意个这个开头的属性 |
在成功后,返回response的header中,会包含一个Location的属性:
HTTP/1.1 201 Created
Date: Sun, 01 May 2016 05:35:21 GMT
Location: /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw
Content-Length: 0
x-ambry-creation-time: Sun, 01 May 2016 05:35:21 GMT
这个Location,就是Ambry为每个保存的对象生成的集群内全局唯一ID,之后,根据这个ID可以拿到这个对象或者这个对象的元数据。
3. GET /
GET /
举例:GET /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw
这个ambry-id就是之前返回的response中的Location属性
GET //
举例:GET /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw/x-ambry-blob-size
这个是取对象的一个属性。
4. HEAD /
HEAD /
这个用于获取元数据
5. DELETE /
DELETE /
这个用于删除某个ambry对象。
接下来,我们通过Java-web写一个小程序,来测试下Ambry的功能: 首先,保存至ambry的接口实现方法:
public String uploadFile(MultipartFile file1, String ServiceId, String owner, String fileFormat,
String description) {
HttpURLConnection connection = null;
OutputStream os = null;
DataInputStream is = null;
InputStream inputStream = null;
int count = 0;
//失败重试三次
while (count <= 3) {
try {
File file = new File(StrUtils.makeString(tmpFilePath,"/",file1.getOriginalFilename()));
file1.transferTo(file);
if (!fileFormat.equals("image")) {
inputStream = new StreamGenerator(file, tmpFilePath).getInputStream();
} else {
inputStream = new FileInputStream(file);
}
int length = inputStream.available();
connection = (HttpURLConnection) new URL(ambryUrl).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/octet-stream");
//设置是否从httpUrlConnection读入,默认情况下是true;
connection.setDoOutput(true);
//设置是否向httpUrlConnection输出,默认为false
connection.setDoInput(true);
connection.setRequestProperty("x-ambry-blob-size", length + "");
connection.addRequestProperty("x-ambry-service-id", ServiceId);
connection.addRequestProperty("x-ambry-owner-id", owner);
connection.addRequestProperty("x-ambry-content-type", fileFormat);
connection.addRequestProperty("x-ambry-um-description", description);
connection.connect();
os = new BufferedOutputStream(connection.getOutputStream());
byte[] buffer = new byte[4096];
int bytes_read;
//只要可以读取到数据,就输出写到buffer中
while ((bytes_read = inputStream.read(buffer)) != -1) {
os.write(buffer, 0, bytes_read);
}
//数据读取完关闭inputStream
os.close();
inputStream.close();
String location = connection.getHeaderField("Location");
return StrUtils.makeString(ambryUrl, location);
} catch (Exception e) {
count++;
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e1) {
//写失败日志,后面会有引擎继续尝试写入对象
log.warn("file-upload-failed:"+ JSON.toJSONString(file1)+"|||"+"{ServiceId:"+ServiceId+",owner:"+owner+",fileFormat:"+fileFormat+",description:"+description+"}");
}
log.warn(ExceptionUtils.getStackTrace(e));
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
log.warn(ExceptionUtils.getStackTrace(e));
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
log.warn(ExceptionUtils.getStackTrace(e));
}
if (connection != null) {
connection.disconnect();
}
}
}
return null;
}
在前端,我们利用editor.md这个markdown编辑器做测试展示: 上传:
成功后:
我们现在停掉xx.xx.8.133上的ambry: 访问xx.xx.8.133:1174/healthCheck:
HTTP/1.1 200 OK
Content-Length: 4
GOOD
这时,我们添加一张图片:
添加图片成功,访问成功。 之后,我们停掉xx.xx.8.134,xx.xx.8.135上的ambry,再次访问xx.xx.8.133:1174/healthCheck:
HTTP/1.1 200 OK
Content-Length: 4
GOOD
这时候就有问题了,集群状态还是良好。。。估计是我们的使用有问题,需要集群监控状态统一中心,类似于zookeeper这样的东西,我们目前的配置中没有,之后我们会讲这个配置。 这时,我们再去上传图片,发现上传不了。 接下来,我们启动xx.xx.8.133,就是在停掉这个之后上传图片的那个ambry。 访问之前上传的那个图片,发现访问不了。
之后,我们启动xx.xx.8.134,xx.xx.8.135,稍等一段时间后,发现图片又可以访问了。
之后,我们停掉xx.xx.8.134: 访问图片,正常:
停掉xx.xx.8.135: 访问图片,正常:
原来在133挂掉时上传的图片,目前在133上也可以访问了