在上一篇.NET Core gRPC理论篇中详细介绍了gRPC,本文将正式进行项目实践。
本文使用的是.NET Core 3.1。
为了更加清楚的了解gRPC和WebAPI的区别,这里使用一个登录,获取Token的例子进行讲解。
1.创建gRPC服务端
创建新项目,搜索gRPC
创建一个项目,命名为【Token】
删除原有的*.proto文件,创建一个新的*.proto,并命名为grpcService.proto
编写如下代码信息
syntax = "proto3";
option csharp_namespace = "grpcService";
package token;
//创建认证服务,登录,并获取token
service Login {
// Sends a greeting
rpc GetToken (UserInfo) returns (Token);
}
message UserInfo {
string userName = 1;
string userpwd = 2;
}
message Token{
string message=1;
string Expiration=2;
string AutkToken=3;
}
然后直接重新生成解决方案,会自动生成需要的文件。
右键项目,打开 *.csproj
创建服务,新建一个AuthenRRpcService的是实现服务,编写代码如下:
public class AuthenRRpcService : Login.LoginBase
{
public override Task<grpcService.Token> GetToken(UserInfo request, ServerCallContext context)
{
grpcService.Token token = new grpcService.Token();
//模拟数据库,验证用户信息
var result = MorkUserInfos.UserInfo.FirstOrDefault(x => x.Name == request.UserName && x.Pwd == request.Userpwd);
if (result == null)
{
token.Message = "用户名或密码错误";
}
else
{
DateTime dd = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan ts = (DateTime.Now.AddHours(2) - dd);
token.Message = "登录成功";
//模拟随便生成一个token
token.AutkToken = Guid.NewGuid().ToString();
token.Expiration = ts.TotalMilliseconds.ToString();
}
return Task.FromResult<grpcService.Token>(token);
}
}
在Startup创建一组模拟数据,简单模拟数据库
//模拟数据
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 1, Name = "www", Pwd = "www" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 2, Name = "eee", Pwd = "eee" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 3, Name = "rrr", Pwd = "rrr" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 4, Name = "ttt", Pwd = "ttt" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 5, Name = "yyy", Pwd = "yyy" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 6, Name = "uuu", Pwd = "uuu" });
MorkUserInfos.UserInfo.Add(new UserDB() { Id = 7, Name = "qqq", Pwd = "qqq" });
2.创建gRPC客户端
客户端创建一个webapi项目,命名为WebProject,将服务端的grpcService.proto复制到当前项目中。打开*.csproj,将GrpcServices修改为Client
nuget包下载Grpc.AspNetCore
然后直接重新生成解决方案,会自动生成需要的文件。
创建一个控制器,编写一个登录的API,调用gRPC服务
/// <summary>
/// 登录
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> UserResult(UserReq userReq)
{
try
{
UserInfo request = new UserInfo();
request.UserName = userReq.UserName;
request.Userpwd = userReq.UserPwd;
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Login.LoginClient(channel);
Token token = await client.GetTokenAsync(request);
return Ok(new
{
code = "200",
msg = "成功",
data = token
});
}
catch (System.Exception ex)
{
return Ok(new
{
code = "200",
msg = "失败" + ex.Message
});
}
}
使用Postman请求,发现已经可以看到数据
以上调用方法类似于直接调用,下面通过注入grpc服务,进行调用,在Startup中,注入grpc服务
services.AddGrpcClient<Login.LoginClient>(o =>
{
o.Address = new Uri("https://localhost:5001");
});
在控制器中,注入我们编写的gRPC服务
调用的时候,可以直接调用
*注,生成的gRPC服务,支持同步和异步两种方式,比如我这边创建的是GetToken方法,同步的时候,可以 直接调用GetToken方法,异步可以调用GetTokenAsync,对应的使用postman,可以看到请求信息如下:
至此,.NET Core gRPC实战篇结束。
本文所有代码下载地址如下:
服务端代码:点击下载
客户端代码:点击下载