大型網站技術架構(三):關於架構體系的補充

一、面向服務的體系架構(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方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章