简单情况的,复杂情况不聊,也还没有那个架构水准。
以一个展示需要很多图片的web应用作为例子:
1.如果图片和web应用都在一台服务器上,图片越来越多,那么必然大量占用服务器的资源,导致一系列问题。
为了解决这样的问题,我们可以将web应用看成这样的部分组成:不变的web程序包+不断增长的图片文件。
那么我们可以将图片部分单独的提取出来,放在另外的一台服务器上,让原来的服务器只运行web程序包,网页上的图片都用一个
URL地址来指向这些服务器上的图片的地址,这样的话网站的性能就明显提高了,图片服务器(ImageServer)的概念也就产生了。
2.整个的流程就是这样的:
web程序包服务器A(http://192.168.1.1:8080/web)
图片服务器B(http://192.168.1.123:8080/fileService)
A通过HTTP请求(也就是一个地址)访问B进行存储或获取图片
主要是通过tomcat自带的catalina.jar中的org.apache.catalina.servlets.WebdavServlet实现,采用的是webDav协议。
WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET
、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定
(Locking)及解锁(Unlock),还可以支持文件的版本控制。
web服务器A通过页面操作上传一张图片,图片传到后台action,后台action调用底层,底层此时做的事情有两个:
一个是将图片对象加入到一个http请求中,然后将这个请求发送到图片服务器B。
大致过程如下:
HttpClient client = new HttpClient();//建立对象
PutMethod put = new PutMethod(“http://192.168.1.123:8080/fileService”);//设定put方法请求的地址,看了下jar包应该也可以post请求调用put方法
RequestEntity sImageRequestEntity = new ByteArrayRequestEntity(sImage);
put.setRequestEntity(sImageRequestEntity);
//图片设定到请求中去(图片流格式要注意,这里不是具体的正确的格式)
client.executeMethod(put);//执行设定的请求的方法
一个是请求发送之后,将文件的部分路径保存下来,存放在数据库中
图片服务器B要做什么事情呢,接收请求,保存图片。
图片服务器代码:
public class FileServlet extends WebdavServlet {
private FileManager fileManager;
//这里就是被web应用请求所调用的put方法
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
InputStream is = req.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = -1;
while ((b = is.read()) != -1) {
baos.write(b);
}
try {
String rootPath = req.getSession().getServletContext().getRealPath(
"/upload");
fileManager.setRoot(rootPath);
fileManager.saveFile(rootPath,
baos.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
baos.close();
}
}
//当然还有很多其他的方法,比如,doDelte,doGet等等
@Override
public void init() throws ServletException {
fileManager = new FileManagerImpl();
super.init();
}
}
3.图片保存在了图片服务器,路径也保存到了web应用服务器对应的数据库中了,此时就该页面显示了
如:
<img width="224" height="120" alt="sdfsdf" src="http://192.168.1.123:8080/fileService/upload/1.jpg">