首页 > 其他分享 >.net core 微服务 集成Ocelot 和Nacos 之后使用grpc 如何实现服务与服务之间的调用

.net core 微服务 集成Ocelot 和Nacos 之后使用grpc 如何实现服务与服务之间的调用

时间:2023-06-12 17:00:39浏览次数:39  
标签:core 服务 grpc gRPC Ocelot null 路由

在 .NET Core 微服务中使用 gRPC 调用其他服务,你需要完成以下步骤:

1. 定义服务契约: 你需要定义你的服务、方法以及消息类型,以便客户端和服务端协商通信。

2. 生成代码: 你需要使用 gRPC 工具生成客户端和服务端的代码,这样你就可以在应用程序中使用它们。

3. 实现服务: 你需要实现服务契约中指定的方法。

4. 注册服务: 将服务注册到你的服务注册中心中,所以其他服务可以发现并访问你的服务。

5. 调用服务: 你需要使用生成的客户端代码从其他服务中调用服务。

具体步骤如下:

1. 定义服务契约,你可以使用 protobuf 语法来定义它。并在服务端和客户端中共享服务契约文件。

syntax = "proto3";

package MyService;

service MyService{
rpc DoSomething (MyRequest) returns (MyResponse) {}
}

message MyRequest {
string name = 1;
}

message MyResponse {
string message = 1;
}

  

2. 生成代码,可以使用以下命令生成代码:

# 生成服务端代码
protoc --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin MyService.proto

# 生成客户端代码
protoc --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=/usr/local/bin/grpc_csharp_plugin MyService.proto

3. 实现服务,你需要实现服务契约中指定的方法。

public class MyService : MyServiceBase
{
public override Task<MyResponse> DoSomething(MyRequest request,
ServerCallContext context)
{
return Task.FromResult(new MyResponse()
{
Message = $"Hello, {request.Name}"
});
}
}

 

  

4. 在服务完成后,你需要将其注册到服务注册中心。比如,在使用 Nacos 作为注册中心的情况下,你可以在 Startup.cs 中进行注册。

public void ConfigureServices(IServiceCollection services)
{
// 添加 gRPC 服务
services.AddGrpc();

// 配置服务发现
services.AddNacosDiscovery(Configuration.GetSection("NacosDiscovery"));
}

 

5. 调用服务,你需要使用生成的客户端代码从其他服务中调用服务。

var channel = new Channel("my-service:50051", ChannelCredentials.Insecure);
var client = new MyService.MyServiceClient(channel);

var reply = await client.DoSomethingAsync(new MyRequest { Name = "Bob" });

Console.WriteLine(reply.Message);

 

其中,`my-service` 是要调用的服务的名称,它已经在 Nacos 注册中心中注册过了。

需要注意,如果你在 .NET Core 中使用 Ocelot 和 Nacos 作为你的网关和服务注册中心,你需要在 Ocelot 中添加以下配置,以便 Ocelot 可以将请求路由到正确的端点:

{
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "my-service",
"Port": 50051
}
],
"UpstreamPathTemplate": "/my-service/{*catch-all}"
}

 

在这里,`DownstreamHostAndPorts` 包含要调用的 g

"GlobalConfiguration": {
"GrpcChannelOptions": {
"MaxReceiveMessageSize": "67108864",
"MaxSendMessageSize": "67108864",
"KeepAliveTime": "00:00:30",
"EnableCompression": true
}
}

 

RPC 服务的主机和端口号,`UpstreamPathTemplate` 包含 Ocelot 网关的路由映射,它应该匹配你的 gRPC 服务路径和参数。

 

Ocelot 是一个 .NET Core 的 API 网关,它能够处理传入请求并将它们路由到 API 的正确端点。我们可以使用 Ocelot 作为前端网关,接收客户端的请求,然后将它们路由到我们的 gRPC 服务上。

首先,我们需要在 Ocelot 中启用 gRPC 协议。我们可以通过以下方式在 Ocelot 中添加 gRPC 协议的支持:

1. 安装 Ocelot.GrpcHttpGateway 中间件包
2. 在 Ocelot 配置文件中添加以下代码:

 

在上面的配置中,我们可以设置 gRPC 的一些选项,例如最大接收/发送消息大小、保持连接时间和启用压缩。

接下来,在 Ocelot 的路由中,我们需要将 gRPC 请求的端点指向我们的 gRPC 服务:

{
"DownstreamPathTemplate": "/{service}/{method}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5000
}
],
"UpstreamPathTemplate": "/{service}/{method}",
"UpstreamHttpMethod": [ "POST" ],
"RouteClaimsRequirement": null,
"AuthenticationOptions": null,
"RequestIdKey": null,
"FileCacheOptions": null,
"QoSOptions": null,
"LoadBalancerOptions": null,
"DownstreamHeaderTransform": null,
"UpstreamHeaderTransform": null,
"DownstreamHostHeader": null,
"Key": "grpc_service",
"DelegatingHandlers": [],
"DangerousAcceptAnyServerCertificateValidator": null,
"HttpHandlerOptions": null,
"RateLimitOptions": null,
"UseServiceDiscovery": false,
"ServiceName": null
}

 

在上面的路由配置中,我们可以看到:

- DownstreamHostAndPorts 中指定了我们的 gRPC 服务的主机和端口;
- UpstreamPathTemplate 和 DownstreamPathTemplate 指定了请求的路径。其中,UpstreamPathTemplate 描述了网关将接收的路由,而 DownstreamPathTemplate 描述了该路由将被路由到的服务路径;
- Key 属性定义了服务的唯一标识符,用于 Ocelot 中的缓存和负载平衡;
- UpstreamHttpMethod 属性设置为 POST,因为 gRPC 使用 HTTP/2 而不是 HTTP/1.1。

最后,我们需要将 Ocelot 集成到 Nacos 中,以便我们可以动态地将请求路由到正确的端点。这可以通过在 Ocelot 配置文件中添加以下代码来实现:

"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": 8848,
"Type": "Polling",
"PollingInterval": "10",
"Namespace": "",
"ConfigurationKey": "",
"Token": "",
"EnableChildrenMonitor": false

 

在上面的配置中,我们可以指定 Nacos 的主机和端口,以及轮询服务的间隔时间。我们还可以设置其他选项,例如命名空间和令牌。

通过上述步骤,我们就成功地将 gRPC 和 Ocelot 集成起来,实现了微服务之间的调用和请求转发。

标签:core,服务,grpc,gRPC,Ocelot,null,路由
From: https://www.cnblogs.com/lijunfengcz/p/17475505.html

相关文章

  • linux服务器CPU飙高排查
    文章目录前言一、第一步top二、根据pid查找具体线程2.根据pid找到16进制3.根据进程和线程查找原因总结前言系统cpu飙高,尤其对于后端人员来说,其实应该学会排查,这样也算是综合能力的体现;那么当出现了cpu严重飙高的时候怎么排查呢?一、第一步top直接在问题服务器输入命令:to......
  • frp内网穿透web服务配置
    frp是使用较多的免费开源的内网穿透软件,源代码托管在GitHub。1.下载安装安装步骤可参考官方文档https://gofrp.org/docs/setup/点击项目的release地址进入下载页面:https://github.com/fatedier/frp/releases,首先要根据自己需要安装的机器系统架构下载相应的二进制安装包。frp的......
  • 【有奖调研】互联网新型社交,华为在找“元服务搭子”,快来集合!
    “聊技术无话不谈,一起来吹吹元服务!畅聊你对元服务的想法,说不定,你就能撬动元服务的爆发增长!”元服务(即原子化服务)是华为“轻量化”服务的新物种,可提供全新的服务和交互方式,让应用化繁为简,让服务触手可及!基于鸿蒙万能卡片,元服务可实现应用功能在桌面“永远打开”,实现智能推荐、服务......
  • DDOS和CC打击的区别,哪种打击对服务器伤害更大
    近几年,网络恶意打击逐渐增多,很多网站饱受困扰,而其中最为常见的恶意打击就是CC以及DDoS打击,对于一些防御能力较弱的网站来说,一旦遭遇这些打击,轻则网站瘫痪,重则直接影响流量导致无法生存,那么DDoS打击和CC打击区别在哪里?哪一个对服务器伤害比较大?下面来简单分析一下DDoS打击DDoS打击(分......
  • 【有奖调研】互联网新型社交,华为在找“元服务搭子”,快来集合!
    “聊技术无话不谈,一起来吹吹元服务!畅聊你对元服务的想法,说不定,你就能撬动元服务的爆发增长!”元服务(即原子化服务)是华为“轻量化”服务的新物种,可提供全新的服务和交互方式,让应用化繁为简,让服务触手可及!基于鸿蒙万能卡片,元服务可实现应用功能在桌面“永远打开”,实现智能推荐、服务......
  • 对象存储服务-Minio
    对象存储服务(ObjectStorageService,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。对象存储服务在项目开发过程中,我们会产生大量的对象数据,包括:日志文件,数据库脚本文件、安装包,容器镜像,图......
  • U-Mail企业邮件服务器搭建方案
    数字化办公的日渐推行,使企业对邮箱的依赖与日俱增,正式工作报告,部门之间的事物往来、通知等等都需要使用到企业邮箱。随着企业对数字化建设的不断深入,企业对企业邮箱的要求也越来越高,比如对第三方应用集成及协同办公要求高,需要同时支持多种业务的开展,对企业邮箱的稳定及高效性要求高......
  • Linux控制服务启动关闭
    systemctl命令Linux系统很多软件(内置或第三方)均支持使用systemctl命令。系统内置服务均可被systemct控制第三方软件,如果自动注册了可以被systemct控制第三方软件,如果没有自动注册,可以手动注册。systemctl命令控制:启动,停止,开机自启。能够被systemctl管理的软件,一般称之为:服......
  • 虚拟器关机后如何开启oracle服务
     如果在windows2003中安装了oracle,并且重新启动(非挂起:暂停)了虚拟机那么大概率这台虚拟机在启动完毕后,其中的oracle服务不能正常运作处理方法:打开虚拟机的命令行,并且执行:  sqlplus  /  as  sysdba这一步会登入oracle工业园区的控制中心在控制中心的命令行中执行startup......
  • Boost::asio范例分析 服务端
      main函数要求程序调用者传递3个参数:服务器IP地址,端口号和文档根目录.其中IP地址可以是IPv4或IPv6格式.接着创建server对象实例,将传递进来的IP地址,端口号,文档根目录作为server对象的构造函数参数传递到处理程序中.最后调用server的run成员函数启动服务端处理例程.   ......