aspnetcore微服务之间通信grpc,一般服务对外接口用restful架构,HTTP请求,服务之间的通信grpc多走内网。

以前写过一篇grpc和web前端之间的通讯,代码如下:

exercisebook/grpc/grpc-web at main · liuzhixin405/exercisebook (github.com)

本次是微服务之间的通信使用了开源软件MagicOnion,该软件定义接口约束免去proto复杂配置,类似orleans或者webservice,服务调用都通过约定接口规范做传输调用,使用起来非常简单和简洁。

下面通过服务之间调用的示例代码做演示:

aspnetcore微服务之间grpc通信,无proto文件-LMLPHP

Server里面包含简单jwt的token的生成,client和002需要调用登录,通过外部接口调用传入用户和密码,内部再调用jwt服务。

aspnetcore微服务之间grpc通信,无proto文件-LMLPHP

aspnetcore微服务之间grpc通信,无proto文件-LMLPHP

aspnetcore微服务之间grpc通信,无proto文件-LMLPHP

服务之间调用如果不用proto的话,那么接口必须是公共部分,值得注意的是接口的参数和返回值必须 包含[MessagePackObject(true)]的特性,硬性条件。返回值必须被UnaryResult包裹,接口继承MagicOnion的IService,有兴趣深入的自己研究源码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MagicOnion;
using MessagePack;

namespace MicroService.Shared
{
    public interface IAccountService:IService<IAccountService>
    {
        UnaryResult<SignInResponse> SignInAsync(string signInId, string password);
        UnaryResult<CurrentUserResponse> GetCurrentUserNameAsync();
        UnaryResult<string> DangerousOperationAsync();
    }

    [MessagePackObject(true)]
    public class SignInResponse
    {
        public long UserId { get; set; }
        public string Name { get; set; }
        public string Token { get; set; }
        public DateTimeOffset Expiration { get; set; }
        public bool Success { get; set; }

        public static SignInResponse Failed { get; } = new SignInResponse() { Success = false };

        public SignInResponse() { }

        public SignInResponse(long userId, string name, string token, DateTimeOffset expiration)
        {
            Success = true;
            UserId = userId;
            Name = name;
            Token = token;
            Expiration = expiration;
        }
    }

    [MessagePackObject(true)]
    public class CurrentUserResponse
    {
        public static CurrentUserResponse Anonymous { get; } = new CurrentUserResponse() { IsAuthenticated = false, Name = "Anonymous" };

        public bool IsAuthenticated { get; set; }
        public string Name { get; set; }
        public long UserId { get; set; }
    }
}
10-22 09:27