国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC

這篇具有很好參考價(jià)值的文章主要介紹了Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. RPC基本介紹

  1. RPC(Remote Procedure Call):遠(yuǎn)程 過程調(diào)用,是一個計(jì)算機(jī) 通信協(xié)議。該協(xié)議允許運(yùn) 行于一臺計(jì)算機(jī)的程序調(diào) 用另一臺計(jì)算機(jī)的子程序, 而程序員無需額外地為這 個交互作用編程

  2. 兩個或多個應(yīng)用程序都分 布在不同的服務(wù)器上,它 們之間的調(diào)用都像是本地 方法調(diào)用一樣(如圖)

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

  3. 常見的 RPC 框架有: 比較知名的如阿里的Dubbo、google的gRPC、Go語言的rpcx、Apache的thrift, Spring 旗下的 Spring Cloud。

2. RPC調(diào)用流程圖

術(shù)語說明:在RPC中,

  • Client叫服務(wù)消費(fèi)者
  • Server叫服務(wù)提供者

Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

3. PRC調(diào)用流程說明

  1. **服務(wù)消費(fèi)方(client)**以本地調(diào)用方式調(diào)用服務(wù)
  2. client stub 接收到調(diào)用后負(fù)責(zé)將方法、參數(shù)等封裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw
  3. client stub 將消息進(jìn)行編碼并發(fā)送到服務(wù)端
  4. server stub 收到消息后進(jìn)行解碼
  5. server stub 根據(jù)解碼結(jié)果調(diào)用本地的服務(wù)
  6. 地服務(wù)執(zhí)行并將結(jié)果返回給 server stub
  7. server stub 將返回導(dǎo)入結(jié)果進(jìn)行編碼并發(fā)送至消費(fèi)方
  8. client stub 接收到消息并進(jìn)行解碼
  9. 服務(wù)消費(fèi)方(client)得到結(jié)果

小結(jié):RPC 的目標(biāo)就是將 2-8 這些步驟都封裝起來,用戶無需關(guān)心這些細(xì)節(jié),可以像調(diào)用本地方法一樣即可完成遠(yuǎn)程服務(wù)調(diào)用。

4. 自己實(shí)現(xiàn) dubbo RPC(基于Netty)

  • 需求說明

    1. dubbo 底層使用了 Netty 作為網(wǎng)絡(luò)通訊框架,要求用Netty 實(shí)現(xiàn)一個簡單的RPC框架
    2. 模仿 dubbo,消費(fèi)者和提供者約定接口和協(xié)議,消費(fèi)者遠(yuǎn)程調(diào)用提供者的服務(wù),提供者返回一個字符串,消費(fèi)者打印提供者返回的數(shù)據(jù)。底層網(wǎng)絡(luò)通信使用Netty4.1.20
  • 設(shè)計(jì)說明

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    1. 創(chuàng)建一個接口,定義抽象方法。用于消費(fèi)者和提供者之間的約定。
    2. 創(chuàng)建一個提供者,該類需要監(jiān)聽消費(fèi)者的請求,并按照約定返回?cái)?shù)據(jù)。
    3. 創(chuàng)建一個消費(fèi)者,該類需要透明的調(diào)用自己不存在的方法,內(nèi)部需要使用Netty請求提供者返回?cái)?shù)據(jù)

4.1 公共接口 publicinterface包

4.1.1 HelloService

package site.zhourui.nioAndNetty.netty.dubborpc.publicinterface;

//這個是接口,是服務(wù)提供方和 服務(wù)消費(fèi)方都需要
public interface HelloService {
    String hello(String msg);
}

4.2 遠(yuǎn)程調(diào)用netty包

本質(zhì)上就是客戶端訪問服務(wù)端

4.2.1 NettyClientHandler

  1. 我們實(shí)現(xiàn)了Callable方法
  2. setPara(String para)方法: 設(shè)置要發(fā)給服務(wù)器端的信息
  3. 我們將ctx在channelActive時抽取為全局對象context,方便我們在其他方法也能使用(這里就是call方法)
  4. call方法:
    • 開啟子線程向服務(wù)端發(fā)送消息
    • 發(fā)送完成后該子線程進(jìn)行wait,等待服務(wù)提供方處理并返回?cái)?shù)據(jù)(被喚醒)
    • 喚醒后打印服務(wù)端返回?cái)?shù)據(jù)全局變量result中的數(shù)據(jù)
  5. channelRead方法:
    • 收到服務(wù)器的返回?cái)?shù)據(jù)后,將返回?cái)?shù)據(jù)放在全局變量result中
    • 喚醒等待的線程
    • 因?yàn)閏hannelRead和call方法是有同步關(guān)系的所有要加上synchronized加鎖
  6. 小結(jié): 代碼執(zhí)行流程
    1. channelActive()
    2. setPara()設(shè)置需要發(fā)送的數(shù)據(jù)
    3. call(wait之前代碼)被代理對象調(diào)用, 發(fā)送數(shù)據(jù)給服務(wù)器-> wait
    4. 等待被喚醒(channelRead)->notify
    5. call(wait之后代碼)
