一、面向服務的體系架構(SOA)
1、RPC(Remote Process Call)遠程過程調用
RPC的實現包括客戶端和服務端。
一次RPC調用:客戶端發送RPC請求到服務端,服務端根據客戶端提供的參數執行請求方法,將執行結果返回給客戶端。
2、對象的序列化
對象的序列化:將對象轉換爲二進制流的過程
對象的反序列化:將二進制流恢復爲對象的過程
3、基於TCP協議實現RPC
SayHelloService接口實現了一個sayHello方法
public interface SayHelloService{
public String sayHello(String helloArg);
}
而SayHelloServiceImpl類實現了SayHelloService接口
public class SayHelloServiceImpl implements SayHelloService{
@Override
public String sayHello(String helloArg){
if(helloArg.equals("hello")){
return "hello";
}else{
return "bye bye";
}
}
}
服務消費者Consumer類的部分關鍵代碼:
String interfacename = SayHelloService.class.getName();
Method method = SayHelloService.class.getMethod("sayHello", java.lang.String.class);
Object[] arguments = {"hello"};
Socket socket = new Socket("127.0.0.1", 1234);
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.writeUTF(interfacename);
output.writeUTF(method.getName());
output.writeObject(method.getParameterTypes());
output.writeObject(arguments);
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
Object result = input.readObject();
服務提供者Provider類的部分關鍵代碼:
ServerSocket server = new ServerSocket(1234);
while(true){
Socket socket = server.accept();
//讀取服務信息
ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
String interfacename = input.readUTF();
String methodName = input.readUTF();
Class<?>[] parameterTypes = (Class<?>[])input.readObject();
Object[] arguments = (Object[])input.readObject();
Class serviceinterfaceclass = Class.forName(interfacename);
Method method = services.get(interfacename);
Method method = serviceinterfaceclass.getMethod(methodName, parameterTypes);
Object result = method.invoke(service, arguments);
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(result);
}
4、基於HTTP協議實現RPC
服務接口BaseService:
public interface BaseService(){
public Object execute(Map<String, Object> args);
}
服務實現SayHelloService:
public class SayHelloService implements BaseService{
public Object execute(Map<String, Object> args){
String[] helloArg = (String[])args.get("arg1");
if("hello".equals(helloArg[0])){
return "hello";
}else{
return "bye bye";
}
}
}
服務消費者ServiceConsumer首先定義了要訪問的服務名稱,需要訪問的數據格式,以及需要傳輸的參數,拼裝好訪問的URL,接着HttpClient使用定義好的URL,向服務端發送HTTP GET請求,服務端根據請求的格式做出響應,然後JsonUtil將響應的JSON串反序列化爲JsonResult對象,最終將結果通過HttpServletResponse輸出。
二、分佈式系統
分佈式系統是由多個節點組成的系統。節點相互連通,相互之間的操作會有協同。
1、組成計算機的5要素
組成計算機的基本元素包括:輸入設備、輸出設備、運算器、控制器和存儲器
2、網絡IO實現方式
實現方式 | 名稱 | 介紹 |
---|---|---|
BIO | Blocking IO | 阻塞,一個Socket套接字需要使用一個線程來進行處理 |
NIO | Nonblocking IO | 基於事件驅動思想,採用Reactor模式,在一個線程中處理多個Socket套件字相關的工作 |
AIO | AsynchronousIO | 異步IO,採用Proactor模式,在進行讀寫操作時,調用相應的read/write方法 |