簡單情況的,複雜情況不聊,也還沒有那個架構水準。
以一個展示需要很多圖片的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">