What's new in Dubbo-go-hessian2 v1.6.0
What's new in Dubbo-go-hessian2 v1.6.0
发版人:望哥
1. 增加缓存优化
dubbo-go-hessian2 在解析数据的数据大量使用到了 struct 的结构信息,这部分信息可以缓存起来反复利用,使得性能提升了一倍。优化过程记录可以详细阅读《记一次对 dubbo-go-hessian2 的性能优化》.
2. string 解析性能优化
由于 hessian ( dubbo 序列化协议,下称:hessian )对 string 的定义是16 bit 的 unicode 的 UTF-8 表示形式,字符长度表示是16 bit 的字符数。这是仅针对 java 制定的规范,java 中一个字符是16 bit,对应到 UTF-16. hessian 库也是对每一个字符进行转码序列化。但 golang 里面字符是和 UTF-8 对应的,dubbo-go-hessian2 里面的 rune 是 32bit,和 unicode一一映射。对于 U+10000 ~ U+10FFFF 的字符,需按照 UTF16 的规范,将字符转换为 2 个字节的代理字符,再做转换,才能和 java 的序列化方式对应起来。
原来不管是编码还是解析都是一个字符一个字符处理,特别是解析的时候,从流里面一个字节一个字节读取并组装成 rune,然后再转换为 string,这样效率特别低。我们的优化方案是,批次读取字节流到 buffer 中,对 buffer 进行解析转为 UTF-8 数组,并统计字符数量。其中需要对代理对字符将其转换为标准 UTF-8 子节数组。如果统计的字符数量不足,再进一步读取流种的数据进行解析。通过此方式提升一倍的解析效率。
对应 pr #188,作者 zonghaishang。
3. 解析忽略不存在的字段
hessian 库在解析数据的时候,对于一个 class 字段,如果不存在,则直接忽略掉。但 v1.6.0 版本之前 dubbo-go-hessian2 解析数据,如果遇到不存在的字段,会返回 error。从 v1.6.0 开始,与 hessian 一样,忽略不存在的字段。因为这是一个特性的变更,所以升级的同学一定要注意了。
对应 pr #201,作者 micln & fangyincheng。
4. 解决浮点数精度丢失问题
在对 float32 类型进行序列化时,我们一律强制转换为 float64 再进行序列化操作。由于浮点数的精度问题,在这个转换过程中可能出现小数点后出现多余的尾数,例如 (float32)99.8-->(float64)99.80000305175781。
1.6.0 版本对 float32 的序列化进行了优化:
- 如果小数尾数小于 3 位,根据 hessian2 协议序列化为 double 32-bit 格式
- 否则先转换为 string 类型,再转换为 float64 类型,这样做可以避免由于浮点数精度问题产生多余的尾数,最后对 float64 进行序列化。
虽然对 float32 类型进行了优化,但是依然建议使用浮点数的时候优先使用 float64 类型。
对应 pr #196,作者 willson-chen。
5. 解决 attachment 空值丢失问题
dubbo 请求中包含 attachment 信息,之前如果 attachment 里面含有如 "key1":""
,这种 value 为空的情况,解析出来的结果会直接丢失这个属性 key1 ,v1.6.0 修复了此问题,现在解析出来的 attachment 会正确解析出空 value 的属性。
6. 支持 ‘继承’ 和忽略冗余字段
由于 go 没有继承的概念,所以在之前的版本,Java 父类的字段不被 dubbo-go-hessian2 所支持。新版本中,dubbo-go-hessian2 将Java来自父类的字段用匿名结构体对应,如:
type Dog struct { Animal Gender string DogName string `hessian:"-"` }
同时,就像 json 编码中通过 immediately 可以在序列化中忽略该字段,同理,通过 hessian:"-" 用户也可以让冗余字段不参与 hessian 序列化。
欢迎加入 dubbo-go 社区
钉钉群: 23331795
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
调查显示:超过30 %企业遭受过网络攻击,如何防范?
对对于企业来讲,屡禁不止的网络安全攻击始终是阻碍业务发展的重大隐患。调查结果显示,有近8成的企业将网络安全视为企业很重要的工作之一,另外,有超过三成的企业遭受过网络安全攻击。 企业作为网络安全事故的责任承担方,需要对信息泄漏造成的损失负责,去年因信息泄漏事件被罚款的企业不在少数,罚款之余,更难挽回的,是因为信息泄漏事件遭受创伤的无辜客户。 不仅如此,修复网络安全漏洞也是企业面临的头疼的问题。调查结果统计,有超过6成的企业都需要超过一天的时间来修复安全漏洞,只有7%的企业能够在一小时之内修复漏洞,暴露的时间过长,可以说是给了黑客“充裕”的作案时间,使得信息泄漏的影响程度更加严重。因而最好的解决措施,就是事前有效预防。建立强大的防御网络,才能帮助企业更好得避免损失。 移动互联网时代,是一个以软件为中心的世界,随之而来的是爆发式增长的网络安全事故,目前大多数企业都没有应对大规模漏洞的能力和修复计划,这也是当前背景下企业面临的重大隐患。 如何采取有效安全防护措施来减少网络安全攻击成为企业关心的问题之一。 保护数据安全,从HTTPS加密开始 网络安全威胁可能会从各个渠道渗透到互联网系统中,任何一...
- 下一篇
Spring Security 基于数据库的认证
介绍 之前使用的全是基于内存的认证,这里使用基于数据库的认证。 设计数据表 这里设计数据表 创建项目 这里使用Mybatis作为项目。 添加如下依赖 添加driud连接池依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.9</version> </dependency> 完整的pom如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果