本篇內(nèi)容主要講解“怎么用 Netty 實(shí)現(xiàn)簡(jiǎn)單的 RPC”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么用 Netty 實(shí)現(xiàn)簡(jiǎn)單的 RPC”吧!
成都創(chuàng)新互聯(lián)主營(yíng)泰山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開發(fā),泰山h5微信小程序開發(fā)搭建,泰山網(wǎng)站營(yíng)銷推廣歡迎泰山等地區(qū)企業(yè)咨詢
模仿 dubbo,消費(fèi)者和提供者約定接口和協(xié)議,消費(fèi)者遠(yuǎn)程調(diào)用提供者,提供者返回一個(gè)字符串,消費(fèi)者打印提供者返回的數(shù)據(jù)。底層網(wǎng)絡(luò)通信使用 Netty 4.1.16。
創(chuàng)建一個(gè)接口,定義抽象方法。用于消費(fèi)者和提供者之間的約定。
創(chuàng)建一個(gè)提供者,該類需要監(jiān)聽消費(fèi)者的請(qǐng)求,并按照約定返回?cái)?shù)據(jù)。
創(chuàng)建一個(gè)消費(fèi)者,該類需要透明的調(diào)用自己不存在的方法,內(nèi)部需要使用 Netty 請(qǐng)求提供者返回?cái)?shù)據(jù)。
1. 創(chuàng)建 maven 項(xiàng)目,導(dǎo)入 Netty 4.1.16。
<groupId>cn.thinkinjava</groupId><artifactId>rpc-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.16.Final</version> </dependency></dependencies>
2. 項(xiàng)目目錄結(jié)構(gòu)如下:
3. 設(shè)計(jì)接口
===============
一個(gè)簡(jiǎn)單的 hello world:
public interface HelloService { String hello(String msg);}
4. 提供者相關(guān)實(shí)現(xiàn)
==================
4.1. 首先實(shí)現(xiàn)約定接口,用于返回客戶端數(shù)據(jù):
/** * 實(shí)現(xiàn)類 */public class HelloServiceImpl implements HelloService { public String hello(String msg) { return msg != null ? msg + " -----> I am fine." : "I am fine."; }}
4.2. 實(shí)現(xiàn) Netty 服務(wù)端和自定義 handler
啟動(dòng) Netty Server 代碼:
private static void startServer0(String hostName, int port) { try { ServerBootstrap bootstrap = new ServerBootstrap(); NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); bootstrap.group(eventLoopGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast(new StringDecoder()); p.addLast(new StringEncoder()); p.addLast(new HelloServerHandler()); } }); bootstrap.bind(hostName, port).sync(); } catch (InterruptedException e) { e.printStackTrace(); } }
上面的代碼中添加了 String類型的編解碼 handler,添加了一個(gè)自定義 handler。
自定義 handler 邏輯如下:
/*** 用于處理請(qǐng)求數(shù)據(jù)*/public class HelloServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { // 如何符合約定,則調(diào)用本地方法,返回?cái)?shù)據(jù) if (msg.toString().startsWith(ClientBootstrap.providerName)) { String result = new HelloServiceImpl() .hello(msg.toString().substring(msg.toString().lastIndexOf("#") + 1)); ctx.writeAndFlush(result); } }}
這里顯示判斷了是否符合約定(并沒有使用復(fù)雜的協(xié)議,只是一個(gè)字符串判斷),然后創(chuàng)建一個(gè)具體實(shí)現(xiàn)類,并調(diào)用方法寫回客戶端。為什么Netty這么火?為什么?
還需要一個(gè)啟動(dòng)類:
public class ServerBootstrap { public static void main(String[] args) { NettyServer.startServer("localhost", 8088); }}
好,關(guān)于提供者的代碼就寫完了,主要就是創(chuàng)建一個(gè) netty 服務(wù)端,實(shí)現(xiàn)一個(gè)自定義的 handler,自定義 handler 判斷是否符合之間的約定(算是協(xié)議吧),如果符合,就創(chuàng)建一個(gè)接口的實(shí)現(xiàn)類,并調(diào)用他的方法返回字符串。
5. 消費(fèi)者相關(guān)實(shí)現(xiàn)
消費(fèi)者有一個(gè)需要注意的地方,就是調(diào)用需要透明,也就是說(shuō),框架使用者不用關(guān)心底層的網(wǎng)絡(luò)實(shí)現(xiàn)。這里我們可以使用 JDK 的動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)這個(gè)目的。
思路:客戶端調(diào)用代理方法,返回一個(gè)實(shí)現(xiàn)了 HelloService 接口的代理對(duì)象,調(diào)用代理對(duì)象的方法,返回結(jié)果。
我們需要在代理中做手腳,當(dāng)調(diào)用代理方法的時(shí)候,我們需要初始化 Netty 客戶端,還需要向服務(wù)端請(qǐng)求數(shù)據(jù),并返回?cái)?shù)據(jù)。
5.1. 首先創(chuàng)建代理相關(guān)的類
public class RpcConsumer { private static ExecutorService executor = Executors .newFixedThreadPool(Runtime.getRuntime().availableProcessors()); private static HelloClientHandler client; /** * 創(chuàng)建一個(gè)代理對(duì)象 */ public .........
到此,相信大家對(duì)“怎么用 Netty 實(shí)現(xiàn)簡(jiǎn)單的 RPC”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章標(biāo)題:怎么用Netty實(shí)現(xiàn)簡(jiǎn)單的RPC
標(biāo)題來(lái)源:http://chinadenli.net/article20/gidgjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)、云服務(wù)器、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)