Hadoop中RPC框架實現機制

本文章爲學習後的總結,如果有錯誤,請各位及時幫我指正,感謝。

 

RPC 遠程過程調用,是兩個進程之間的調用。用於微服務之間通信。

在單體架構的時候,我們的Controller和Service 在同一個主機部署,當我要使用Service的時候我直接new 一個Service的實例,然後用 實例調用內部的方法,但是如果把Service抽取成微服務,則這些服務會跟Controller層部署在不同的主機上。這就導致我們原來直接new 實例不能這麼做了。因爲找不到Service的實現了。通過RPC可以間接幫你完成這件事情。這就是RPC的作用。

根據理解畫個圖,方便理解和複習。

如果沒有RPC框架的話  我們要與其他服務器的進程進行通信需要自己使用socket通信

RPC框架其實就是把底層socket通信的機制給封裝起來了,我們不用關心具體的實現。

從上圖可以看到 我們只關心紅色方框中的實現就可以了。並不需要關係我們調用的時候發生了什麼。

 

Hadoop的RPC使用

1. 首先你要有三個類 調用服務的類 Controller 層, 提供服務的接口Service,服務的具體實現類ServiceImpl

2. 通過RPC啓動服務的實現類作爲一個等待調用的進程。

3. 通過RPC啓動調用類,作爲一個調用服務的進程。

調用Service的controller層

package com.hadoop.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;
import java.net.InetSocketAddress;

public class LoginController {
    public static void main(String[] args) throws IOException {
        new LoginController().login("rpcLogin", "快讓我登錄");
    }

    public boolean login(String u, String p) throws IOException {
        LoginService proxy = RPC.getProxy(LoginService.class,
                1L,
                new InetSocketAddress("127.0.0.1", 5225),
                new Configuration());
        String login = proxy.login(u, p);
        System.out.println(login);
        return true;
    }
}

提供服務的接口

package com.hadoop.rpc;

public interface LoginService {
    public static final long versionID = 1L;
    String login(String u, String p);
}

提供服務的具體實現

package com.hadoop.rpc;

public class LoginServiceImpl implements LoginService {
    public String login(String u, String p) {
        return u + " " + p + " login successfully!";
    }
}

啓動進程的客戶端

package com.hadoop.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;

public class ServiceClient {
    public static void main(String[] args) throws IOException {
        RPC.Builder builder = new RPC.Builder(new Configuration());
        RPC.Server server = builder.setBindAddress("127.0.0.1")
                .setPort(5225)
                .setProtocol(LoginService.class)
                .setInstance(new LoginServiceImpl()).build();
        server.start();
    }
}

運行結果

服務端等待被調用

調用端調用後的結果

 

對於剛開是學,我產生一個疑問,在一個項目中運行不就可以了麼,爲什麼還要把調用端和服務端分開部署呢?

這麼麻煩能帶來什麼好處呢?

通過調用的過程,來體會一下好處

1. 我們不用關心使用的網絡協議和網絡和IO模型

2. 我們知道傳遞的參數具體是什麼樣的

3. 跨語言,我的調用端可以使用任何語言給我提供服務,我不需要知道它使用的是什麼實現的。

爲什麼使用RPC把Service分離

1. 當用戶量不大,業務邏輯簡單的時候確實沒必要這麼做。

2. 當系統的訪問量增大的時候,我們一臺服務器無法承受,我們就可以把業務實現分成幾個服務器部署。

3. 當我們有衆多系統的時候,我們的服務是可以通用的,如果不是分離的話可能你要在每個系統都實現一下相同的業務邏輯。如果業務變動,帶來的維護成本大大增加。你要在各個系統都更新一下代碼。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章