• Grpc+MagicOnion的学习和例子(一)


    一,什么是GRPC?

    gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

    gRPC 的主要优点是:

    • 现代高性能轻量级 RPC 框架。
    • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
    • 可用于多种语言的工具,以生成强类型服务器和客户端。
    • 支持客户端、服务器和双向流式处理调用。
    • 使用 Protobuf 二进制序列化减少对网络的使用。

    这些优点使 gRPC 适用于:

    • 效率至关重要的轻量级微服务。
    • 需要多种语言用于开发的 Polyglot 系统。
    • 需要处理流式处理请求或响应的点对点实时服务。

    微软介绍地址:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-3.0

    二,我们上代码,远程调用的demo,项目结构如下

    接口和实现 

    ServiceInterface

    using MagicOnion;
    using System;
    
    namespace ServiceInterface
    {
        public interface IGrpcTestService : IService<IGrpcTestService>
        {
            UnaryResult<string> SumAsync(int x, int y);
        }
    }

    GrpcTestService

    using MagicOnion;
    using MagicOnion.Server;
    using ServiceInterface;
    using System;
    
    namespace Service
    {
        public class GrpcTestService : ServiceBase<IGrpcTestService>, IGrpcTestService
        {
            public async UnaryResult<string> SumAsync(int x, int y) => (x + y).ToString();
        }
    }

    服务端

    Startup

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.Loader;
    using System.Threading.Tasks;
    using Grpc.Core;
    using MagicOnion.Server;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using Service;
    
    namespace grpcDemo
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                #region grpc
    
    
                MagicOnionServiceDefinition service = MagicOnionEngine.BuildServerServiceDefinition(
                    ///由于实现不在当前的项目,再新建类库,所以我们需要手动配置加载的程序集
                    new[] { AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName("Service")) },
                    new MagicOnionOptions(true)
                    {
                        MagicOnionLogger = new MagicOnionLogToGrpcLogger()
                    }
                );
                Server server = new Server
                {
                    Services = { service },
                    Ports = { new ServerPort("localhost", 6000, ServerCredentials.Insecure) }//默认端口是5000
                };
                server.Start();
                #endregion
    
                services.AddControllers();
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
        }
    }

    GrpcServiceController

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Grpc.Core;
    using MagicOnion.Client;
    using MagicOnion.Server;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    using ServiceInterface;
    
    namespace grpcDemo.Controllers
    {
        [ApiController]
        [Route("[controller]")]
        public class GrpcServiceController : ControllerBase
        {
            private readonly ILogger<GrpcServiceController> _logger;
    
            public GrpcServiceController(ILogger<GrpcServiceController> logger)
            {
                _logger = logger;
            }
    
            public string Get()
            {
                return "grpc服务端启动";
            }
        }
    }

    客户端 Program

    using Grpc.Core;
    using MagicOnion.Client;
    using ServiceInterface;
    using System;
    
    namespace grpcClientDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
    
                // 然后你就可以根据IP和端口拿到对于的服务
                var channel = new Channel("localhost", 6000, ChannelCredentials.Insecure);
    
    
                var client = MagicOnionClient.Create<IGrpcTestService>(channel);
                // 调用
                var result = client.SumAsync(100, 200).ResponseAsync.Result;
    
                Console.WriteLine("Client Received:" + result);
    
                var channel2 = new Channel("localhost", 6000, ChannelCredentials.Insecure);
    
                var client2 = MagicOnionClient.Create<IGrpcTestService>(channel2);
    
                var result2 = client2.SumAsync(100, 200).ResponseAsync.Result;
    
                Console.WriteLine("Client Received:" + result2);
            }
        }
    }

    启动服务端后再启动客户端,如下图

     这样简单的grpc就完成了

    PS:如果我们服务端的实现再另一个类库,我们需要将该类库的程序集加载进来,要不然会报错

  • 相关阅读:
    POJ1182
    poj3225 线段树区间操作 (见鬼)
    斜率优化dp(POJ1180 Uva1451)
    POJ2528 线段树的区间操作
    POI2001 Gold mine(二叉排序树 黑书经典)
    POJ3921
    博弈论之威佐夫博弈(转载)
    poj3468(线段树 边覆盖)
    hdu 1166(树状数组 或 线段树)
    压缩软件的改进--- (续先前霍夫曼编码)
  • 原文地址:https://www.cnblogs.com/May-day/p/13544924.html
Copyright © 2020-2023  润新知