1.创建gRPC服务
新建一个gRPC模板的项目
2.创建proto
右键-属性-查看生成方式
3.编写服务
syntax = "proto3";
option csharp_namespace = "GrpcServiceTT.Protos";
package order;
// 订单服务定义
service Order {
// 创建订单
rpc CreateOrder (CreateRequest) returns (CreateResult);
//查询订单
rpc QueryOrder (QueryRequest) returns (QueryResult);
}
//创建订单请求参数
message CreateRequest {
string orderNo = 1;
string orderName=2;
double price=3;
}
//创建订单返回结果
message CreateResult {
bool result = 1;
string message=2;
}
//查询订单请求参数
message QueryRequest{
string orderNo=1;
}
//查询订单返回结果
message QueryResult{
int32 id=1;
string orderNo=2;
string orderName=3;
double price=4;
}
编译之后就生成了对应的类
3.1 编写OrderService
在Services 新建OrderService.class
继承的Order.OrderBase 是上面的proto文件生成的,然后实现了proto里面定义的两个服务。
using Grpc.Core;
using GrpcServiceTT;
using GrpcServiceTT.Protos;
namespace GrpcServiceTT.Services
{
public class OrderService : Order.OrderBase
{
public override Task CreateOrder(CreateRequest request, ServerCallContext context)
{
return Task.FromResult(new CreateResult
{
Result = true,
Message = "订单创建成功"
});
}
public override Task QueryOrder(QueryRequest request, ServerCallContext context)
{
return Task.FromResult(new QueryResult()
{
Id = 1,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "冰箱",
Price = 1288
});
}
}
}
然后在program.cs里面把服务注入管道。
4.创建客户端服务
- 创建WebAPI
- 安装nuget包 Grpc.AspNetCore
- 把服务端的proto文件拷贝过来,设置好参数后,会生成下图类
5.gRPC服务Https的调用
//常规使用,https
string url = "https://localhost:5001";
// http
//string url = "http://localhost:5000";
//AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
OrderName = "冰箱22款",
Price = 1688,
});
}
6.IOC注入的方式调用
program.cs里面注入gRPCClient
#region gRPC Client注册
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
builder.Services.AddGrpcClient(options =>
{
options.Address = new Uri("http://localhost:5000");
}).ConfigureChannel(grpcOptions =>
{
//可以完成各种配置,比如token
});
#endregion
//注意:要放在 var app = builder.Build(); 之前不然会报错
调用方式
private OrderClient _orderClient;
public ValuesController(OrderClient orderClient)
{
_orderClient = orderClient;
}
[HttpGet]
public IEnumerable Get()
{
var reply = _orderClient.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyMMddHHmmss"),
OrderName = "冰箱22111款",
Price = 1688,
Remark = "TRRRRRRRRRRRRRRRR"
});
return new string[] { reply.Message, reply.Result.ToString() };
}