package site.zhourui.nioAndNetty.netty.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {

    private ChannelHandlerContext context;//上下文
    private String result; //返回的結(jié)果
    private String para; //客戶端調(diào)用方法時,傳入的參數(shù)

    //與服務(wù)器的連接創(chuàng)建后,就會被調(diào)用, 這個方法是第一個被調(diào)用(1)
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(" channelActive 被調(diào)用  ");
        context = ctx; //因?yàn)槲覀冊谄渌椒〞褂玫?ctx
    }

    //收到服務(wù)器的數(shù)據(jù)后,調(diào)用方法 (4)
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(" channelRead 被調(diào)用  ");
        result = msg.toString();
        notify(); //喚醒等待的線程
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

    //被代理對象調(diào)用, 發(fā)送數(shù)據(jù)給服務(wù)器,-> wait -> 等待被喚醒(channelRead) -> 返回結(jié)果 (3)-》5
    @Override
    public synchronized Object call() throws Exception {
        System.out.println(" call1 被調(diào)用  ");
        context.writeAndFlush(para);
        //進(jìn)行wait
        wait(); //等待channelRead 方法獲取到服務(wù)器的結(jié)果后,喚醒
        System.out.println(" call2 被調(diào)用  ");
        return  result; //服務(wù)方返回的結(jié)果
    }

    void setPara(String para) {
        System.out.println(" setPara  ");
        this.para = para;
    }
}

4.2.2 NettyClient

說明:

  1. 創(chuàng)建線程池executor

  2. initClient():

    • 初始化NettyClientHandler 設(shè)為全局對象client
    • 創(chuàng)建客戶端并連接客戶端
      • StringDecoder():字符串編碼器
      • StringEncoder():字符串解碼器
      • pipeline.addLast(client):將加入自定義handler-client
  3. 編寫方法getBean使用代理模式,獲取一個代理對象

    public Object getBean(final Class<?> serivceClass, final String providerName) 
    
    • serivceClass: 需要代理的Class對象
    • providerName: 協(xié)議以及需要發(fā)送的數(shù)據(jù)
    • 如果client為空就初始化initClient
    • client.setPara():使用自定義handler的全局對象client設(shè)置需要發(fā)送的數(shù)據(jù)
    • executor.submit(client): 將我們的自定義handler提交給異步線程池,因?yàn)镹ettyClientHandler 實(shí)現(xiàn)了Callable方法,會自動調(diào)用call方法
      • .get():異步任務(wù)執(zhí)行完成后獲取返回結(jié)果
    • 將返回結(jié)果return
package site.zhourui.nioAndNetty.netty.dubborpc.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

