首页 > 其他分享 >RPC概念学习笔记

RPC概念学习笔记

时间:2023-06-17 18:02:02浏览次数:52  
标签:HTTP socket 笔记 RPC new close 概念学习 out

  • RPC是是什么

  • Remote procedure call -远程过程调用 对应与本地过程调用也就是本地方法调用
  • 它本身并不是一个具体的协议,而是一种调用方式
  • TCP 粘包

  • 什么是粘包:TCP面向字节流,没有内容分割符,可能将两条消息同时从缓存区读出来.发送两条消息 1:这是李东 2:**亚**健康终结者.接收端可能会接收到1:这是李东**亚** 2:健康终结者.如果没有正确的读取字节的话
  • 怎么解决:通过分隔符or定义消息长度等.
  • 直接使用TCP,需要去定义消息边界和格式,要解决这个通用的问题,所以一般的应用不会直接在TCP上构建自己的应用层协议.
  • 演示demo
  • 服务端
  • public class ServerDemo {
        public static void main(String[] args) throws IOException {
            // Create a server socket on port 1234
            ServerSocket serverSocket = new ServerSocket(1234);
            // Wait for a client to connect
            Socket clientSocket = serverSocket.accept();
            // Create input and output streams for the client socket
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            // Read input from the client and send a response
            String inputLine = "";
            char[] buffer = new char[5];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                inputLine = new String(buffer, 0, bytesRead);
                System.out.println("received "+ inputLine);
                out.println("Server received: " + inputLine);
            }
            // Close the streams and sockets
            out.close();
            in.close();
            clientSocket.close();
            serverSocket.close();
        }
    }
  • 客户端
    public class ClientDemo {
        public static void main(String[] args) throws IOException {
            // Create a socket to connect to the server on port 1234
            Socket socket = new Socket("localhost", 1234);
            
            // Create input and output streams for the socket
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            
            // Send a message to the server
            out.printf("这是李东");
            out.printf("亚健康终结者");
    //        out.println("Hello, server!");
            // Read the server's response
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("get response = "+inputLine);
            }
            // Close the streams and socket
            out.close();
            in.close();
            socket.close();
        }
    }

RPC框架使用

  • IDL : Interface Definition Language
  • Proto
  • syntax = "proto3";
    option java_multiple_files = true;
    option java_package = "io.grpc.examples.helloworld";
    option java_outer_classname = "HelloWorldProto";
    option objc_class_prefix = "HLW";
    package helloworld;
    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    // The request message containing the user's name.
    message HelloRequest {
      string name = 1;
    }
    // The response message containing the greetings
    message HelloReply {
      string message = 1;
    }
  • AIDL
  • RPC和HTTP的区别

  • RPC是一种思想,比HTTP出现的早
  • HTTP是一种协议

RPC的使用场景是是什么

  • HTTP 浏览器->服务器
  • RPC 客户端->服务器
  • RPC在服务端内部集群
  • Android的RPC
  • 常见的RPC框架和实现方式

  • Dubbo 基于TCP,性能更好,可定制
  • gRPC 基于HTTP,兼容性更好.
  • RPC的优势

  • 像调用本地方法一样调用
  • gPRC
    channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();
    GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
    HelloRequest request = HelloRequest.newBuilder().setName(message).build();
    HelloReply reply = stub.sayHello(request);
    return reply.getMessage();
  • Android上的RPC
  • val clipboard: ClipboardManager =            getContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager 
              val clip = ClipData.newPlainText("label", "text")
              clipboard.setPrimaryClip(clip)
  • 使用IDL定义方法-能够在编译时,检测出类型错误
  • 总结

  • 应该说RPC和HTTP应该不是同一个概念层次上的东西
  • RPC是一种调用方式,可以基于HTTP,TCP,UDP.常见的RPC应该算是一种框架,包含服务发现,注册等功能

参考

标签:HTTP,socket,笔记,RPC,new,close,概念学习,out
From: https://blog.51cto.com/u_15856917/6505602

相关文章

  • Nginx 学习笔记
    概述Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强1.正向代理如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,需要通过代理服务器来访问,这种访问就称为正向代理2.反向代理客户端对代理是无感知的,因为客户端......
  • 思科笔记:OSPF的七类LSA
    LSA类型1:RouterLSA每一个运行OSPF的路由器都会产生1类LSA这里包含宣告进OSPF的本地直连网段的信息通过IP前缀和链路类型来标识链路通过始发路由器ID来标识LSA只在本区域泛洪;无法穿越ABRLinkID是通告该LSA的路由器RIDLSA类型2.NetworkLSA只产生在广播网络和NBMA网络......
  • Java官方笔记11包
    PackagesDefinition:Apackageisagroupingofrelatedtypesprovidingaccessprotectionandnamespacemanagement.Notethattypesreferstoclasses,interfaces,enumerations,andannotationtypes.Enumerationsandannotationtypesarespecialkindsof......
  • SpringBoot学习笔记
    新建SpringBoot项目阿里云地址:https://start.aliyun.com异常消息处理//1.自定义异常类,继承RuntimeExceptionpublicclassMyExceptionextendsRuntimeException{publicMyException(){}}//2.定义全局异常类@RestControllerAdvicepublicclassGloabExcept......
  • Python3网络爬虫开发实战阅读笔记
    基本库的使用网络请求库urllib(HTTP/1.1)Python自带请求库,繁琐基础使用:略requests(HTTP/1.1)Python常用第三方请求库,便捷基础使用:略httpx(HTTP/2.0)Python第三方库,支持HTTP/2.0,支持异步请求,支持Python的async请求模式pipinstall'httpx[http2]'基础使用:与requests相似,默认......
  • Django学习笔记
    1.常用命令创建项目:django-adminstartproject项目名创建APP(进入工程目录):pythonmanage.pystartapp网站名创建库表(进入工程目录):pythonmanage.pymakemigrations执行库表建立(进入工程目录):pythonmanage.pymigrate启动运动:pythonmanage.pyrunserver模板渲染嵌入......
  • 社会学笔记与思维导图
    学科意识社会学的历史社会学的想象力社会学的历史古典社会学滕尼斯李约瑟之谜马克思·韦伯中国的入世当代社会学中国的社会学研究方法文化个人主义规范社会结构人的社会化......
  • Java官方笔记10注解
    注解注解的作用:Informationforthecompiler—Annotationscanbeusedbythecompilertodetecterrorsorsuppresswarnings.Compile-timeanddeployment-timeprocessing—Softwaretoolscanprocessannotationinformationtogeneratecode,XMLfiles,ands......
  • 计算机底层的秘密读书笔记之二
    计算机底层的秘密读书笔记之二内存部分内存部分之前自己看过很多资料了:主要是虚拟内存以及TLB相关的内容本书的角度与之前角度都不太一样,更加新颖一些.这次总结想倒着来写.1.SSD的带宽和延迟都比较好了,但是是无法代替内存的内存的寻址可以到字节,然后都是按照内......
  • Java官方笔记9Lambda表达式
    LambdaExpression有了LambdaExpression,就不用再写anonymousclasses。写Lambda,首先要找到它的类型。Thereisarestrictiononthetypeofalambdaexpression:ithastobeafunctionalinterface.函数接口,只有1个抽象方法的接口:@FunctionalInterfacepublicinterfa......