建议收藏,牛人都在疯传的C 开源项目

发布于:2023-06-30 12:00:37

大家好,我是柠檬哥,专注编程知识分享。

欢迎关注@程序员柠檬橙,编程路上不迷路

很多粉丝问的是后台开发方向的C++开源项目,今天我们就聊聊这方面的

大部分人都有 C++经验了,那应该可以看懂一些大中型C++项目源码,所以我推荐的项目有小型的也有大型成熟的,但是都是C++后台开发相关的项目。

项目涉及后台开发组件包括:网络库、RPC框架、数据库、配置文件处理、消息队列、序列化等等

话不多说,我们开始吧。下面这个项目,我最先推荐。

Google开源代码规范

我们学习开源项目源码,但是自己写代码的时候,良好的代码规范也必不可少,这方面可以参考Google 开源代码规范。

C++ 是 Google 大部分开源项目的主要编程语言,正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免地导致它走向复杂,使代码更容易产生 bug,难以阅读和维护。

本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 也能高效使用 C++ 的语言特性.

这个代码规范的PDF文档,已经有人已经在评论区给出。

项目主页

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树的核心思想就是放弃部分读的性能,换取最大的写入能力.

关于LevelDb 详细内容学习可参考教程:

https://kevins.pro/leveldb_chinese_doc.html

https://leveldb-handbook.readthedocs.io/zh/latest/basic.html

文件解析器

在后台项目中需要经常处理配置文件解析工作,这些配置文件可以是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。

消息队列

后端开发常用到消息队列,消息队列是分布式系统中重要的组件,主要解决了应用耦合、异步处理、流量削锋等问题。

消息队列在实际应用中包括如下四个场景:

应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

消息队列详细介绍参考:

https://cloud.tencent.com/developer/article/1006035

业界有名的 zeromq 核心代码也是用 C++ 编写,如果想深入研究消息队列,可以从这入手试试,下面给出项目主页和门户网站。

https://zeromq.org/

https://github.com/zeromq/libzmq

序列化

序列化: 将数据结构或对象转换成二进制串的过程反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

数据结构、对象与二进制串

不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同。

数据结构和对象:对于类似Java这种完全面向对象的语言,工程师所操作的一切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的类。而在C++这种半面向对象的语言中,数据结构和struct对应,对象和class对应。

二进制串:序列化所生成的二进制串指的是存储在内存中的一块数据。C++语言具有内存操作符,所以二进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,因为其本质上就是以’\0’结尾的存储在内存中的二进制串。在Java语言里面,二进制串的概念容易和String混淆。实际上String 是Java的一等公民,是一种特殊对象(Object)。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。二进制串在Java里面所指的是byte[],byte是Java的8中原生数据类型之一(Primitive data types)。

序列化参考链接:

https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html

Protobuf

Protocol Buffer (简称Protobuf) 是Google 出品的性能优异、跨语言、跨平台的序列化库。

项目主页https://github.com/protocolbuffers/protobuf

教程参考:Protobuf 终*教程

RPC

RPC (Remote Procedure Call)远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,RPC允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC框架为你屏蔽了底层实现。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过「发送请求-接受回应」进行信息交互的系统。

推荐几个RPC开源项目,供学习研究,先从简单的玩具项目入手

rest_rpc

https://github.com/qicosmos/rest_rpc

c++11, high performance, cross platform, easy to use rpc framework.

Its so easy to love RPC.

Modern C++开发的RPC库就是这么简单好用!

rest_rpc是一个高性能、易用、跨平台、header only的c++11 rpc库,它的目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。 可以快速上手,使用者只需要关注自己的业务逻辑即可。

再介绍几个业内成熟的后台开发RPC框架:

谷歌gRPC

谷歌开源的高性能远程过程调用系统。

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法

项目主页

https://github.com/grpc/grpc

百度brpc

百度内最常使用的工业级RPC框架, 有1,000,000+个实例(不包含client)和上千种多种服务。"brpc"的含义是"better RPC"。

你可以使用它:

搭建能在一个端口支持多协议的服务, 或访问各种服务restful http/https, h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议.redis和memcached, 线程安全,比官方client更方便。rtmp/flv/hls, 可用于搭建流媒体服务.hadoop_rpc(可能开源)支持rdma(即将开源)支持thrift , 线程安全,比官方client更方便各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议.基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源。Server能同步或异步处理请求。Client支持同步、异步、半同步,或使用组合channels简化复杂的分库或并发访问。通过http界面调试服务, 使用cpu, heap, contention profilers.获得更好的延时和吞吐.把你组织中使用的协议快速地加入brpc,或定制各类组件, 包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)

项目主页:apache/incubator-brpc

腾讯tars

