欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么用Netty實(shí)現(xiàn)簡(jiǎn)單的RPC

本篇內(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è)咨詢

1、需求

模仿 dubbo,消費(fèi)者和提供者約定接口和協(xié)議,消費(fèi)者遠(yuǎn)程調(diào)用提供者,提供者返回一個(gè)字符串,消費(fèi)者打印提供者返回的數(shù)據(jù)。底層網(wǎng)絡(luò)通信使用 Netty 4.1.16。

2、設(shè)計(jì)

  1. 創(chuàng)建一個(gè)接口,定義抽象方法。用于消費(fèi)者和提供者之間的約定。

  2. 創(chuàng)建一個(gè)提供者,該類需要監(jiān)聽消費(fèi)者的請(qǐng)求,并按照約定返回?cái)?shù)據(jù)。

  3. 創(chuàng)建一個(gè)消費(fèi)者,該類需要透明的調(diào)用自己不存在的方法,內(nèi)部需要使用 Netty 請(qǐng)求提供者返回?cái)?shù)據(jù)。

3、 實(shí)現(xiàn)

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)如下:

怎么用 Netty 實(shí)現(xiàn)簡(jiǎn)單的 RPC

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)

成都seo排名網(wǎng)站優(yōu)化