面試官不講碼德,欺負我一個年輕的開發工程師

2020-12-05 全棧技術資源社區

面試官不講碼德,欺負我一個年輕的開發工程師,問如果是你怎麼設計RPC?

RPC也不是很難啊,教你如何使用socket加動態代理與反射實現Rpc

先來解釋解釋一下rpc,首先很多人以為rpc是一種協議,其實這個就是出錯誤的,rpc:是遠程過程調用;

看他的全程英文Remote Position Control 他其實是一種設計思想而已,解決分布式各個系統之間的調用關係。

我們今天就用socket方式實現一套rpc調用框架,不多說上代碼

package rpc.socket;

//先定義一個clinet接口

public interface Clinet<T> {

T getService(Class<T> tClass);

}

這是我個人寫的一個實現類,給位大牛可以嘗試實現

這裡是採用動態代理。把調用大的過程交給代理對象,這樣就可以屏蔽掉底層的網絡和整個調用過程,

對於客服而言只用給一個接口的class對象,他會幫你去找到服務端實現類,實現遠程調用

import java.io.*;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.net.Socket;

import java.util.Properties;

public class RpcClint implements Clinet {

final static String RPC_SERVER_HOST="RPC_SERVER_HOST";

final static String RPC_SERVER_PORT="RPC_SERVER_PORT";

@Override

public Object getService(Class aClass) {

return Proxy.newProxyInstance(aClass.getClassLoader(), new Class[]{aClass}, new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//讀取配置文件

Properties properties = new Properties();

InputStream resourceAsStream = aClass.getClassLoader().getResourceAsStream("rpc/RpcConfig.properties");

properties.load(resourceAsStream);

String host = properties.getProperty(RPC_SERVER_HOST);

Integer port =new Integer((String) properties.get(RPC_SERVER_PORT));

//RPC註冊過程

Socket socket = new Socket(host, port);

OutputStream in= socket.getOutputStream();

ObjectOutputStream objectOutputStream = new ObjectOutputStream(in);

//告訴服務端調用的是哪個類

objectOutputStream.writeObject(aClass.getName());

//告訴服務端調用的是哪個方法

objectOutputStream.writeObject(method.getName());

//告訴服務端調用方法傳入的參數

objectOutputStream.writeObject(args);

//告訴服務端調用方法的參數類型

objectOutputStream.writeObject(method.getParameterTypes());

//完成序列化,刷新

objectOutputStream.flush();

//接受服務端響應結果

ObjectInputStream returnObj=new ObjectInputStream(socket.getInputStream());

Object o = returnObj.readObject();

//關閉流

objectOutputStream.close();

returnObj.close();

resourceAsStream.close();

socket.close();

return o;

}

});

}

這是服務端接口

import java.io.IOException;