import java.lang.reflect.Proxy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NettyClient {
    //創(chuàng)建線程池
    private static ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    private static NettyClientHandler client;
    private int count = 0;

    //編寫方法使用代理模式,獲取一個代理對象

    public Object getBean(final Class<?> serivceClass, final String providerName) {

        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                new Class<?>[]{serivceClass}, (proxy, method, args) -> {

                    System.out.println("(proxy, method, args) 進(jìn)入...." + (++count) + " 次");
                    //{}  部分的代碼,客戶端每調(diào)用一次 hello, 就會進(jìn)入到該代碼
                    if (client == null) {
                        initClient();
                    }

                    //設(shè)置要發(fā)給服務(wù)器端的信息
                    //providerName 協(xié)議頭 args[0] 就是客戶端調(diào)用api hello(???), 參數(shù)
                    client.setPara(providerName + args[0]);

                    //
                    return executor.submit(client).get();

                });
    }

    //初始化客戶端
    private static void initClient() {
        client = new NettyClientHandler();
        //創(chuàng)建EventLoopGroup
        NioEventLoopGroup group = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(group)
                .channel(NioSocketChannel.class)
                .option(ChannelOption.TCP_NODELAY, true)
                .handler(
                        new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel ch) throws Exception {
                                ChannelPipeline pipeline = ch.pipeline();
                                pipeline.addLast(new StringDecoder());
                                pipeline.addLast(new StringEncoder());
                                pipeline.addLast(client);
                            }
                        }
                );

        try {
            bootstrap.connect("127.0.0.1", 7000).sync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.2.3 NettyServerHandler

  • 當(dāng)通道發(fā)生讀事件時
    • 獲取客戶端發(fā)送的消息,并調(diào)用服務(wù)
    • 按照協(xié)議規(guī)則取出數(shù)據(jù)(HelloService#hello#)
      • HelloService# 為協(xié)議頭
      • hello為數(shù)據(jù)
    • 回復(fù)客戶端調(diào)用結(jié)果
package site.zhourui.nioAndNetty.netty.dubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import site.zhourui.nioAndNetty.netty.dubborpc.customer.ClientBootstrap;
import site.zhourui.nioAndNetty.netty.dubborpc.provider.HelloServiceImpl;

public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //獲取客戶端發(fā)送的消息,并調(diào)用服務(wù)
        System.out.println("msg=" + msg);
        //客戶端在調(diào)用服務(wù)器的api 時,我們需要定義一個協(xié)議
        //比如我們要求 每次發(fā)消息是都必須以某個字符串開頭 "HelloService#hello#你好"
        if(msg.toString().startsWith(ClientBootstrap.providerName)) {

            String result = new HelloServiceImpl().hello(msg.toString().substring(msg.toString().lastIndexOf("#") + 1));
            ctx.writeAndFlush(result);
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}

4.2.4 NettyServer

  • 啟動客戶端
    • StringDecoder
    • StringEncoder
    • NettyServerHandler
package site.zhourui.nioAndNetty.netty.dubborpc.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

public class NettyServer {
    public static void startServer(String hostName, int port) {
        startServer0(hostName,port);
    }

    //編寫一個方法,完成對NettyServer的初始化和啟動

    private static void startServer0(String hostname, int port) {

        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {

            ServerBootstrap serverBootstrap = new ServerBootstrap();

            serverBootstrap.group(bossGroup,workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                                      @Override
                                      protected void initChannel(SocketChannel ch) throws Exception {
                                          ChannelPipeline pipeline = ch.pipeline();
                                          pipeline.addLast(new StringDecoder());
                                          pipeline.addLast(new StringEncoder());
                                          pipeline.addLast(new NettyServerHandler()); //業(yè)務(wù)處理器

                                      }
                                  }

                    );

            ChannelFuture channelFuture = serverBootstrap.bind(hostname, port).sync();
            System.out.println("服務(wù)提供方開始提供服務(wù)~~");
            channelFuture.channel().closeFuture().sync();

        }catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }
}

4.3 customer 包

4.3.1 ClientBootstrap

  • 設(shè)置providerName:我們發(fā)送的數(shù)據(jù)(協(xié)議+數(shù)據(jù))
  • 創(chuàng)建一個消費(fèi)者
  • 創(chuàng)建代理對象
  • 通過代理對象調(diào)用服務(wù)提供者的方法(服務(wù))
package site.zhourui.nioAndNetty.netty.dubborpc.customer;

import site.zhourui.nioAndNetty.netty.dubborpc.netty.NettyClient;
import site.zhourui.nioAndNetty.netty.dubborpc.publicinterface.HelloService;

public class ClientBootstrap {
    //這里定義協(xié)議頭
    public static final String providerName = "HelloService#hello#";

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

        //創(chuàng)建一個消費(fèi)者
        NettyClient customer = new NettyClient();

        //創(chuàng)建代理對象
        HelloService service = (HelloService) customer.getBean(HelloService.class, providerName);

        for (;; ) {
            Thread.sleep(2 * 1000);
            //通過代理對象調(diào)用服務(wù)提供者的方法(服務(wù))
            String res = service.hello("你好 dubbo~");
            System.out.println("調(diào)用的結(jié)果 res= " + res);
        }
    }
}

4.4 provider 包

4.4.1 HelloServiceImpl

服務(wù)端提供方的實(shí)現(xiàn),遠(yuǎn)程真正被調(diào)用的方法

package site.zhourui.nioAndNetty.netty.dubborpc.provider;

import site.zhourui.nioAndNetty.netty.dubborpc.publicinterface.HelloService;

public class HelloServiceImpl implements HelloService {
    private static int count = 0;
    //當(dāng)有消費(fèi)方調(diào)用該方法時, 就返回一個結(jié)果
    @Override
    public String hello(String msg) {
        System.out.println("收到客戶端消息=" + msg);
        //根據(jù)mes 返回不同的結(jié)果
        if(msg != null) {
            return "你好客戶端, 我已經(jīng)收到你的消息 [" + msg + "] 第" + (++count) + " 次";
        } else {
            return "你好客戶端, 我已經(jīng)收到你的消息 ";
        }
    }
}

