首页 > 其他分享 >第41篇 Grpc实现客户端与服务端高效通信

第41篇 Grpc实现客户端与服务端高效通信

时间:2024-10-23 10:11:34浏览次数:1  
标签:Console Grpc 41 WriteLine new server 服务端 客户端

grpc的确是现在最流行的跨平台间的通信技术。远不止.net上使用。grpc是谷歌公司推出的跨语言平台之间的通信技术。和webapi不同的是,可以使用自己的语言和另一种语言进行通信。

简单来讲就是首先使用一种Proto的协议文件,可以生成客户端和服务端两种文件。客户端和服务端可以使用任意的语言。grpc工具会将proto编译成任何一种语言。
比方说c#和java进行通讯。这时首先确认谁作server谁做client。然后使用grpc tools编译成c#类库和java的jar包,再引入到各自的项目,这时在c#引用的grpc tools生成的dll里就有proto文件中生成的方法。而java中的jar包也会有对应的方法。当然在这之前需要在proto中规定两端使用的api方法。也就是先生成proto文件约定两端之间调用的方法名称,参数,及参数类型。然后就可以完成跨语言之间的协同开发。可以一个java server端,对应于多个不同语言的client端,如python、nodejs、c#等。也可以一个server端如rust server端,对应多个相同的客户端如php等。非常的灵活。
grpc可以说是一种非常高效的跨平台的通讯方案。因为它已经支持是http2。未来会支持基于udp的http3真正实现异步io。

下面我通过一个框架搭建的demo进行演示

1.GrpcProject项目框架

框架分为客户端和服务端,以及一些公共类库,使得框架完善

image

1.1 GrpcClient_Console客户端,采用控制台

通过客户端连接服务端,发送数据
主要代码实现如下

public class Program
	{
		static async Task Main(string[] args)
		{
			Channel channel = new("localhost:5099", ChannelCredentials.Insecure);

			try
			{
				Console.WriteLine("这个应用是客户端,正在连接远程服务端...");
				await channel.ConnectAsync();
				Console.WriteLine("服务端连接成功");
				Console.WriteLine("Successfully connected to the server!");

				Console.WriteLine("First name?");
				var name = Console.ReadLine();

				Console.WriteLine("Last name? ");
				var lastName = Console.ReadLine();

				var request = new CreatePersonRequest
				{
					FirstName = name,
					LastName = lastName
				};

				var client = new PeopleService.PeopleServiceClient(channel);

				var response = await client.CreatePersonAsync(request);

				Console.WriteLine($"{response.FirstName} {response.LastName} has been created " +
					$"on the server! (id = {response.Id})");

				Console.WriteLine("Press enter to close the client");
				Console.ReadLine();
			}
			catch (Exception ex)
			{
				Console.WriteLine("An error occurred: " + ex.ToString());
				Console.ReadLine();
			}
			finally
			{
				if (channel is not null)
				{
					await channel.ShutdownAsync();
				}
			}
		}
	}

2.GrpcServer_Console服务端,采用控制台

服务端可以接送客户端发送消息,并写入数据库
主要是这三个类Program,PeopleServiceImpl,ServerDbContext
通过这三个类之间的调用,可以生成数据库,数据写入库,数据库采用sqlite
image

internal class Program
	{
		static async Task Main(string[] args)
		{
			new ServerDbContext().Database.EnsureCreated();

			Server server = new()
			{
				Ports = { new ServerPort("localhost", 5099, ServerCredentials.Insecure) },
				Services = { PeopleService.BindService(new PeopleServiceImpl()) }
			};

			try
			{
				Console.WriteLine("这应用是服务端,正在启动服务端...");
				server.Start();
				Console.WriteLine("服务端启动成功");
				Console.WriteLine("Press enter to close the server");
				Console.ReadLine();
			}
			catch (Exception ex)
			{
				Console.WriteLine("An error occurred: " + ex.ToString());
			}
			finally
			{
				if (server is not null)
				{
					await server.ShutdownAsync();
				}
			}
		}
	}


 public class PeopleServiceImpl : PeopleServiceBase
	{
		public override async Task<Person> CreatePerson(
			CreatePersonRequest request,
			ServerCallContext context)
		{
			using var ctx = new ServerDbContext();

			var dbPerson = new Person
			{
				LastName = request.LastName,
				FirstName = request.FirstName
			};
			ctx.People.Add(dbPerson);

			await ctx.SaveChangesAsync();

			return new Person
			{
				LastName = request.LastName,
				FirstName = request.FirstName,
				Id = dbPerson.Id
			};

		}
	}


 public class ServerDbContext : DbContext
	{
		public DbSet<Person> People { get; set; }

		protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
		{
			optionsBuilder.UseSqlite("Filename = data.db");
		}
	}