腾讯开源的RPC框架

TARS是Linux基金会的开源项目,它是基于名字服务使用TARS协议的高性能RPC开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。

TARS是腾讯从2008年到今天一直在使用的后台逻辑层的统一应用框架,覆盖腾讯100多个产品。目前支持C++,Java,PHP,Nodejs,Go语言。该框架为用户提供了涉及到开发、运维、以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。 它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。

目前该框架在腾讯内部,各大核心业务都在使用,颇受欢迎,基于该框架部署运行的服务节点规模达到上万个。

TARS-CPP项目主页

https://github.com/TarsCloud/TarsCpp

搜狗srpc

这是搜狗自研的RPC系统,主要功能和特点:

这是一个基于Sogou C++ Workflow的项目,兼具:高性能低开发和接入门槛完美兼容workflow的串并联任务流对于已有pb/thrift描述文件的项目,可以做到一键迁移支持多种IDL格式,包括:ProtobufThrift支持多种数据布局,使用上完全透明,包括:Protobuffer serializeThrift Binary serializejson serialize支持多种压缩,使用上完全透明,包括:gzipzlibsnappylz4支持多种通信协议,使用上完全透明,包括:tcphttpsctpsslhttps用户可以通过http+json实现跨语言:如果自己是server提供方,用任何语言的http server接受post请求,解析若干http header即可如果自己是client调用方,用任何语言的http client发送post请求,添加若干http header即可内置了可以与其他RPC框架的server/client无缝互通的client/server,包括:BPRCThrift Framed BinaryThrift 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++视频教程?87 赞同 · 0 评论回答

C 语言练手项目

C++和 C 语言有很大联系,但又有很大区别,很多同学是从 C语言入门的编程,之后再转向面向对象的 C++ 开发,如果你学 C++ 之前没有 C 语言基础,或者你正在学习 C 语言,我也给你找了 21 个适合 C 语言练手的项目。这些小项目做完,基本算是掌握 C 语言绰绰有余的。

有什么好的C语言小项目适合刚学C语言的小白吗?2 赞同 · 0 评论回答

加个餐

上面推荐的开源项目,有些用到了现代C++特性,你可能会在项目源码中看到C++1x甚至更现代的C++20语法,不要慌,参考下面这个11.7K star 的现代C++教程项目快速上手:

这是一本现代C++快速上手电子书,目标读者:

本书假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。换句话说,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解现代 C++ 特性的人非常适合阅读本书;本书一定程度上介绍了一些现代 C++ 的黑魔法,但这些魔法毕竟有限,不适合希望进阶学习现代 C++ 的读者,本书的定位系现代 C++ 的快速上手。当然,希望进阶学习的读者可以使用本书来回顾并检验自己对 现代 C++ 的熟悉度。

项目主页

https://github.com/changkun/modern-cpp-tutorial

除了利用优秀开源项目学习之外,最务实的学习方式就是看书!我从事软件行业这么些年,开始也有迷茫不知方向,也不懂要看啥书学些什么内容,为了避免这样的问题,我整理了程序员进阶书单,让你少走些弯路。

附带了一份我整理的 C++ 电子书合集:C++ 必读书籍推荐(含下载方式)

另外,除了开源项目以外,还可以尝试用C++去牛客或者LeetCode上刷算法题,既能锻炼算法能力(现在大厂面试几乎必考算法),又能提高C++使用熟练度

算法可以说是计算机专业学习的一座大山,翻过去,海阔天空。我曾经也在刷LeetCode 算法的时候非常苦恼,做了好几次的题目再来刷也毫无头绪,差点被劝退,后来我找到了算法套路,就像打通 任督二脉一样,神清气爽!在下面这个回答中,我把自己这几年算法的刷题经验,毫无保留的分享给你:

分享我参考的这本谷歌大神找工作时写的算法刷题笔记,感兴趣的童鞋可以通过下面的渠道获取:

私信发送 1024 打包下载10个G编程资源学习资料

私信发送 001 获取阿里大神LeetCode 刷题笔记

私信发送 002 获取获取谷歌公司编程代码规范

私信发送 003 获取10个精美简历模板PDF和Word版

私信发送 004 获取100道精选 C++ 面试题和答案word版

私信发送 005 获取获取谷歌LeetCode算法笔记


免责声明:本站所有内容及图片均采集来源于网络,并无商业使用,如若侵权请联系删除。

上一篇:还有什么正规竞赛可以参加?分享一波最实用的编程类书籍

下一篇:变废为宝 让闲置书籍流动

资讯 观察行业视觉,用专业的角度,讲出你们的心声。
MORE

I NEED TO BUILD WEBSITE

我需要建站

*请认真填写需求信息,我们会在24小时内与您取得联系。