4.4.1 ServerBootstrap

ServerBootstrap 會啟動一個服務(wù)提供者,就是 NettyServer

package site.zhourui.nioAndNetty.netty.dubborpc.provider;

import site.zhourui.nioAndNetty.netty.dubborpc.netty.NettyServer;

//ServerBootstrap 會啟動一個服務(wù)提供者,就是 NettyServer
public class ServerBootstrap {
    public static void main(String[] args) {

        //代碼代填..
        NettyServer.startServer("127.0.0.1", 7000);
    }
}

4.5 測試

  1. 啟動ServerBootstrap

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

  2. 啟動ClientBootstrap

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

4.5.1 debug看一下ClientBootstrap啟動

首先還是先啟動服務(wù)端ServerBootstrap

  1. debug啟動ClientBootstrap

    Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

  2. NettyClient(),此時只是初始化了全局屬性

  3. getBean:創(chuàng)建代理對象

    • 先看看入?yún)⑹鞘裁磾?shù)據(jù)

      Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    • 如果client沒有被初始化就初始化

      Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    • 設(shè)置要發(fā)給服務(wù)器端的信息

      Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    • executor.submit:提交異步任務(wù)就會來到NettyClientHandler的call方法

      Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議

    • call方法執(zhí)行到wait()方法后,channelRead不久后就會收到服務(wù)端的調(diào)用結(jié)果然后喚醒call方法的子線程繼續(xù)執(zhí)行

      Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC,NIO&amp;Netty,dubbo,rpc,網(wǎng)絡(luò)協(xié)議文章來源地址http://www.zghlxwxcb.cn/news/detail-568677.html

