Loading...
Searching...
No Matches
userver

userver is the modern open source asynchronous framework with a rich set of abstractions for fast and comfortable creation of C++ microservices, services and utilities.

How It Works

The problem of efficient I/O interactions is solved transparently for the developers

πŸ™ userver
 std::size_t Ins(storages::postgres::Transaction& tr, std::string_view key) { auto res = tr.Execute("INSERT INTO keys VALUES ($1)", key); return res.RowsAffected(); }
Classic C++
template <class OnSuccess> void Ins(storages::postgres::Transaction& tr, std::string_view key, OnSuccess&& on_success) { tr.Execute("INSERT INTO keys VALUES ($1)", key, [on_success = std::forward<OnSuccess>(on_success)] (const auto& res, const auto& error) { if (error) { report_error(error); return; } on_success(res.RowsAffected()); } ); }

Values of userver

Technologies for debugging and memory profiling a running production service

Write your first toy C++ service, evolve it into a production ready service.

Efficient asynchronous drivers for databases (MongoDB, PostgreSQL, MySQL/MariaDB, Valkey, Redis, ClickHouse, YDB, SQLite ...) and data transfer protocols (HTTP, WebSockets, gRPC, TCP, AMQP-0.9.1, Apache Kafka, ...), tasks construction and cancellation.

Functionality to change the service configuration on-the-fly. Adjust options of the deadline propagation, timeouts, congestion-control without a restart.

Rich set of high-level components for caches, tasks, distributed locking, logging, tracing, statistics, metrics, JSON/YAML/BSON.

Comprehensive set of asynchronous low-level synchronization primitives and OS abstractions.

Service Example

Simple πŸ™ userver service that handles HTTP requests to "/kv" URL and responds with a key from database

 #include <userver/easy.hpp> #include "schemas/key_value.hpp" int main(int argc, char* argv[]) { using namespace userver; easy::HttpWith<easy::PgDep>(argc, argv) // Handles multiple HTTP requests to `/kv` URL concurrently .Get("/kv", [](formats::json::Value request_json, const easy::PgDep& dep) { // JSON parser and serializer are generated from JSON schema by userver auto key = request_json.As<schemas::KeyRequest>().key; // Asynchronous execution of the SQL query in transaction. Current thread // handles other requests while the response from the DB is being received: auto res = dep.pg().Execute( storages::postgres::ClusterHostType::kSlave, // Query is converted into a prepared statement. Subsequent requests // send only parameters in a binary form and meta information is // discarded on the DB side, significantly saving network bandwidth. "SELECT value FROM key_value_table WHERE key=$1", key ); schemas::KeyValue response{key, res[0][0].As<std::string>()}; return formats::json::ValueBuilder{response}.ExtractValue(); }); }

Brands and companies using userver

2GIS, T-Bank and others...