myRpc

这篇博客介绍了一个基于Netty实现的简单RPC框架。作者通过Java动态代理、序列化和协议封装来构建RPC,并涉及到连接池的概念。在讲解过程中,通过模拟消费者端和服务器端的交互,展示了如何发送和接收消息。文中还提到了在并发场景下服务端解析ByteBuf时可能出现的问题。
摘要由CSDN通过智能技术生成

package com.bjmashibing.system.io.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.junit.Test;

import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

/**

  • @author: 马士兵教育
  • @create: 2020-07-12 20:08
  • 12号的课开始手写RPC ,把前边的IO的课程都看看
  • http://mashibing.com/vip.html#%E5%91%A8%E8%80%81%E5%B8%88%E5%86%85%E5%AD%98%E4%B8%8Eio%E7%A3%81%E7%9B%98io%E7%BD%91%E7%BB%9Cio
    */

/*
1,先假设一个需求,写一个RPC
2,来回通信,连接数量,拆包?
3,动态代理呀,序列化,协议封装
4,连接池
5,就像调用本地方法一样去调用远程的方法,面向java中就是所谓的 面向interface开发
*/

/**

  • 上节课,基本写了一个能发送

  • 小问题,当并发通过一个连接发送后,服务端解析bytebuf 转 对象的过程出错
    */
    public class MyRPCTest {

    //多多包涵,如果一会翻车,请不要打脸。。。。。

    @Test
    public void startServer() {

     NioEventLoopGroup boss = new NioEventLoopGroup(20);
     NioEventLoopGroup worker = boss;
    
     ServerBootstrap sbs = new ServerBootstrap();
     ChannelFuture bind = sbs.group(boss, worker)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<NioSocketChannel>() {
                 @Override
                 protected void initChannel(NioSocketChannel ch) throws Exception {
                     System.out.println("server accept cliet port: " + ch.remoteAddress().getPort());
                     ChannelPipeline p = ch.pipeline();
                     p.addLast(new ServerDecode());
                     p.addLast(new ServerRequestHandler());
                 }
             }).bind(new InetSocketAddress("localhost", 9090));
     try {
         bind.sync().channel().closeFuture().sync();
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
    

    }

    //模拟comsumer端
    @Test
    public void get() {

     new Thread(() -> {
         startServer();
     }).start();
    
     System.out.println("server started......");
    
    
     AtomicInteger num = new AtomicInteger(0);
     int size = 50;
     Thread[] threads = new Thread[size];
     for (int i = 0; i < size; i++) {
         thre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值