.net Core Grpc使用笔记

3 篇文章 0 订阅

注意:使用计算机名称,目录不要出现任何中文 ,包括注释等,一点中文都有可能造成翻车http://tnblog.net/17726394069/article/details/6134)

第一步:
使用NuGet下载三个包(与上一篇.net Core使用一样)

 Microsoft.EntityFrameworkCore.SqlServer:Sql Server数据库EF提供程序
 Microsoft.EntityFrameworkCore.Design:设计时EF共享库
 Microsoft.EntityFrameworkCore.Tools:EF的NuGet包管理器命令工具

*到这步以后,有的会出现包上出现黄色感叹号的报错,这就是因为你在哪里用了中文,我们是出现最多的问题就是用户名用了中文,这是个大忌,计算机用户名必须为英文哦,如果出现计算机用户名是中文的情况,去解决或者换名字的时候,一定要注意,或者备份之类的,别把计算机弄崩了。

第二步:
在NuGet管理器控制输入指令生成实体类和上下文类
语句:

Scaffold-DbContext ‘连接字符串’ 数据提供程序名称 -OutputDir 结果输出文件夹 -Context 数据上下文名
–DataAnnotations

例如:

Scaffold-DbContext ‘Data Source=.\SQL2017;Initial Catalog=ShoppingDB;
Integrated Security=True;’ Microsoft.EntityFrameworkCore.SqlServer
-OutputDir Models -Context ShopContext

第三步:
右键项目 — 新建项 — ASP.NET CORE 常规下选择 协议区缓冲文件 — 取名xxx.proto(这里举例取名为:shop.proto)

第四步:
定义protobuf接口文件

syntax = "proto3";

option csharp_namespace = "GrpcService";

package product;

import "google/protobuf/empty.proto";

service ProductManager{
    rpc GetProductByID(ProductRequest) returns (ProductResponse);
    rpc GetProductList(google.protobuf.Empty)  returns (ProductListResponse);
}

message ProductInfo{
   int32 ProductId=1;
   string ProductName=2 ;
   int32 CategoryId=3;
   double ProductPrice=4;
   int32 Stock=5;
   string ProductDesc =6;
   string ProductImg =7;
}

message ProductRequest{
    int32 id=1;
}

message ProductResponse{
    ProductInfo product=1;
}

message ProductListResponse{
    repeated ProductInfo product=1;
}

完成以后,先看看错误列表有没有报错,有报错先解决报错。一般来说只要步骤和操作按照我的来了,不会有报错

第五步:
右键添加服务引用 注意是【服务端】,然后运行检查protobuf文件是否书写正确
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

*添加完成后项目重新生成一次

第六步:
在appsettings.json文件中添加连接字符串json

{
  "ConnectionStrings": {
    "ShopConStr": "Data Source=.;Initial Catalog=ShoppingDB; Integrated Security=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }
}

第七步:
在 startup类完成上下文类的注册和grpc服务的映射

using GrpcService.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using GrpcService.Services;

public IConfiguration Configuration { get; set; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public void ConfigureServices(IServiceCollection services)
        {
            // 注册上下文类
            services.AddDbContext<ShopContext>(options=> {
                options.UseSqlServer(Configuration.GetConnectionString("ShopConStr"));
            });
            services.AddGrpc();
        }

下面两句加在Configure中:

endpoints.MapGrpcService<GreeterService>();
                // 添加grpc服务映射关系
                endpoints.MapGrpcService<ShopService>();

在这里插入图片描述
第八步:
在Services文件夹新建ShopService类,完成方法的实现

public class ShopService:ProductManager.ProductManagerBase   // 对应的是protobuf文件的服务名称
    {
        private readonly ShopContext _context;
        private readonly ILogger<ShopService> _logger;
        public ShopService(ShopContext context,ILogger<ShopService> logger)  // 依赖注入
        {
            _context = context;
            _logger = logger;
        }

        public override Task<ProductResponse> GetProductByID(ProductRequest request, ServerCallContext context)
        {
            // 定义输出参数
            var res = new ProductResponse();
            // 书写查询语句
            var pro = _context.Products.Where(p=>p.ProductId==request.Id).Select(p => new ProductInfo
            {
                ProductId = p.ProductId,
                ProductDesc = p.ProductDesc,
                ProductImg = p.ProductImg,
                ProductName = p.ProductName
            }
            ).FirstOrDefault();
            _logger.LogInformation("已经开始读取数据库的数据");
            // 将查询结果赋值给输出参数
            res.Product = pro;
            // 返回结果
            return Task.FromResult(res);
        }

        public override Task<ProductListResponse> GetProductList(Empty request, ServerCallContext context)
        {
            // 定义输出参数
            var res = new ProductListResponse();
            // 书写查询语句
            var list = _context.Products.Select(p=>new ProductInfo
            {
                ProductId=p.ProductId,
                ProductDesc=p.ProductDesc,
                ProductImg=p.ProductImg,
                ProductName=p.ProductName
            }
            ).ToArray();
            _logger.LogInformation("已经开始读取数据库的数据");
            _logger.LogInformation($"list有{list.Length}条");
            // 将查询结果赋值给输出参数
            res.Product.Add(list);
            // 返回结果
            return Task.FromResult(res);
        }
    }

【注意】 protobuf文件命名空间与服务类文件命名空间一致
——————————————————————————————————
以上就完成了Grpc服务器的配置,接下来是客户端

创建gRPC客户端:
1) 使用VS2019创建MVC项目
2) 打开服务器的项目在文件夹中复制Protos文件中文件到该项目中
3) 添加protobuf文件的客户端服务引用(与创建服务器的第五步一样,不过在这次是选客服端),并生成代理类
4) 创建gRPC客户端代理对象并调用gRPC方法
【注意】 客户端的端口号不要和服务器的端口号冲突
具体步骤:

  1. 复制服务器的protos文件夹到客户端的项目上
  2. 添加grpc服务,注意是客户端
  3. 在控制器Index()操作方法上完成代码;记得先添加
    using Grpc.Net.Client;引用