3.共用类库

GrpcProtos :用于存放Proto文件
AbstractDAL :用于数据库操作抽象类
DBEntity : 存放数据库表实体
EntityMap :用于grpc通信实体与数据库实体之间相互转换的帮助类
GrpcEntity :存放grpc通信的参数实体,响应返回实体等;

4.demo启动演示

先启动服务端:
image
再启动客户端,如果客户端连上了服务端,效果如下
image

分别按指示输入:
image

服务端的数据库会新增people数据
image
image

到此,演示算成功,客户端与服务端成功通信,并且操作数据可以落库。
感兴趣的朋友可以访问我的gitee代码库:https://gitee.com/chenshibao/grpc-project

标签:Console,Grpc,41,WriteLine,new,server,服务端,客户端
From: https://www.cnblogs.com/chenshibao/p/18494490

相关文章

  • 20241022 校测T1 链链链(chain)题解
    Problem链链链chain你有一个长度为\(n\)的链,编号为\(i(1≤i<n)\)的边连接着结点\(i\)与\(i+1\)。每个结点\(i\)上有一个整数\(a_i\)。你需要做以下操作\(n−1\)次:•选择一条还未被断开的边,设其连接了点\(i\)与\(i+1\),将其断开。•断边后,对于所......
  • 20241023
    一、博主咨询沐白情绪主升华为半导体科技重组低空传媒其他沐白情绪主升核心长虹,长虹竞价加强,一致性的加速,当前的长虹定位从趋势核心转变为连板情绪核心,没有先手不太好追高,锚定长虹作为情绪标,去做后排康佳、创维的套利,而明天如果大科技延续分歧,长虹需要接受放量分......
  • 例题2.41
    例题2.41代码importpandasaspdimportnumpyasnpa=pd.DataFrame(np.random.randint(1,6,(5,3)),index=['a','b','c','d','e'],columns=['one','two','three'])a.loc['a&......
  • go grpc默认长连接
    google.golang.org/grpcv1.66.0conn,err:=grpc.NewClient("127.0.0.1:1000",grpc.WithTransportCredentials(insecure.NewCredentials()))启动后就会看到该连接。创建grpcclient,默认指定idleTimeout是30分钟。keepalive.ClientParametersTime表示建连多久之后,无grpc数......
  • 20241022每日一题洛谷P1223
    普及洛谷P1223接水问题有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小第一行为一个整数n,第二行n个整数,第i个整数Ti表示第i个人的接水时间Ti输出两行,第一行为一种平均时间最短的排队顺......
  • jsp高校毕业生就业信息管理系统k7241(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,企业,岗位信息,招聘信息,应聘信息,就业情况,就业协议,问题反馈,反馈回复开题报告内容一、项目背景面对日益严峻的高校毕业生就业形势,传统的人工就业......
  • 20241021 校测T1 致敬传奇捆绑测试题目(Perm) 题解
    题解:致敬传奇捆绑测试题目Perm来自不知道什么时候的回忆。给定正整数\(n\),一个\(1\simn\)的排列\(p\)是一个好排列,当且仅当使得对于任意\(1\lek<n\),都有\(\sum_{i=1}^kp_i>p_{k+1}\)。现在请你求出字典序第小的好排列\(p\)。\(1\len\le10^6\),\(1\lek\le......
  • P4198
    胶过,唐#include<bits/stdc++.h>usingnamespacestd;intn,m;doublea[100010];structnode{ doublemx; intlen;#definem(x)t[x].mx#definel(x)t[x].len}t[4*100010];voidpushup1(intx){ m(x)=max(m(x<<1),m(x<<1|1));}intpushup2(......
  • AbMole|Apilimod mesylate Apilimod甲磺酸盐(CAS号 870087-36-8;目录号M9418)
    Apilimodmesylate(STA5326mesylate,Apilimod甲磺酸盐)是Apilimod的甲磺酸盐形式,也是一种具有口服活性的IL-12/IL-23抑制剂,抑制IFN-γ/LPS刺激的人PBMC产生IL-12的IC50值为10nM。可用于难治性葡萄膜炎的相关研究。生物活性Apilimod甲磺酸盐是一种IL-12/IL-23抑制剂,抑制IFN-......
  • 用MySQL5.7的客户端连接MySQL8.0的服务端竟然报错,不是说好向下兼容吗?
    在默认条件下,用MySQL5.7的客户端连接MySQL8.0的服务端竟然报错,不是说好向下兼容吗?WHAT?报错如下:[root@node234~]#mysql-ushukuinfo-p'123456'-h172.16.1.223mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.ERROR2026(HY000):SSLconn......