IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> grpc 报错 rpc: the client connection is closing -> 正文阅读

[网络协议]grpc 报错 rpc: the client connection is closing

grpc 报错 rpc: the client connection is closing

第一次写golang微服务,也是第一次接触gprc,底层原理还不太了解,盲猜跟openFeign差不多生成代理类,但grpc好像专门开放了端口,用protobuf协议传输

项目用kratos框架,在服务A走grpc调用服务B后报错
在这里插入图片描述

code = Canceled desc = grpc: the client connection is closing

看报错原因是客户端连接关闭了,注册中心使用的nacos,服务发现完全按照kratos官方提供的代码实例,data层服务注册、服务发现代码如下:

func NewNacosServer(rg *conf.Registry) registry.Registrar {
	sc := []constant.ServerConfig{
		*constant.NewServerConfig(rg.Nacos.Address, rg.Nacos.Port),
	}

	client, err2 := clients.NewNamingClient(vo.NacosClientParam{ServerConfigs: sc})

	if err2 != nil {
		panic(err2)
	}

	r := nacos.New(client)
	return r
}

func NewDiscovery(conf *conf.Registry) registry.Discovery {

	sc := []constant.ServerConfig{
		*constant.NewServerConfig(conf.Nacos.Address, conf.Nacos.Port),
	}

	cc := constant.ClientConfig{
		NamespaceId: "public",
	}
	client, err := clients.NewNamingClient(
		vo.NacosClientParam{
			ClientConfig:  &cc,
			ServerConfigs: sc,
		},
	)

	if err != nil {
		panic(err)
	}

	return nacos.New(client)
}

func NewSocialClient(discovery registry.Discovery) v1.SocialClient {
	conn, err := grpc.DialInsecure(
		context.Background(),
		grpc.WithEndpoint("discovery:///social.grpc"),
		grpc.WithDiscovery(discovery),
		grpc.WithMiddleware(
			recovery.Recovery(),
		),
	)
	if err != nil {
		panic(err)
	}
	/**
	* 原因就在这
	*/
	defer conn.Close()
	
	client := v1.NewSocialClient(conn)
	return client
}

原因在于:

官方文档中的实例,main function中使用了defer()关闭连接,在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行。
由于创建grpc客户端最终归属wireApp(),(依赖倒置实现解耦),在function main()中已经返回,就会执行NewSocialClient中的defer()将连接关闭,导致调用失败

关于defer、panic、recover

解决方法:
将NewSocialClient 中的defer conn.Close()删除,即可解决
在这里插入图片描述

可能真正开发中有最佳实践,这个是我个人的项目,参考stackoverflow

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 13:08:02  更:2022-10-17 13:08:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:48:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码