我知乎竟然火了,新年牛气冲天!大量干货
共 6604字,需浏览 14分钟
·
2021-01-12 15:17
在看点击上方蓝色“后端技术学堂”关注后加个“星标”
最新文章不错过
阅读本文大概需要 7 分钟
新年快乐,我是柠檬哥。
上面的图片是我在腾讯大厦门口拍摄,很有节日氛围,看到我们的小企鹅了吗 HAPPY 牛 YEAR!新的一年一起牛气冲天~
今天来和大家分享的是一些C++相关的开源项目,这篇文章是我最近在知乎的一次分享,没想到成为了高赞回答,这个问题的原文是这样的:
问题到我写这篇文章的时间为止,一个星期时间,这个回答收获了 400+赞同和1100+收藏(现在应该更多),得到了这么多网友的认可,说明内容本身确实对大家有价值,那我觉得必须分享给公众号的读者朋友们。
还有读者直呼牛逼,我就喜欢这么直接的夸奖,哈哈
下面是我的回答原文:
目前从事的是 C++ 后台开发工作,虽然是个老问题了,但后面还会有很多同学看到,那我就来回答下吧,希望对你有点帮助。
图源hippopx CCOC++开源项目众多,题主问的是后台开发方向的项目,那范围就缩小了很多。
题主已经有两年 C++经验了,那应该可以看懂一些大中型C++项目源码,所以我推荐的项目有小型的也有大型成熟的,但是都是C++后台开发相关的项目。
项目涉及后台开发组件包括:网络库、RPC框架、数据库、配置文件处理、消息队列、序列化等等
后台开发学习路线可以参考(点击查看):干货:21 张思维导图,柠檬哥肝了半个月的「后端技术学习路线」长啥样?
话不多说,我们开始吧。下面这个项目,我想最先推荐。
Google开源代码规范
我们学习开源项目源码,但是自己写代码的时候,良好的代码规范也必不可少,这方面可以参考Google 开源代码规范。
C++ 是 Google 大部分开源项目的主要编程语言,正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug,难以阅读和维护。
本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 也能高效使用 C++ 的语言特性.
这个代码规范的PDF文档,在公众号后台回复「001」即可下载。
项目主页:https://github.com/zh-google-styleguide/zh-google-styleguide
数据库
cpp_redis
项目主页:https://github.com/Cylix/cpp_redis/
C++11 Lightweight Redis client: async, thread-safe, no dependency, pipelining, multi-platform
这是一个 C++11编写的轻量级 Redis 客户端,具有异步、线程安全、无依赖、pipelining、跨平台等特性。代码量不大,可以学习如何编写一个简洁高效的网络通信客户端程序,另外项目采用了C++11编写,通过这个开源项目,你还可以学习如何使用这些语言新特性。
LevelDb
项目主页https://github.com/google/leveldb
由 Google 的两位工程师 Sanjay Ghemawat 和 Jeff Dean 开发的键/值对(Key/Value Pair)嵌入式数据库,具有很高的随机写,顺序读/写性能,采用 LSM树 (Log Structured-Merge Tree)实现,LSM树的核心思想就是放弃部分读的性能,换取最大的写入能力.
文件解析器
在后台项目中需要经常处理配置文件解析工作,这些配置文件可以是XML、JSON或者是YAML等格式的标记语言文件,下面这几个项目就是几个不错的文件解析器,代码可读性好。
JSON处理
C++ JSON 解析器
JSON++ is a light-weight JSON parser, writer and reader written in C++. JSON++ can also convert JSON documents into lossless XML documents.
用C++写的轻量级 JSON 解析器,同时还可以将 jSON 文档转换成 XML 文档
项目主页:https://github.com/hjiang/jsonxx
迷你的C++11 JSON库
json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.
同样是是个mini JSON 库,仅 1个 CPP 文件和一个头文件,方便的嵌入到自己的项目中
项目主页:https://github.com/dropbox/json11
TinyXML
我们经常需要在项目中处理 XML 配置文件,有没有想过自己编写一个简单通过的XML解析器,这里就是一个用C++ 编写的,非常简单小巧的 XML 解析器,可以很容易地集成到其它项目中,出于C++学习目的的话,你也可以把代码下载下来学习练手。
项目主页: http://sourceforge.net/projects/tinyxml/
yaml-cpp
YAML 也是一种类似XML和JSON一样的配置文件语言,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),是专门用来写配置文件的语言,相比 JSON 更加简洁和方便阅读。
这个项目就是一个用cpp写的yaml文件解析器,项目代码量也不大,结构清晰,可以用作学习参考。
项目主页https://github.com/jbeder/yaml-cpp
如果说前面的是练手,那下面介绍的项目会高级一些。
下面会介绍几个 C++ 后台开发中,具有代表性的项目和开源框架,做后台开发,这些项目你或多或少会使用到,了解一些项目源码自然更好。
网络库
Muduo
https://github.com/chenshuo/muduo
说到开源网络库,就不得不提 muduo ,它是一个基于 Reactor 模式的现代 C++ 网络库,采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。
muduo 是知乎大神陈硕开发,基于 Reactor 模式,Redis和Java的Netty库也是采用这种模式实现,具有如下特点:采用非阻塞 IO 模型、基于事件驱动和回调,原生支持多核多线程。
学习 moduo 源码可以配合陈硕的《Linux多线程服务器端编程》,这本书以muduo 网络库为例,讲解这种编程模型的使用方法及注意事项,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。
消息队列
后端开发常用到消息队列,消息队列是分布式系统中重要的组件,主要解决了应用耦合、异步处理、流量削锋等问题。
消息队列在实际应用中包括如下四个场景:
- 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
- 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
- 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
- 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;
业界有名的 zeromq 核心代码也是用 C++ 编写,如果想深入研究消息队列,可以从这入手试试,下面给出项目主页和门户网站。
https://zeromq.org/
https://github.com/zeromq/libzmq
序列化
- 序列化:将数据结构或对象转换成二进制串的过程
- 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程
数据结构、对象与二进制串,不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。
Protobuf
Protocol Buffer (简称Protobuf) 是Google 出品的性能优异、跨语言、跨平台的序列化库。
项目主页:https://github.com/protocolbuffers/protobuf
教程参考:https://colobu.com/2019/10/03/protobuf-ultimate-tutorial-in-go/)
RPC
RPC (Remote Procedure Call)远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,RPC允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC框架为你屏蔽了底层实现。
RPC微服务入门看我这篇文章:
下面推荐几个RPC开源项目,供学习研究,先从简单的玩具项目入手:
rest_rpc
https://github.com/qicosmos/rest_rpc
c++11, high performance, cross platform, easy to use rpc framework.
It's so easy to love RPC.
Modern C++开发的RPC库就是这么简单好用!
rest_rpc是一个高性能、易用、跨平台、header only的c++11 rpc库,它的目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。可以快速上手,使用者只需要关注自己的业务逻辑即可。
再介绍几个业内成熟的后台开发RPC框架:
谷歌gRPC
谷歌开源的高性能远程过程调用系统。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法
img中文官方文档:https://doc.oschina.net/grpc?t=58008
项目主页:https://github.com/grpc/grpc
百度brpc
百度内最常使用的工业级RPC框架, 有1,000,000+个实例(不包含client)和上千种多种服务。"brpc"的含义是"better RPC"。
项目主页:apache/incubator-brpc
腾讯tars
腾讯开源的RPC框架
TARS是Linux基金会的开源项目,它是基于名字服务使用TARS协议的高性能RPC开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。
TARS是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,覆盖腾讯100多个产品。目前支持C++,Java,PHP,Nodejs,Go语言。
img目前该框架在腾讯内部,各大核心业务都在使用,颇受欢迎,基于该框架部署运行的服务节点规模达到上万个。
TARS-CPP项目主页:https://github.com/TarsCloud/TarsCpp
搜狗srpc
这是搜狗自研的RPC系统,主要功能和特点:
- 这是一个基于Sogou C++ Workflow的项目,兼具:
- 高性能
- 低开发和接入门槛
- 完美兼容workflow的串并联任务流
- 对于已有pb/thrift描述文件的项目,可以做到一键迁移
- 支持多种IDL格式,包括:
- Protobuf
- Thrift
- 支持多种数据布局,使用上完全透明,包括:
- Protobuffer serialize
- Thrift Binary serialize
- json serialize
- 支持多种压缩,使用上完全透明,包括:
- gzip
- zlib
- snappy
- lz4
- 支持多种通信协议,使用上完全透明,包括:
- tcp
- http
- sctp
- ssl
- https
- 用户可以通过http+json实现跨语言:
- 如果自己是server提供方,用任何语言的http server接受post请求,解析若干http header即可
- 如果自己是client调用方,用任何语言的http client发送post请求,添加若干http header即可
- 内置了可以与其他RPC框架的server/client无缝互通的client/server,包括:
- BPRC
- Thrift Framed Binary
- Thrift Http Binary
- 兼容workflow的使用方式:
- 提供创建任务的接口来创建一个rpc任务
- 可以把rpc任务放到任务流图中,回调函数里也可以拿到当前的任务流
- workflow所支持的其他功能,包括upstream、计算调度、异步文件IO等
项目主页:sogou/srpc
单元测试
Google Test
程序写的好,单元测试少不了。现在流行的软件开发模式「测试驱动开发」,学习使用单元测试保证代码健壮性,Google 的开源 C++ 单元测试框架 Google Test 也称为 gtest ,提供了丰富的断言和各类比较操作。
断言
gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。
而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。
项目主页: https://github.com/google/googletest/
加个餐
上面推荐的开源项目,有些用到了现代C++特性,你可能会在项目源码中看到C++1x甚至更现代的C++20语法,不要慌,参考下面这个11.7K star 的现代C++教程项目快速上手:
这是一本现代C++快速上手电子书,目标读者:
- 适合那些掌握传统C++并经常使用的人,想在短时间内迅速了解现代 C++ 特性的人非常适合阅读本书;
- 这本书定位是「现代 C++ 的快速上手」。如果你想进阶,也可以使用本书来回顾并检验自己对现代 C++ 的熟悉程度。
项目主页:https://github.com/changkun/modern-cpp-tutorial
想看我之前分享的其他优秀开源项目,在公众号后台回复「开源」即可查看。
以上就是今天的分享,还没关注我知乎的同学,可以点击文末「阅读全文」直达我知乎主页,来知乎和我做朋友。
·················END·················如果觉得文章不错,别忘了点个「在看」或「分享」给更多小伙伴~
我是柠檬哥,我们下期再见。
往期精选(点击可查看)
----------------------