您现在的位置是:主页>C Sharp>Grpc和微服务架构fm.consulinterop简单使用 网站首页

Grpc和微服务架构fm.consulinterop简单使用


简介

gRPC 是一个高性能、开源和通用的 RPC 框架,使用HTTP/2协议并用ProtoBuf作为序列化工具。支持多种语言包括 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法.


基础数据类型

protobuf支持大多数基础数据类型,下表包含常用类型,详细列表见官方文档
.proto
.net实现
描述
double
double
float
float
int32
int
有符号整形建议使用sint32
uint32
int
无符号整形
sint32
int
有符号整形
int64
long
有符号长整形建议使用sint64
uint64
long
无符号长整形
sint64
long
有符号长整形
bool
boolean
string
String
byte
Byte




枚举类型

protobuf可以定义枚举类型:

enum EnumType { 
   TYPEA = 0; 
   TYPEB = 1;
   TYPEC = 2;
}

enum的每行字段都是一个枚举值,等号后面跟的是实际值,默认实际值是不能一样的,但只需要增加一个option配置就可以设置一样的值:

enum EnumType { 
    option allow_alias = true;
    TYPEA = 0; 
    TYPEB = 0;
    TYPEC = 2;
}

自定义数据类型

还有就是自定义的message类型:

在一个proto文件中可以存放多个message,message内部也可以定义message如下

message MessageType{
  repeated string str = 1;
} 
message CompositeType {
  optional MessageType message = 1;
}


required:字段必填。
optional: 字段选填,不填就会使用默认值,默认数值类型的默认值为0,string类型为空字符串,枚举类型为第一个枚举值。
repeated: 数组类型,可以放入多个类型实例。


.net环境下怎么使用Grpc

1.在一个 .proto 文件内定义服务。
2.用 protocol buffer 编译器生成服务器和客户端代码。
3.使用 gRPC 的 C# API 进行通信。

步骤如下

创建hello.proto文件

syntax = "proto3";
package Srv.Grpc;

service TestSrv {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}


message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

创建一个.NET Framework 项目,使用Nuget添加Grpc.Tools的引用,去到packages\Grpc.Tools.1.16.0\tools\windows_x64目录下面

即可看到protoc.exe和grpc_csharp_plugin.exe文件。使用这两个文件用于生成代码。


执行命令

protoc.exe -I=C:\Users\stiles\Desktop\Project\Srv\SharedProject\Proto --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe Hello.proto

-I 后面的路径指向之前创建的protoc文件目录

下面就不使用官方的例子了,介绍下fm.consulinterop

https://github.com/FollowmeTech/fm.consulinterop

1.启动consul

大家自行下载,演示使用windows版本的,dev模式

consul安装目录下执行:consul agent -dev



打开http://localhost:8500/ui 可以查看运行情况

使用之前proto生成的代码 替换SharedProject类库的Hello.cs,和HelloGrpc.cs

修改appsetting.json

{
  "consul": {
    "service": {
      "ServiceName": "srv.test.x",
      "ConsulAddress": "http://localhost:8500",
      "ServiceAddress": "192.168.*.*:0",
      "ConsulIntegration": "true",
      "ConsulTags": "v-1.0.0.1",
      "TCPInterval": 10
    },
    "remotes": {
      "demo": {
        "name": "srv.test.x",
        "ServiceName": "srv.test.x",
        "FreshInterval": 10000,
        "ConsulAddress": "http://localhost:8500",
        "ConsulIntegration": "true",
        "ServiceAddress": ""
      }
    }
  }
}


调整服务端

HelloSrvImp文件

using System.Threading.Tasks;
using Srv.Grpc;
using Grpc.Core;

namespace Srv
{
    class HelloSrvImp : Srv.Grpc.TestSrv.TestSrvBase
    {
        public override Task SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply()
            {
                Message = "SayHello " + request.Name
            });
        }
    }
}


srv下的Program.cs

new Server
{
      Services = { Srv.Grpc.TestSrv.BindService(new HelloSrvImp()) },
}.StartAndRegisterService(srvConfig).Wait();


调整客户端

Program.cs

 var clientWithClientMiddleware =
       new ClientAgent(clientConfig,
       new ClientAgentOption
       {
            ClientCallActionCollection = new ClientCallActionCollection { new InvokeTimeoutMiddleware(10000), new LoggerClientCallAction() }
        });
 try
 {
       Srv.Grpc.HelloReply response = clientWithClientMiddleware.Proxy.SayHello(new Srv.Grpc.HelloRequest() { Name = "Stiles" });
       Console.WriteLine(response.Message);
 }
 catch (Exception ex)
 {
       Console.WriteLine(ex.ToString());
 }


启动srv ,启动client


总结

1:简单熟悉了下grpc的用法,和基本数据类型

2:了解了下fm.consulinterop 使用TTL检查服务存活的方式,有兴趣的同学也可以看下源码。


源码如下:下载


参考资料:


Proto2语法

gRPC 官方文档中文版

fm.consulinterop


Top