gRPC-浅试

最近接到业务需求,对接外包算法的http接口,了解了gRPC的使用,这里以一个简单的例子说明。

1 新建程序

新建gRPCClient和gRPCServer

2 添加引用

打开NuGet,安装Grpc、Google.Protobuf和Grpc.Tools

3 定义服务

 定义LogService.proto文件,如下代码:我这里是将服务放在gRPCServer下,也可以放在其他项目下

//指定语法proto2或proto3 本文采用proto3
syntax = "proto3";

//指定命名空间
option csharp_namespace = "gRPCServer";

//定义rpc服务
service gRpcQueryService
{
    rpc Search(QureyCond) returns (QueryResult);
}

//定义查询条件消息体
message QureyCond
{
    int32 id=1;        //通过id查询
}

//定义查询结果实体对象
message QueryResult
{
    int32 id=1;
    string name=2;
    int32 age=3;
}

4 生成代码

打开CMD,在项目的packages文件夹可找到Grpc.Tools 通过cd /d 命令转到packages上一级目录

指定protoc.exe路径:packages\Grpc.Tools.2.50.0\tools\windows_x64\protoc.exe 

指定proto文件搜索目录:-IgRPCServer  

C#代码生成路径:--csharp_out gRPCServer

指定proto文件:gRPCServer\LogService.proto

grpc文件生成路径:--grpc_out gRPCServer

指定grpc_csharp_plugin.exe路径:--plugin=protoc-gen-grpc=packages\Grpc.Tools.2.50.0\tools\windows_x64\grpc_csharp_plugin.exe

输入命令运行成功得到两个cs文件,将文件添加到项目中。

 5 服务端

定义监听服务

const int Port = 8050;
  public static void Main(string[] args)
        {
            Server server = new Server
            {
                Services = { gRpcQueryService.BindService(new GRPCImpl()) },
                Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
            };

            server.Start();
            Console.WriteLine("gRPC server listening on port " + Port);
            Console.WriteLine("任意键退出...");
            Console.ReadKey();

            server.ShutdownAsync().Wait();
        }    

具体服务内容

class GRPCImpl : gRpcQueryService.gRpcQueryServiceBase
    {
        public override Task<QueryResult> Search(QureyCond request, ServerCallContext context)
        {
            return Task.FromResult(Search(request));

        }

        private QueryResult Search(QureyCond cond)
        {
            //自定义逻辑
            QueryResult result = new QueryResult();
            result.Id = cond.Id;
            result.Name = "周";
            result.Age = 23;
            return result;
        }
    }

6 客户端

调用方法

Channel channel = new Channel("127.0.0.1:8050", ChannelCredentials.Insecure);
            var client = new gRpcQueryService.gRpcQueryServiceClient(channel);
            var result = client.Search(new QureyCond { Id = 2 });
            Console.WriteLine("结果:id={0} name={1} age={2}", result.Id, result.Name, result.Age);
            channel.ShutdownAsync().Wait();
            Console.WriteLine("任意键退出...");
            Console.ReadKey();

7 调用效果

先打开gRPCServer

再打开gRPCClient

grpc-go是一款受欢迎的Go语言实现的高性能RPC框架,用于构建分布式系统。它基于Google的开源框架gRPC,并为Go语言提供了相应的接口和库。下面我将对grpc-go源码进行简要剖析。 在grpc-go源码中,最重要的是其核心组件:Transport、Balancer、Resolver和Server。Transport负责网络传输,提供基于TCP、HTTP/2和TLS的通信功能。Balancer用于负载均衡,可根据策略将请求分配到不同的服务节点。Resolver负责服务发现,帮助客户端找到可用的服务实例。Server则是用于接收和处理来自客户端的请求。 在Transport层,grpc-go使用了高效的HTTP/2协议作为底层通信协议。通过HTTP2Transport接口,它可以方便地与底层通信协议进行交互。此外,Transport还利用了框架提供的拦截器机制,可以实现一些额外的功能,比如认证、日志记录等。 在Server端,grpc-go提供了一个灵活的框架,可以通过定义服务接口和实现服务方法来处理请求。它还支持多种传输模式,包括独立的HTTP/2、TCP以及TLS加密等。Server还提供了流式调用和双向流式调用的支持,可以处理大量并行请求。 在Client端,grpc-go提供了方便的接口和功能,用于与服务端进行通信。客户端可以根据服务接口定义的方法来发起请求,并且可以设置超时时间、重试机制等。此外,客户端还支持流式和双向流式调用,可以实现高效的数据交互。 总结来说,grpc-go源码剖析主要集中在核心组件的实现,包括Transport、Balancer、Resolver和Server等。通过这些组件的协同工作,grpc-go能够实现高性能、高效的RPC通信。同时,grpc-go还提供了丰富的功能和接口,方便开发人员使用和扩展。通过理解grpc-go源码,开发人员可以更好地利用这个框架构建高效的分布式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值