首页 > 其他分享 >Protocol Buffer命名空间冲突

Protocol Buffer命名空间冲突

时间:2023-07-24 15:35:13浏览次数:29  
标签:Protocol proto Buffer 冲突 Go 名称

原文在这里

什么是Protocol Buffer命名空间冲突?

所有链接到Go二进制文件的Protocol Buffer声明都被插入到一个全局注册表中。

每个Protocol Buffer声明(例如,枚举、枚举值或消息)都有一个绝对名称,该名称是包名称与.proto源文件中声明的相对名称的连接(例如,my.proto.package.MyMessage.NestedMessage)。Protocol Buffer语言假设所有声明都是普遍唯一的。

如果链接到Go二进制文件的两个Protocol Buffer声明具有相同的名称,那么这将导致命名空间冲突,注册表无法通过名称正确解析该声明。根据使用的Go protobuf版本不同,这可能会在初始化时引发panic,或者静默地忽略冲突,并在运行时可能导致潜在的错误。

如何解决Protocol Buffer命名空间冲突?

解决命名空间冲突的最佳方法取决于冲突发生的原因。

常见的命名空间冲突原因有:

  1. 存在vendored(供应商)的.proto文件。当一个单独的.proto文件被生成为两个或更多的Go包,并且链接到同一个Go二进制文件时,会在生成的Go包中的每个Protocol Buffer声明上发生冲突。这通常发生在一个.proto文件被vendored,并且从它生成了一个Go包,或者生成的Go包本身被vendored。用户应避免vendored,而是依赖于集中化的Go包来使用该.proto文件。

  2. 如果一个.proto文件由外部组织拥有,并且缺少go_package选项,则应与该.proto文件的所有者协调,以指定一个集中化的Go包,所有用户都可以依赖。

  3. 缺失或使用过于通用的proto包名称。如果一个.proto文件没有指定包名称或使用过于通用的包名称(例如,“my_service”),那么该文件内部的声明很可能与宇宙中的其他声明发生冲突。我们建议每个.proto文件都有一个包名称,该名称是经过深思熟虑选择的,具有普遍唯一性(例如,以公司名称为前缀)。

警告: 在.proto文件上后期更改包名称可能会导致使用扩展字段或存储在google.protobuf.Any中的消息停止正常工作。

从google.golang.org/protobuf模块的v1.26.0版本开始,当启动一个Go程序时,如果链接到其中多个冲突的Protocol Buffer名称,将报告一个严重错误。虽然最好是修复冲突的源头,但可以通过以下两种方式立即解决致命错误:

  • 在编译时设置。可以在编译时通过链接器初始化的变量来指定处理冲突的默认行为:go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn"
  • 在程序执行时设置。可以通过环境变量来设置处理冲突的行为,当执行特定的Go二进制文件时:GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


标签:Protocol,proto,Buffer,冲突,Go,名称
From: https://www.cnblogs.com/lianshuiwuyi/p/17577352.html

相关文章

  • 【后端面经-Java】String与StringBuffer与StringBuilder的比较
    目录1.String2.StringBuffer3.StringBuilder4.性能提升5.总结和比较面试模拟参考资料1.String不可变查看String源码如下:publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{/**Thevalueisusedforcharacterstora......
  • [SWPUCTF 2021 新生赛]PseudoProtocols
    [SWPUCTF2021新生赛]PseudoProtocols题目来源:nssctf题目类型:web涉及考点:PHP伪协议1.先看题目,给了一个提示要我们找hint.php,我们直接修改url:http://node2.anna.nssctf.cn:28069/hint.php发现页面空白无回显,这时候想到了使用PHP伪协议让其base64编码输出:http://node2.ann......
  • MySql —— Buffer Pool
    有了缓冲池后:当读取数据时,如果数据存在于BufferPool中,客户端就会直接读取BufferPool中的数据,否则再去磁盘中读取。当修改数据时,首先是修改BufferPool中数据所在的页,然后将其页设置为脏页,最后由后台线程将脏页写入到磁盘。 BufferPool有多大?BufferPool是在M......
  • springboot启动依赖冲突(log4j2)
    报错示例:LoggerFactoryisnotaLogbackLoggerContextbutLogbackison1.解决方案:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><......
  • mysql redo_log_buffer_size
    MySQLredo_log_buffer_size详解在MySQL中,redolog是一种用于保证数据持久性的机制。当我们进行数据修改时,MySQL会将这些修改操作记录到redolog中,以便在系统崩溃或重启后,可以使用redolog来恢复数据的一致性。redolog的大小对于系统的性能和可靠性都有着重要的影响,本文将详细介......
  • 【补充】路由冲突问题
    【补充】路由冲突问题在某些情况下,我们可能需要用到正则表达式去匹配我们的路由但是由于这种方法第一个参数是正则表达式所以当路由特别多的时候,可能会出现被顶替的情况解决方式修改正则表达式调整路由位置推荐根据功能的不同划分出不同的接口api采用路由......
  • SLF4J: Class path contains multiple SLF4J bindings报错,logback-classic.jar与slf4j
    1.问题:控制台一直报错: 1SLF4J:ClasspathcontainsmultipleSLF4Jbindings.2SLF4J:Foundbindingin[jar:file:/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]3SLF4J:Foundbindingin[jar:file:/slf4j/slf4j-log......
  • __use_no_semihosting 与调用C库函数冲突
    在已经移植freetype代码(使用了大量的C库函数)中,将printf硬件重定向到串口后,#pragmaimport(__use_no_semihosting_swi)与调用C库函数冲突,错误如下:ERROR:L6915E:Libraryreportserror:__use_no_semihosting_swiwasrequested,but_sys_openwasreferenced勾选Options->Target......
  • android studio Using insecure protocols with repositories, without explicit
    如何解决"androidstudioUsinginsecureprotocolswithrepositories,withoutexplicit"的问题简介在使用AndroidStudio开发过程中,我们可能会遇到"Usinginsecureprotocolswithrepositories,withoutexplicit"的问题。这个问题通常是由于AndroidStudio的默认配......
  • node.js中的buffer.write方法使用说明
    这篇文章主要介绍了node.js中的buffer.write方法使用说明,本文介绍了buffer.write的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下方法说明:将string使用指定的encoding写入到buffer的offset处。返回写入了多少个八进制字节。如果Buffer没有足够的空间来适应......