public interface Server {

void Handler() throws IOException;

這是我實現的服務端rpc,就是採用一個nio接受客服端數據,然後去調用服務端的方法

import rpc.socket.service.GODService;

import rpc.socket.service.GODServiceImpl;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import java.net.ServerSocket;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.ConcurrentMap;

public class RpcServer implements Server {

//裝用實現類的bena

static Map<String,Class> RESmap;

//加載所有需要註冊的額服務

static {

//這裡可以用Aop 加註解的方式來把需要暴露的服務,註冊到服務列表裡面去

RESmap=new ConcurrentHashMap<>();

//把服務註冊到註冊表

RESmap.put(GODService.class.getName(),GODServiceImpl.class);

public void Handler() throws IOException {

ServerSocket serverSocket = new ServerSocket(8080);

//採取傳統的bio處理

while (true){

//等待客服端連結

Socket accept = serverSocket.accept();

new Thread(()->{

try {

//等待客戶端輸入

ObjectInputStream in= new ObjectInputStream(accept.getInputStream());

//獲取客戶端傳過來的類名稱

String className = (String) in.readObject();

//獲取客戶端客服端傳過來的方法名稱

String methodName=(String) in.readObject();

//獲取客戶端傳過來的參數

Object[] args = (Object[]) in.readObject();

//獲取客服的端傳過來的參數類型

Class[] argsType = (Class[]) in.readObject();

//從註冊表中獲取服務的字節碼

Class aClass = RESmap.get(className);

//通過字節碼對象獲取構造器

Constructor constructor = aClass.getConstructor();

constructor.setAccessible(true);

//通過反射的方式創建對象並且執行對象的方法

Object invoke = aClass.getMethod(methodName,argsType).invoke(constructor.newInstance(), args);

//把返回結果寫回給客戶端

ObjectOutputStream returnObject=new ObjectOutputStream(accept.getOutputStream());

returnObject.writeObject(invoke);

//關閉流

in.close();

returnObject.close();

accept.close();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

} catch (IllegalAccessException e) {

} catch (InstantiationException e) {

} catch (NoSuchMethodException e) {

} catch (InvocationTargetException e) {

}

}).start();

}

這裡我們來建立一個服務端

首先定義一個接口

package rpc.socket.service;

public interface GODService {

String getGod(String lockMessage,String offerings);

實現類

public class GODServiceImpl implements GODService {

public String getGod(String lockMessage, String offerings) {

System.out.println("的供品:"+ offerings);

System.out.println("你的願望:"+lockMessage);

return "年輕人還是少做夢!";

寫一個服務端的啟動類

package rpc.socket.demo;

import rpc.socket.RpcServer;

public class ServiceStart {

public static void main(String[] args) throws IOException {

new RpcServer().Handler();

然後是客服端去調用

import rpc.socket.Clinet;

import rpc.socket.RpcClint;

public class clintDemo {

public static void main(String[] args) {

Clinet Clint = new RpcClint();

GODService service = (GODService)Clint.getService(GODService.class);

String lockReturn = service.getGod("請給讓我中彩票吧", "獻祭我老闆的二十年壽命!");

System.out.println(lockReturn);

我們來看兩遍的結果

客服端結果

我來看服務端結果

很顯然調用成功了

現在我們來畫圖模擬一下調用過程

相關焦點

  • 「我,面試官,被90後要求做性格測試」
    如果管過一群90、95後的年輕人,或者和他們一起工作過的話,你不會把這個當成段子,這是一個會真實發生且平常的事情。這屆90後們看重工作帶來的薪水,但更看重這份工作背後的體驗和價值:這份工作有沒有讓我快樂、我能不能得到成長、我的同事裡有沒有大神……
  • 一位硬體工程師的面試經歷
    一位硬體工程師的面試經歷 工程師吳畏 發表於 2018-10-18 10:13:00 今年就業形勢:今年形勢依舊不景氣,英特爾硬體部門基本不招人,思科硬體部門和信號完整性方面也不招人
  • 面試官:將冰變成水最快的方法是什麼?小夥:我三秒鐘就行了
    面試官:將冰變成水最快的方法是什麼?小夥:我三秒鐘就行了求職是每一位應屆畢業生,必須要經歷的事情。但是想在面試的過程中,成功的獲得一份工作,卻不是一件容易的事情。因為面試官現在的考核越來越嚴格了,面試官不僅僅針對於求職者能力方面的考核 ,還會對求職者的臨場反應能力和執行力方面進行考核,而這些方面的考核,面試官往往會通過提出一些問題來考核應聘者。前幾天,我的一位好友,就跟我講述了他去面試時,所遇的一件奇葩的事情。
  • 面試官問:「你的興趣愛好是什麼?」這樣回答,面試官最滿意
    1 面試官為什麼要問這道題?面試官時間是很寶貴的,在短短一個小時之內,需要對候選人深入的了解,所以問任何問題都是有目的性的,那面試官問:「你的興趣愛好是什麼?」有什麼目的呢?1) 為了緩和氣氛,讓你為放鬆下來面試的時候,面試官和候選人一直在交鋒,如果一直氣氛很嚴肅,怕候選人進展,進而發揮不好,於是中間會穿插一些輕鬆的話題。
  • 面試官:下水道井蓋為什麼是圓的?網友的神回復讓面試官讚嘆不已
    求職者小心翼翼,步步為營的回答,希望得到面試官的首肯。面試官露出頗有逼格的笑容,說,別急,我這還有題呢。你能不能過關,全看這一招。面試官出的題目是:下水道井蓋為什麼是圓的?面試官說,這是考察你的思維性、靈活性及應變力。下面還原下大公司的面試現場。針對這道題,網友「大蝦」的回覆條條精彩,條條是神回復。簡直是知識的化身。這就會讓正襟危坐的面試官都讚嘆不已。
  • 面試官:李字減去子,是啥字?小夥五秒答出,機智通過面試
    通過簡歷的篩選,再到獲取面試資格,職場的競爭就是這麼殘酷。正常來說,規模大的公司的面試都很正規,但是小公司就比較隨心所欲。隨著社會的發展,畢業生越來越多,各大學校的優秀學子開始踏入社會這個大環境,開始緊張的投簡歷找適合自己的工作。隨著畢業答辯的落下帷幕,很多大學生都開始自己的求職歷程。每年這個時候,全國都有大批大學生畢業,就業難早就已成為一種社會趨勢了。
  • 面試官:我請你坐下卻不給你凳子,怎麼辦?小夥神回復被當場錄取
    現如今想要進入一個自己心儀的公司,真的是需要過「五關斬六將」經歷百場的筆試在加上一次決定命運的面試才有可能得到一份飯碗。很多人筆試通過,但是卻敗在面試上,這樣真的是太可惜了。一家新媒體公司在招收新員工的時候,除了必須的10個基礎問題外,面試官僅用了一道「請你坐下卻不給你凳子,怎麼辦?」的面試題,瞬間篩選出了崗位需要的精英。咱們來看看應聘者遇到這樣的問題的時候都是怎麼回答的。第一位面試者。可能是緊張的原因語無倫次地說了半天,面試官也沒聽懂他說的是什麼。
  • 盤點網友面試遇到的各種奇葩問題,最後一個面試最坑爹?
    網友A十年前應聘倉庫主管,面試官的很多問題都回答了,最後問了一個問題「你能看懂圖紙嗎?」我回答:「對不起,我沒見到圖紙,回答不出來,既更見到了,也不一定能看懂。」結果我被錄用了,因為其他的應聘者都說能看懂。
  • 面試官:一個口加個二,是什麼字?回答目與旦的人,都被淘汰了
    年輕就是一個揮霍青春的歲月,一切都隨心而動,因為我想,所以就要去體驗,去奮鬥。每個人都經歷過這個激情燃燒的歲月,不計後果的行動,不考慮代價的衝動,都只為自己那心靈深處的想法。小雅,一個外表靚麗,校花級的美女,在面對多姿多彩的大都市生活的誘惑下,也毫不猶豫地加入到了求職應聘的人流中。
  • 上來就是「請自我介紹」,遇到這樣的面試官我就沒什麼興趣了
    當你與面試官面對面坐下的時候,是否遇到過某些面試官上來第一句話就是「先做一個自我介紹吧」?職場新人遇到這樣的提問肯定會非常緊張,以至於不知道怎麼開始介紹自己,而對於職場老油條來說,同樣也會一時不知所措。如果我遇到提這種問題的面試官,我心裡第一印象就是對這個面試官沒什麼興趣了。
  • 面試官:對於公司裡背後搗蛋的員工,怎麼辦?小夥回復直接錄取
    而現在小K即將面試的這家公司,需要的不僅僅是員工,更的需要一個領導級的員工。當面試官對小K提出了一個問題的時候,小K也慌張了,面試官:對於公司裡背後搗蛋的員工,怎麼辦?小K一聽就是知道,這是一道完全是考驗領導者對下級管理的能力。
  • 女面試官:一加二不等於三,猜一個字?碩士生的回答,好機智
    女面試官:一加二不等於三,打一個字?碩士生的回答,好機智隨著社會競爭壓力越來越大,企業之間的競爭也越來越激烈了。7人的真實水平,女面試官設計了筆試考核環節,通過了嚴苛的篩選以後,只留下了4位實力靠前的應聘者,隨後向他們提了一個這樣的面試題目:「一加二不等於三,猜一個字?」
  • 男面試官:為什么女生喜歡養小白兔?姑娘嬌羞回應,令面試官臉紅
    每個公司的規模和文化都不同,面試官所提出的問題也不太一樣,而不少的面試官是腦洞大開,問出了一些很奇葩的問題。職場圖片/來源網絡潔潔是一位博士生,她上周跳槽進了某知名企業區域銷售主管一職時,就遇到了HR們的層層面試圍攻,經過前兩輪專業知識的面試後,僅有3人來到最後的面試官問答環節,面試官問了這樣一個考驗職場情商的題目:為什么女生喜歡養小白兔?
  • 面試官:什麼字最難寫?研究生沒答出來,大專生智答獲面試官稱讚
    研究生沒答出來,大專生智答或面試官稱讚現在的面試,和以往有了些許的區別,面試官不再是針對面試者的一個專業能力和職場經驗做了解了,而是在這兩方面之外又加上了一個綜合能力的考驗,這個綜合能力的考驗是對於面試者的一個臨場反應能力和邏輯思維能力的一個考驗,很多時候我們很是不理解,為什麼會加上這樣的考驗,面試不僅僅就是在專業和經驗上了解嗎?
  • 面試官:三個十不出頭,猜一個字?90後小夥自信應對,被錄用!
    我們在職場上,經常會去面試,因為一家公司要招人,那麼首先就是要面試,能不能進入到公司,那就要看你面試時候的表現了。特別是一些剛畢業的大學生,因為沒有職場經驗,所以在面試的時候,很容易就出錯,有些公司面試官就喜歡問一些比較難的面試題。
  • 面試官:哪一個月有28天?回答二月的,直接被淘汰!
    現在的用人單位為了能夠找到合適自己企業發展的人才,面試都是十分的嚴格,不僅會考察面試者的思維能力,學識能力,現在還增加了一些奇葩的面試題,來考驗應聘者的臨場的反應力,這些對於很多的剛畢業的大學生來說,內心都只能默默的說「我想哭卻又哭不出來」。
  • 面試官:什麼東西比烏鴉更討厭?博士生高智商回答,被錄取
    面試官:什麼東西比烏鴉更討厭?博士生高智商回答,被錄取面試,總的來說對於職場新人的確是一個不小的挑戰。這是某公司招聘高級經理現場,面試官是一位年輕漂亮的女生,無論從顏值還是氣質都不雅於電視上的明星,真讓人著迷。女面試官對在場的所以求職者做了專業性的考核後,從中篩選出3位比較優秀的求職者。隨後,女面試官又問了一個讓人摸不著頭腦的問題:「什麼東西比烏鴉更討厭?」並規定在20秒內作出回答。
  • 面試官:木字多一筆,是啥字?小夥機智作答,面試官紛紛鼓掌
    但實際上,現在的學歷早就不是面試官衡量這個人能力的唯一標準了。面試官會專門設計一些話題來考驗你的綜合素質,以及情商和思維變通能力。小王是一名剛剛畢業的大學生,小王的學歷雖然不是很高,只是一般的本科,但是腦子很機靈,是一個聰明人。在參加一家公司的面試的時候,經過幾輪的專業知識測試和面試,進入最後一關的只有4個人。
  • 面試技巧:面試自我介紹模板、範文
    我來自廣東的恩平市, 可能您沒有去過, 是一個很小的縣級市, 這幾年剛剛開發了溫泉業, 我想將來會有更多的人了解這個小城市。點評: 提到溫泉, 面試官對恩平這個陌生的地方一定會產生一點親切感。在2003年我以恩平市全市第一名的成績考上了中山大學, 學的是計算機科學專業。
  • 面試官:二三四五六七八九,猜一成語?小姑娘機智回答被當場錄用
    職場中,每個人難免會經歷面試這一個道關卡。有人戰戰兢兢,做足了準備,最後卻只能展示理想的30%,有人卻可以遊刃有餘,一路過五關斬六將,輕鬆拿到Offer。除了心理建設之外,面試時可以做到臨危不亂,隨機應變才是能決定面試成敗的關鍵!