到了這里,關(guān)于Netty核心技術(shù)十一--用Netty 自己 實(shí)現(xiàn) dubbo RPC的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微服務(wù)學(xué)習(xí) | Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用

    微服務(wù)學(xué)習(xí) | Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用

    ??? 個人主頁 :鼠鼠我捏,要死了捏的主頁? ??? 系列專欄 :Golang全棧-專欄 ??? 個人學(xué)習(xí)筆記,若有缺誤,歡迎評論區(qū)指正 ? 前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站AI學(xué)習(xí)網(wǎng)站。 目錄 前言 快速上手

    2024年02月19日
    瀏覽(22)
  • 【Dubbo3云原生微服務(wù)開發(fā)實(shí)戰(zhàn)】「Dubbo前奏導(dǎo)學(xué)」 RPC服務(wù)的底層原理和實(shí)現(xiàn)

    【Dubbo3云原生微服務(wù)開發(fā)實(shí)戰(zhàn)】「Dubbo前奏導(dǎo)學(xué)」 RPC服務(wù)的底層原理和實(shí)現(xiàn)

    Dubbo是一款高效而強(qiáng)大的RPC服務(wù)框架,它旨在解決微服務(wù)架構(gòu)下的服務(wù)監(jiān)控和通信問題。該框架提供了Java、Golang等多語言的SDK,使得使用者可以輕松構(gòu)建和開發(fā)微服務(wù)。Dubbo具備遠(yuǎn)程地址發(fā)現(xiàn)和通信能力,可通過Dubbo獨(dú)有的身臨其境的服務(wù)治理特驗(yàn)為主導(dǎo),以提高開發(fā)人員的功

    2024年02月05日
    瀏覽(21)
  • 【SpringBoot集成Nacos+Dubbo】企業(yè)級項(xiàng)目集成微服務(wù)組件,實(shí)現(xiàn)RPC遠(yuǎn)程調(diào)用

    【SpringBoot集成Nacos+Dubbo】企業(yè)級項(xiàng)目集成微服務(wù)組件,實(shí)現(xiàn)RPC遠(yuǎn)程調(diào)用

    在日益增長的業(yè)務(wù)需求中,一開始使用的是每個項(xiàng)目獨(dú)立開發(fā),雖然都是前后端分離的項(xiàng)目,但是每一個項(xiàng)目之間互不干擾。后來,因?yàn)槟撤N需求,需要幾個項(xiàng)目的數(shù)據(jù)相互交錯獲取。 最開始的想法就是集成多個數(shù)據(jù)源。 舉例 有A、B、C三個項(xiàng)目,對應(yīng)著數(shù)據(jù)庫DBa、DBb、DBc、

    2024年02月04日
    瀏覽(26)
  • Springboot3.X整合Dubbo3.XSpringCloudAlibaba微服務(wù) 2022.0 + Springboot3.X 集成 Dubbo實(shí)現(xiàn)對外調(diào)用http內(nèi)部調(diào)用RPC

    近期自己新開了一套SpringCloud Alibaba微服務(wù)項(xiàng)目,接口使用了對外HTTP,內(nèi)部RPC的設(shè)計(jì),具體點(diǎn)說就是外部用戶或客戶端通過Nginx訪問到Gateway網(wǎng)關(guān)再分發(fā)到各個服務(wù),內(nèi)部各個服務(wù)之間統(tǒng)一使用Dubbo RPC進(jìn)行通信。下面是Springboot3.x集成Dubbo的分享: 1. 需要的關(guān)鍵依賴 2. 啟動程序入

    2024年02月15日
    瀏覽(25)
  • 17游刃有余:動手實(shí)現(xiàn)自己的RPC框架(三)

    這篇文章我們來實(shí)現(xiàn)跨語言的網(wǎng)絡(luò)通信。 跨語言RPC框架的必要性主要體現(xiàn)在以下幾個方面: 解決不同語言之間的互操作性。不同語言使用的數(shù)據(jù)類型和序列化方式可能不同,跨語言 RPC 框架可以提供通用的編解碼庫和語言適配器,以便將不同語言的數(shù)據(jù)轉(zhuǎn)換為通用的格式進(jìn)行

    2024年02月14日
    瀏覽(30)
  • Dubbo源碼淺析(一)—RPC框架與Dubbo

    RPC,Remote Procedure Call 即遠(yuǎn)程過程調(diào)用,與之相對的是本地服務(wù)調(diào)用,即LPC(Local Procedure Call)。本地服務(wù)調(diào)用比較常用,像我們應(yīng)用內(nèi)部程序 (注意此處是程序而不是方法,程序包含方法) 互相調(diào)用即為本地過程調(diào)用,而遠(yuǎn)程過程調(diào)用是指在本地調(diào)取遠(yuǎn)程過程進(jìn)行使用。 而 RPC框

    2024年02月08日
    瀏覽(24)
  • Netty優(yōu)化-rpc

    1.3 RPC 框架 1)準(zhǔn)備工作 這些代碼可以認(rèn)為是現(xiàn)成的,無需從頭編寫練習(xí) 為了簡化起見,在原來聊天項(xiàng)目的基礎(chǔ)上新增 Rpc 請求和響應(yīng)消息 請求消息 響應(yīng)消息 服務(wù)器架子 服務(wù)器 handler 客戶端架子 客戶端handler 服務(wù)器端的 service 獲取 相關(guān)配置 application.properties 業(yè)務(wù)類 計(jì)數(shù)器

    2024年02月08日
    瀏覽(17)
  • 自定義Dubbo RPC通信協(xié)議

    Dubbo 協(xié)議層的核心SPI接口是 org.apache.dubbo.rpc.Protocol ,通過擴(kuò)展該接口和圍繞的相關(guān)接口,就可以讓 Dubbo 使用我們自定義的協(xié)議來通信。默認(rèn)的協(xié)議是 dubbo,本文提供一個 Grpc 協(xié)議的實(shí)現(xiàn)。 Google 提供了 Java 的 Grpc 實(shí)現(xiàn),所以我們站在巨人的肩膀上即可,就不用重復(fù)造輪子了。

    2024年01月19日
    瀏覽(27)
  • 基于netty的rpc遠(yuǎn)程調(diào)用

    ??????這是一個手寫RPC項(xiàng)目,用于實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用(RPC)通信?????? 歡迎star串門 : https://github.com/red-velet/ ??Q-PRC 簡單的RPC框架的實(shí)現(xiàn) :該RPC框架實(shí)現(xiàn)了基本的遠(yuǎn)程過程調(diào)用功能,允許客戶端通過網(wǎng)絡(luò)調(diào)用遠(yuǎn)程服務(wù)的方法,實(shí)現(xiàn)分布式系統(tǒng)之間的通信和協(xié)作。 基于

    2024年02月14日
    瀏覽(19)
  • Dubbo之消費(fèi)端服務(wù)RPC調(diào)用

    Dubbo之消費(fèi)端服務(wù)RPC調(diào)用

    在消費(fèi)端服務(wù)是基于接口調(diào)用Provider端提供的服務(wù),所以在消費(fèi)端并沒有服務(wù)公共接口的實(shí)現(xiàn)類。 利用注解@DubboReference將目標(biāo)接口CountryService作為CountryController類的字段屬性,在解析類CountryController時獲取全部字段屬性并單獨(dú)關(guān)注解析存在注解@DubboReference的字段屬性。 通過步驟

    2024年03月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包