本文章爲學習後的總結,如果有錯誤,請各位及時幫我指正,感謝。
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. 當我們有衆多系統的時候,我們的服務是可以通用的,如果不是分離的話可能你要在每個系統都實現一下相同的業務邏輯。如果業務變動,帶來的維護成本大大增加。你要在各個系統都更新一下代碼。