aspnetcore微服务之间通信grpc,一般服务对外接口用restful架构,HTTP请求,服务之间的通信grpc多走内网。
以前写过一篇grpc和web前端之间的通讯,代码如下:
exercisebook/grpc/grpc-web at main · liuzhixin405/exercisebook (github.com)
本次是微服务之间的通信使用了开源软件MagicOnion,该软件定义接口约束免去proto复杂配置,类似orleans或者webservice,服务调用都通过约定接口规范做传输调用,使用起来非常简单和简洁。
下面通过服务之间调用的示例代码做演示:
Server里面包含简单jwt的token的生成,client和002需要调用登录,通过外部接口调用传入用户和密码,内部再调用jwt服务。
服务之间调用如果不用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