Protobuf 学习手册——编码篇
一、编码规范
Google 官方提供了 Protobuf 的编码规范,通过遵循这些规范,可以使 Protobuf 消息定义及其相应的类保持一致并易于阅读。
Protobuf 编码规范可能随着时间推移而发生变化,对于既有项目,应当保持编码规范的一致性,而不需盲目保持最新的编码规范。但是对于全新项目,应当遵循官方的编码规范,可以点击这里查阅官方最新的编码规范。
1.1 Override
一行不超过 80 个字符
两个空格缩进
1.2 文件结构
文件名采用下划线分割命名,形如: lower_snake_case.proto。所有 .proto 文件应当遵循以下规范:
License 头(如果需要的话)
文件综述
Syntax
Package
Imports (排好序的)
File options
一切其他的东西
1.3 Package
包名应当小写,且应当对应于目录结构。例如文件位于 my/package/ 目录, 那么 package 应该是 my.package。
对于 Java 应用,我们更习惯于使用 option java_package,很少使用 package。 ...
Protobuf 学习手册——语法篇
一、Override
Protobuf[1] 是一种语言中立、平台无关、可扩展的序列化数据的格式,可用于通信协议,数据存储等。
ProtoBuf 在序列化数据方面,它是灵活的、高效的。相比于 XML 来说,ProtoBuf 更加小巧、更加快速、更加简单。一旦定义了要处理的数据的数据结构之后,就可以利用 ProtoBuf 的代码生成工具生成相关的代码。甚至可以在无需重新部署程序的情况下更新数据结构。只需使用 ProtoBuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
ProtoBuf 很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
1.1 为什么要发明 Protobuf
大家可能会觉得 Google 发明 ProtoBuf 是为了解决序列化速度的,其实真实的原因并不是这样的。
ProtoBuf 最先开始是 Google 用来解决索引服务器 request/response 协议的。没有 ProtoBuf 之前,google 已经存在了一种 request/r ...
Protobuf 在 Java 中的入门实例
Protobuf[1] 是一种语言中立、平台无关、可扩展的序列化数据的格式,可用于通信协议,数据存储等。
本文将演示在 Java 语言中如何编写一个 Protobuf 的入级程序,也许你可能并不了解 Protobuf,这没有关系,基于 Protobuf 官方文档的衍生博文已经安排上了,只是限于内容较多,我正在一点点写作中,让我们先来简单实战吧!
注: 本文及后续所有关于 Protobuf 相关文章均采用 Protobuf3 版本,具体为 Protobuf 3.11.0。
一、插件
2021.3 及以后版本2021.3 以前版本自 IDEA 2021.3 起,增加了对 Protobuf 和 gRPC 的原生插件支持,不需要再额外安装插件。
插件市场中搜索并安装 Protobuf Support,或下载离线插件包手动安装: https://plugins.jetbrains.com/plugin/8277-protobuf-support/ 。
创建一个空的 Maven 工程。借助于 Protobuf Maven 插件的功劳,使我们不必在本地搭建 Protobuf 环境。直接编辑 Po ...
Google Jib 容器化构建工具
一、前言
随着近些年的技术发展,Java 领域微服务已经成为主流的技术方向。随着微服务化,云原生的概念也逐渐火热起来,不了解云原生仿佛就是一个原始人。而在云原生中,应用容器化 是其核心属性之一。
应用容器化,用抽象的话来说就是:将软件容器中的应用程序和进程作为独立的应用程序部署单元运行,并作为实现高级别资源隔离的机制。从总体上改进开发者的体验、促进代码和组件重用,而且要为云原生应用简化运维工作。通俗点说,就是借助于 Docker 等容器化技术,将一个个的微服务打包成镜像,在容器中独立部署运行。
二、背景
我司目前采用的是基于 GitLab + Jenkins + Rancher 这套 CI/DI 体系。在这套体系中微服务的容器化依赖于 Jenkins 去实现。现在假设我们有一个项目,其组织结构如下:
1234parentPro |-- moduleA |-- moduleB |-- rest [rest 模块为 spring boot 启动入口,并依赖 moduleA、moduleB]
对于 SpringBoot 项目,Maven 的默认构建工具是 Spri ...
Disruptor 官方文档——入门
一、Getting the Disruptor
Disruptor jar 包可以从 maven 仓库 Maven Central 获取。
12345<dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version></dependency>
二、Basic Event Produce and Consume
为了学习 Disruptor 的使用,这里以非常简单的例子入手:生产者生产单个 long 型 value 传递给消费者。为了简化消费者逻辑,这里只打印消费的 value。
首先定义携带数据的 Event:
1234567public class LongEvent { private long value; public void set(long value) { this.value = va ...
Disruptor 官方文档——介绍
理解 Disruptor 是什么最好方式就是将其与现有的比较好理解的东西比较 。Disruptor 就相当于 Java 中 BlockingQueue。同队列一样,Disruptor 用于在不同的线程之间进行数据交互,然而 Disruptor 也提供了一些关键的不同于队列的特性,如:
广播事件至消费者,并且能遵循消费者依赖关系
预分配用于存储事件内容的内存空间
针对极高的性能目标而实现的极度优化和无锁的设计
一、核心概念 Core Concepts
在理解 Disruptor 如何工作之前,定义一些普遍存在于文档和源代码中的术语,对于倾向 DDD 的人而言,它们就是 Disruptor 领域的无处不在的语言。
1.1 核心组件
1.1.1 Disruptor
持有 RingBuffer、消费者线程池 Executor、消费者集合 CounsumerRepository 等引用。
1.1.2 RingBuffer 环形缓冲
RingBuffer 在 3.0 版本之前被认为是 Disruptor 的主要概念。但从 Diruptor 3.0 开始,RingBuffer 只负责存储 ...
Disruptor: 一种高性能的、在并发线程间数据交换领域用于替换有界限队列的方案
一、摘要
LMAX 计划创建一个高性能的财务交易系统。作为我们工作的一部分,我们评估了多种方案去设计这个系统以求达到高性能目标,最后我们发现在传统的解决方案中遇到了基础上的瓶颈。
许多应用程序通过队列来在不同的处理阶段之间交换数据。我们的性能测试显示,如果按照传统的方式来使用队列,延时代价的量级和磁盘 IO 操作的延时量级是同一个量级——非常慢。如果在端到端的操作中采用多个队列,又会增加了几百个毫秒的额外开销【注:用于协调这些队列】。这里有很大的优化空间。
通过进一步研究和调研计算机科学,我们意识到传统方案(如:队列和处理节点)耦合了多个关注点,从而带来了多线程之间的资源争抢,表明可能有更好的方法。
结合现代 CPU 的工作原理,也就是我们常说的“机制共鸣”(mechanical sympathy)【注:意为参考现代 CPU 的设计思想,顺应底层设计思路,来做上层的应用设计,以便使用底层设计的优势,从而达到一个最佳的设计结果,得到一个‘共鸣’】,通过隔离关注,我们提出了一个数据结构和基于该数据结构的模式,这就是 Disruptor。
测试结果显示,对于一个三阶段的任务管道,Disru ...
为什么阿里巴巴要禁用 Executors 创建线程池?
一、写在前面
通过阅读本篇文章你将了解到:
线程池的定义
Executors 创建线程池的几种方式
ThreadPoolExecutor 对象
线程池执行任务逻辑和线程池参数的关系
Executors 创建返回 ThreadPoolExecutor 对象
OOM 异常测试
如何定义线程池参数
二、线程池的定义
管理一组工作线程。通过线程池复用线程有以下几点优点:
减少资源创建 => 减少内存开销,创建线程占用内存
降低系统开销 => 创建线程需要时间,会延迟处理的请求
提高稳定稳定性 => 避免无限创建线程引起的 OOM(OutOfMemoryError)
三、Executors 创建线程池的方式
根据返回的对象类型创建线程池可以分为三类:
创建返回 ThreadPoolExecutor 对象
创建返回 ScheduleThreadPoolExecutor 对象
创建返回 ForkJoinPool 对象
本文只讨论创建返回 ThreadPoolExecutor 对象。
四、ThreadPoolExecutor 对象
在介绍 Executors 创建 ...
解决 Git Revert 后再次 Merge 代码丢失问题
一、问题场景
我司使用 GitLab 进行代码管理,当我对系统进行 SpringBoot 2.0 的版本升级,分支已经 Merge 到 Master 分支。实际部署中发现依赖的某个二方包的子依赖未做升级,导致某个服务无法掉通。由于二方包的修复需要时间,为了不影响后续其他功能的发布,因此决定对 Master 分支进行 Revert。
等到第二天,当修复了那个二方包问题后,重新提了 Merge 申请,却发现提交变动只有对二方包的变动,其他的代码变动都没有了。
二、问题复现
下面模拟复现下这个问题,我创建了一个全新的项目。在 Master 分支做了首次提交,提交内容为:
1First Commit From Master
然后创建一个新分支 dev,在提交内容后面追加了以下内容:
1Second Commit From Dev
将 dev 分支 merge 到 master 分支,此时 master 分支内容如下:
123First Commit From MasterSecond Commit From Dev
此时我觉得 dev 分支还没有修改完毕,想要 revert 后重新提交 ...
IDEA 2019激活教程
重要: IDEA是一款十分强大的 JAVA 开发IDE,如果有经济基础,请一定要支持正版。
一、官方途径
1.1 EDU 邮箱
使用教育邮箱(学生 or 老师)可以免费使用(每一年申请一次),参考文章学生授权申请方式。注册成功后,登陆Jertbrains可以看见到期时间。
1.2 初创公司
IDEA 对初创公司提供五折折扣,参考:初创计划申请表
二、激活码
注意,使用激活码方式激活,不需要修改 host 文件,请检查 host 文件并确保以下内容不存在:
120.0.0.0 account.jetbrains.com0.0.0.0 www.jetbrains.com
2.1 lookdiv.com
测试版本:IntelliJ IDEA 2019.2.4 (Ultimate Edition)
测试时间:2019-11-25
STEP 1 : 访问 lookdiv,填入钥匙:lookdiv.com。
STEP 2 : 点击获取激活码按钮,将弹窗内容复制下来,去掉最后的注释部分。
STEP 3 : 保持正常的网络连接,打开 IDEA,将内容粘到 Active Code 中 ...