zoukankan      html  css  js  c++  java
  • 【ASP.NET Core学习】远程过程调用

     本文介绍在gRPC使用,将从下面几个方面介绍

    1. 什么是RPC
    2. 什么时候需要RPC
    3. 如何使用gRPC

    什么是RPC

    RPC是Remote Procedure Call简称,翻译过来是远程过程调用。它是一个进程间的通讯技术,基于Client-Server模式,让程序像调用本地方法一样使用,而无需去关系它细节如何实现。

    上面是我的理解,怕理解有错或者表达不准确,下面引用维基百科

    维基百科 a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction

    网上找到一个图,比较形象描述RPC调用过程

    什么时候需要RPC

    RPC是解决进程间通讯(可以是同一个服务器,也可以是不同服务器的进程间,但是通常是内网的不同服务器之间进程通讯)。 

    解决进程间通信,Web Api也是可以解决,为什么还需要RPC?我认为可以从下面几点

    1. Web Api是基于HTTP,RPC可以是HTTP,也可以是TCP,甚至基于Socket,RPC框架通常都是隐藏通讯细节,让我们无感知使用

    2. Web Api 通常基于JSON格式,XML格式,这种格式易读性强,但是随之带来就是传输过程需要把数据的元数据也带进去传输

    3. Web Api更多应用场景是提供方定义好接口,由客户端按需调用,RPC通常需要调用方和提供方沟通一起定义接口

    所以PRC更多是使用以下场景

    1. 对通讯性能要求较高
    2. 微服务
    3. 点到点通讯

    gRPC使用

     gRPC是Google开源的高性能RPC框架,有以下几个特点

    1. 现代高性能轻量级 RPC 框架。
    2. 协定优先 API 开发,默认使用protobuf,允许与语言无关的实现。(这里涉及两点,1.面向接口开发,依赖抽象而不是具体,2. 可以不同语言实现协作)

    3. 使用 Protobuf 二进制序列化减少对网络的使用。(减少网络传输)

    4. 可用于多种语言的工具,以生成强类型服务器和客户端。

    5. 支持客户端、服务器和双向流式处理调用。

    下面开始介绍如何在Net Core上使用gRPC

    一、安装dotnet-gRPC工具(用于引用protobuf文件,生成客户端/服务端代码)

    dotnet tool install dotnet-grpc -g

    二、新建一个protobuf文件

    syntax = "proto3";
    
    option csharp_namespace = "gRPC.Services";
    
    package sms;
    
    // The greeting service definition.
    service SmsSender {
      // Sends a greeting
      rpc SendSms (SmsRequest) returns (SmsResponse);
    }
    
    // The request message containing the user's name.
    message SmsRequest {
      string tel = 1;
      string content = 2;
    }
    
    // The response message containing the greetings.
    message SmsResponse {
      int32 code = 1;
      string message = 2;
    }

    三、新建一个服务端

    1. 新建一个gRPC工程

    dotnet new grpc -n gRPC.Services

    2. 引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件)

    dotnet-grpc add-file ..gRPC.Protos*.proto -s Serve

    3. 新建服务类

    public class SmsService : SmsSender.SmsSenderBase
    {
        private readonly ILogger<SmsService> _logger;
        public SmsService(ILogger<SmsService> logger)
        {
            _logger = logger;
        }
    
        public override Task<SmsResponse> SendSms(SmsRequest request, ServerCallContext context)
        {
            return Task.FromResult(new SmsResponse
            {
                Code = 1,
                Message = "发送成功"
            });
        }
    }
    SmsSender 是生成工具生成的服务端代码

    4. 配置grpc服务类终结点

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<SmsService>();
    });

    四、新建客户端

     1. 新建控制台程序

    dotnet new console -n gRPC.Client

    2. 添加包(Google.Protobuf)

    dotnet add package Google.Protobuf

    3. 引入步骤二生成的protobuf文件(可以使用通配符引入多个protobuf文件),注意:这里需要生成是客户端代码,当然也可以用Both参数生成

    dotnet-grpc add-file ..gRPC.Protos*.proto -s Client

    五、运行

    1. 运行服务端

    2. 启动客户端

    客户端输出下面信息

    {"Code":1,"Message":"u53D1u9001u6210u529F"}

    六、小结

    gRPC的生命周期

    Client(发送请求) -> Client stub(压缩/解压) -> Client RPC Transfer(发送/接收) -> Server RPC Transfer(接收/发送) -> Server stub(解压/压缩) -> Server (处理响应)

    gPRC帮我们隐藏中间的环节,只剩下两头的代码(俗称业务逻辑代码)

    protobuf它是一种可序列化的数据结构,但它更重要是定义接口,让服务端和客户端能分离出来

  • 相关阅读:
    Java 如何在线打开编辑word文档?
    java运行Linux命令
    docker安装mysql挂载宿主本地目录资源后无法启动的问题
    BigDecimal 实际测试结果
    docker中Ubuntu安装jdk1.8
    smarty模板自定义变量调节器
    smarty模板基础
    phpcms基本语句的用法
    php后台管理(列表页替换)
    phpcms后台管理(首页内容替换)
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12000796.html
Copyright © 2011-2022 走看看