//查集合
public IActionResult Index()
        {
            // 创建服务器的信道
            var channel = GrpcChannel.ForAddress("https://localhost:5001");
            // 创建客户端
            GrpcService.ProductManager.ProductManagerClient client = new GrpcService.ProductManager.ProductManagerClient(channel);
            // 调用相应的方法
            var list = client.GetProductList(new Google.Protobuf.WellKnownTypes.Empty());
            // 模型传值
            return View(list.Product.ToList());
        }
//查对象
public IActionResult Index()
        {
            // 创建服务器的信道
            var channel = GrpcChannel.ForAddress("https://localhost:5001");
            // 创建客户端
            GrpcService.ProductManager.ProductManagerClient client = new GrpcService.ProductManager.ProductManagerClient(channel);
            // 调用相应的方法
           var pro = client.GetProductByID(new GrpcService.ProductRequest { Id=1023});//id值看你数据库的id
            // 模型传值
            return View(pro.Product);
        }

查集合的视图:

<div class="text-center">
    @foreach (var item in Model)
    {
        <dl>
            <dt>
                @item.ProductId
            </dt>
            <dd>
                @item.ProductName
            </dd>
            <dd>@item.ProductDesc</dd>
        </dl>
    }
</div>

完毕完毕!!引用请备注出处,我写这个是真不容易,哭哭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Core是微软开源的跨平台框架,可以用于构建Web应用程序、Web API、微服务和其他类型的应用程序。gRPC是一种高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为序列化协议。 在.NET Core中,可以使用gRPC框架来构建高性能、跨平台的微服务。gRPC框架提供了基于Protocol Buffers的定义和代码生成工具,使得开发人员可以轻松地定义和实现RPC接口。gRPC框架还提供了基于HTTP/2的双向流式传输,这意味着客户端和服务器可以同时发送和接收多个消息,从而提高了系统的吞吐量和性能。 使用gRPC框架开发微服务的步骤如下: 1. 定义gRPC服务:使用Protocol Buffers定义接口和消息类型。 2. 生成代码:使用gRPC工具生成客户端和服务器端代码。 3. 实现服务:实现服务器端接口。 4. 创建客户端:创建gRPC客户端并调用服务。 .NET Core提供了丰富的工具和库来支持gRPC开发,包括: 1. gRPC工具:可以使用gRPC工具从Protocol Buffers文件生成代码。 2. gRPC.AspNetCore:可以使用gRPC.AspNetCore库在ASP.NET Core应用程序中托管gRPC服务。 3. gRPC.Net.Client:可以使用gRPC.Net.Client库创建gRPC客户端。 4. gRPC.Tools:可以使用gRPC.Tools库在Visual Studio中集成gRPC工具。 总之,.NET Core提供了完整的支持gRPC的框架和工具,使得开发人员可以轻松地构建高性能、跨平台的微服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值