yaLanTingLibs
A Collection of C++20 libraries, include struct_pack, struct_json, coro_rpc and async_simple
yaLanTingLibs is a collection of C++20 libraries, now it contains struct_pack, struct_json, coro_rpc and async_simple, more and more cool libraries will be added into yaLanTingLibs(such as http.) in the future.
The target of yaLanTingLibs: provide very easy and high performance C++20 libraries for C++ developers, it can help to quickly build high performance applications.
OS (Compiler Version) | Status |
---|---|
Ubuntu 22.04 (clang 14.0.0) | |
Ubuntu 22.04 (gcc 11.2.0) | |
macOS Monterey 12 (AppleClang 14.0.0.14000029) | |
Windows Server 2022 (MSVC 19.33.31630.0) |
coro_rpc
Very easy-to-use, coroutine-based, high performance rpc framework with C++20, more than 2000w qps in echo scene. coro_rpc is a header only library.
You can finish a rpc server and rpc client in 5 minutes!
English API(TODO) | 中文API
Talk of coro_rpc on purecpp conference.
Video on purecpp conference, start from 04:55:08 of the video record.
quick example
1.define a rpc function as a local normal function.
// rpc_service.hpp
inline std::string_view echo(std::string_view str) { return str; }
2.register rpc function and start a server
#include "rpc_service.hpp"
#include <coro_rpc/coro_rpc_server.hpp>
int main() {
coro_rpc_server server(/*thread_num =*/10, /*port =*/9000);
server.register_handler<echo>(); // register function echo
server.start(); // start the server & block
}
3.rpc client call rpc service
#include "rpc_service.hpp"
#include <coro_rpc/coro_rpc_client.hpp>
Lazy<void> test_client() {
coro_rpc_client client;
co_await client.connect("localhost", /*port =*/"9000"); // connect to the server
auto r = co_await client.call<echo>("hello coro_rpc"); // call remote function echo
std::cout << r.result.value() << "\n"; //will print "hello coro_rpc"
}
int main() {
syncAwait(test_client());
}
More examples here.
struct_pack
Based on compile-time reflection, very easy to use, high performance serialization library, struct_pack is a header only library, it is used by coro_rpc now.
Only one line code to finish serialization and deserialization, 10-50x faster than protobuf.
English API(TODO) | 中文API
(Slides) A Faster Serialization Library Based on Compile-time Reflection and C++ 20 of struct_pack on CppCon2022
Slides of struct_pack on purecpp conference.
(Video) A Faster Serialization Library Based on Compile-time Reflection and C++ 20 on cppcon2022
Video on purecpp conference, start from 01:32:20 of the video record.
quick example
struct person {
int64_t id;
std::string name;
int age;
double salary;
};
person person1{.id = 1, .name = "hello struct pack", .age = 20, .salary = 1024.42};
// one line code serialize
std::vector<char> buffer = struct_pack::serialize(person1);
// one line code deserialization
auto person2 = deserialize<person>(buffer);
See more examples here.
struct_json
reflection-based json lib, very easy to do struct to json and json to struct.
quick example
#include "struct_json/json_reader.h"
#include "struct_json/json_writer.h"
struct person {
std::string name;
int age;
};
REFLECTION(person, name, age);
int main() {
person p{.name = "tom", .age = 20};
std::string str;
struct_json::to_json(p, str); // {"name":"tom","age":20}
person p1;
struct_json::from_json(p1, str);
}
async_simple
A C++ 20 coroutine library offering simple, light-weight and easy-to-use components to write asynchronous codes. See async_simple
Quick Start
- clone repo
git clone https://github.com/alibaba/yalantinglibs.git
- build & install
cd yalantinglibs
mkdir build && cd build
cmake ..
# You can use those option to skip build unit-test & benchmark & example:
# cmake .. -DBUILD_EXAMPLES=OFF -DBUILD_BENCHMARK=OFF -DBUILD_UNIT_TESTS=OFF
make -j
make install
- run tests
cd tests
ctest .
- start your coding
coro_rpc
cd yalantinglibs/src/coro_rpc/examples/helloworld
mkdir build && cd build
cmake ..
make -j
# For more detail, see Cmakelist.txt in helloworld.
struct_pack
TODO
Benchmark
options:
./benchmark_client [threads] [client_pre_thread] [pipeline_size] [host] [port] [test_data_path] [test_time] [warm_up_time]
Build Options
option | description | default |
---|---|---|
CMAKE_BUILD_TYPE | build type | Release |
BUILD_WITH_LIBCXX | Build with libc++ | OFF |
BUILD_EXAMPLES | Build examples | ON |
BUILD_BENCHMARK | Build benchmark | ON |
BUILD_UNIT_TESTS | Build unit test | ON |
USE_CONAN | Use conan package manager to handle dependencies | OFF |
ENABLE_SSL | Enable ssl support | OFF |
ENABLE_IO_URING | Enable io_uring support | OFF |
Dependencies
We use doctest for unit test. All third-party dependencies are put in include/thirdparty.
coro_rpc
- struct_pack
- easylog
- asio
- openssl (optional)
struct_pack
No dependency.
struct_json
struct_pb
TODO
easylog
No dependency.
How to generate document
see Build Website
How to Contribute
- Create an issue in the issue template.
- Run tests and
git-clang-format HEAD^
locally for the change. - Create a PR, fill in the PR template.
- Choose one or more reviewers from contributors: (e.g., qicosmos, poor-circle, PikachuHyA).
- Get approved and merged.
Discussion group
DingTalk group
License
yaLanTingLibs is distributed under the Apache License (Version 2.0) This product contains various third-party components under other open-source licenses. See the NOTICE file for more information.