手写rpc和redis

这篇具有很好参考价值的文章主要介绍了手写rpc和redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

rpc框架搭建
consumer 消费者应用
provider 提供的服务
Provider-common 公共类模块
rpc 架构
service-Registration 服务发现
nacos nacos配置中心
load-balancing 负载均衡
redis-trench 手写redis实现和链接

package com.trench.protocol;

import com.trench.enumUtil.RedisRepEnum;
import redis.clients.jedis.util.SafeEncoder;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Protocol {

    public static final  String DOLLAR="$";

    public static final String STAR="*";

    public static final String BLANK="\r\n";

    public static void  sendCommand(OutputStream outputStream, RedisRepEnum redisRepEnum,byte [] ... args){
        StringBuffer str=new StringBuffer();
        str.append(STAR).append(args.length-1).append(BLANK);
        str.append(DOLLAR).append(redisRepEnum.name().length()).append(BLANK);
        str.append(redisRepEnum).append(BLANK);

        Arrays.stream(args).forEach(arg->{
            str.append(DOLLAR).append(arg.length).append(BLANK);
            str.append(new String(arg)).append(BLANK);
        });
        try {
            outputStream.write(str.toString().getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static final byte[] toByteArray(long value) {
        return SafeEncoder.encode(String.valueOf(value));
    }
}

package com.trench.api;

import com.trench.connection.Connetion;
import com.trench.enumUtil.RedisRepEnum;
import com.trench.protocol.Protocol;
import com.trench.util.SerializeUtils;
import redis.clients.jedis.BuilderFactory;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Set;

public class Client {
    Connetion connetion;

    public Client(String host,Integer port){
        connetion=new Connetion(port,host);
    }

    public void set(final  String key, final String values){
        connetion.sendCommand( RedisRepEnum.SET,key.getBytes(StandardCharsets.UTF_8), SerializeUtils.serialize(values));
    }

    public Object get(final String key){
        connetion.sendCommand(RedisRepEnum.GET,key.getBytes(StandardCharsets.UTF_8));
        return connetion.getData();
    }

    public void  delete(final String key){
        connetion.sendCommand(RedisRepEnum.GETDEL,key.getBytes(StandardCharsets.UTF_8));
    }
    //封装redis的过期时间
    public void expire(String key, long seconds){
        connetion.sendCommand(RedisRepEnum.EXISTS, key.getBytes(StandardCharsets.UTF_8), Protocol.toByteArray(seconds));
    }
    //是否存在key
    public boolean exists(final String key) {
        connetion.sendCommand(RedisRepEnum.EXISTS, key.getBytes(StandardCharsets.UTF_8));
        return (Long)connetion.getData()==1L;
    }

    //查找key中set包含
    public Set<String> keys(final String key){
        connetion.sendCommand(RedisRepEnum.KEYS,key.getBytes(StandardCharsets.UTF_8));
        return (Set) BuilderFactory.STRING_SET.build((List)connetion.getData());
    }
}

rpc框架核心代码

package com.trench.protocol;

import com.trench.SerializeUtils;
import com.trench.frawork.Invocation;
import com.trench.nacos.dome.NacosHttp;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpClient {
    public String send(String hostName, Integer port, Invocation invocation) throws IOException {
        //读取nacos中的配置用户的请求方式。如http   POST get等
        NacosHttp nacosHttp=new NacosHttp();
        try {
            URL url=new URL(nacosHttp.getHttp(),hostName,port,nacosHttp.getFile());
            HttpURLConnection httpURLConnection=  (HttpURLConnection)url.openConnection();

            httpURLConnection.setRequestMethod(nacosHttp.getRequestMethod());
            httpURLConnection.setDoOutput(true);

            //配置
            OutputStream outputStream=httpURLConnection.getOutputStream();
            ObjectOutputStream oss = new ObjectOutputStream(outputStream);

            oss.writeObject(SerializeUtils.serialize(invocation));
            oss.flush();
            oss.close();

            InputStream inputStream = httpURLConnection.getInputStream();
           return (String) SerializeUtils.deSerialize(IOUtils.toString(inputStream).getBytes(StandardCharsets.UTF_8));
        } catch (MalformedURLException e) {
           throw e;
        } catch (IOException e) {
           throw e;
        }
    }
}

启动tomcat
package com.trench.protocol;

import org.apache.catalina.*;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.startup.Tomcat;

public class HttpServer {

    public void start(String hostname,Integer port){
        //读取用户配置
        Tomcat tomcat=new Tomcat();
        Server server = tomcat.getServer();
        Service service = server.findService("Tomcat");

        Connector connector=new Connector();
        connector.setPort(port);

        Engine engine=new StandardEngine();
        engine.setDefaultHost(hostname);

        Host host=new StandardHost();
        host.setName(hostname);

        String contextPash="";
        Context context=new StandardContext();
        context.setPath(contextPash);
        context.addLifecycleListener(new Tomcat.FixContextListener());

        host.addChild(context);
        engine.addChild(host);

        service.setContainer(engine);
        service.addConnector(connector);

        tomcat.addServlet(contextPash,"dispatcher",new DispatcherServlet());

        context.addServletMappingDecoded("/*","dispatcher");

        try {
            tomcat.start();
            tomcat.getServer().await();
        }catch (LifecycleException e){
            e.printStackTrace();
        }
    }
}

package com.trench.protocol;

import com.trench.frawork.Invocation;
import com.trench.register.LocalRegister;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;

public class HttpServerHandler extends HttpServer {
    public void handler(HttpServletRequest request, HttpServletResponse response){
        //可自行添加为心跳监听等操作
        //处理请求
        try {
            Invocation invocation = (Invocation)new ObjectInputStream(request.getInputStream()).readObject();
            String interfaceName =invocation.getInterfaceName();//接口名称
            Class aClass = LocalRegister.get(interfaceName,invocation.getVersion());

            Method method = aClass.getMethod(invocation.getMethodName(), invocation.getParameterTypes());
            String invoke = (String) method.invoke(aClass.newInstance(), invocation.getParameter());

            IOUtils.write(invoke.getBytes(StandardCharsets.UTF_8),response.getOutputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

相关的gitub仓库地址:(https://github.com/zhaoyiwen-wuxian/RpcTrench.git) master分支,进行切换分支到master文章来源地址https://www.toymoban.com/news/detail-821361.html

到了这里,关于手写rpc和redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手写简单的RPC

    RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布

    2024年04月22日
    浏览(45)
  • 手写RPC框架--2.介绍Zookeeper

    RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 该项目的RPC通信将采用Netty+Zookeeper,所以会在前两章介绍使用方法 概念:ZooKeeper是一个开源的 分布式协调服务组件 ,用于构建可靠的分布式系统。它提供了一个高性能的、有序的、可

    2024年02月09日
    浏览(37)
  • 手写RPC框架--5.Netty业务逻辑

    RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 1.在 DcyRpcBootstrap 类的 start() 方法中加入netty代码 (待完善) 2.在 ReferenceConfig 类的 get() 方法中加入netty代码 (待完善) 每次启动程序都会建立一个新的Netty连接,显示是对不合适的 解决方案

    2024年02月09日
    浏览(45)
  • java 从零开始手写 RPC (00) 概览 overview

    rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo。 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理。 基于 netty4 的客户端调用服务端 p2p 调用 serial 序列化支持 timeout 超时处理 register center 注册中心 load balance 负载均衡 callType 支持 oneway sync 等调用方式 fail 支持 failOve

    2024年03月08日
    浏览(55)
  • 从无到有手写一个基于Netty+Kyro+Zookeeper的RPC框架,javaweb面试题目整理

    通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。 你甚至可以把这个当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。 介绍 这是一款基于 Netty+Kyro+Zookee

    2024年04月15日
    浏览(48)
  • RPC和HTTP协议

            RPC 全称(Remote Procedure Call),它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。         它的核心目标是,让开发人员在进行远程方法调用的时候,就像调用本地方法一样,不需要额外为了完成这个交互做过的编码。         为了达到

    2024年02月11日
    浏览(38)
  • 自定义Dubbo RPC通信协议

    Dubbo 协议层的核心SPI接口是 org.apache.dubbo.rpc.Protocol ,通过扩展该接口和围绕的相关接口,就可以让 Dubbo 使用我们自定义的协议来通信。默认的协议是 dubbo,本文提供一个 Grpc 协议的实现。 Google 提供了 Java 的 Grpc 实现,所以我们站在巨人的肩膀上即可,就不用重复造轮子了。

    2024年01月19日
    浏览(52)
  • 安卓协议逆向 咸鱼 frida rpc 调用方案

    通过frida rpc调用真机获取指定的搜索结果数据。 本文仅供大家学习及研究使用、切勿用于各种非法用途。 frida 提供了一种跨平台的 rpc (远程过程调用)机制,通过 frida rpc 可以在主机和目标设备之间进行通信,并在目标设备上执行代码,可实现功能如下: 1、动态地

    2024年02月07日
    浏览(38)
  • 手写 2PC 协议

    目录 1. 2PC 介绍 2. 2PC 协议流程 阶段一 PREPARE 阶段二 COMMIT / ROLLBACK  3. 2PC 手写 模块说明 源码介绍 2PC 模块  transaction-manager  resource-manager 模块 2PC 协议(Two Phase Commit)是一个分布式事务协议。 2PC 为两阶段提交,分为两个阶段。两个角色。         1. PREPARE         

    2023年04月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包