рд╕рд░рд▓ рдФрд░ рд╕реА ++ рдореЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ - рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛

Yandex.Taxi microservice рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛ рдЗрд╖реНрдЯрддрдо рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдордиреЗ C ++ 17 рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдврд╛рдВрдЪрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдХреИрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ microservice рдХреЛрдб рдЕрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ:

Response View::Handle(Request&& request, const Dependencies& dependencies) { auto cluster = dependencies.pg->GetCluster(); auto trx = cluster->Begin(storages::postgres::ClusterHostType::kMaster); const char* statement = "SELECT ok, baz FROM some WHERE id = $1 LIMIT 1"; auto row = psql::Execute(trx, statement, request.id)[0]; if (!row["ok"].As<bool>()) { LOG_DEBUG() << request.id << " is not OK of " << GetSomeInfoFromDb(); return Response400(); } psql::Execute(trx, queries::kUpdateRules, request.foo, request.bar); trx.Commit(); return Response200{row["baz"].As<std::string>()}; } 

рдФрд░ рдпрд╣рд╛рдВ рдХреНрдпреЛрдВ рдпрд╣ рдмреЗрд╣рдж рдкреНрд░рднрд╛рд╡реА рдФрд░ рддреЗрдЬ рд╣реИ - рд╣рдо рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдмрддрд╛рдПрдВрдЧреЗред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ


рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рди рдХреЗрд╡рд▓ рдЕрдиреБрднрд╡реА рд╕реА ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдкреНрд░рд╢рд┐рдХреНрд╖реБ, рдЬреВрдирд┐рдпрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдРрд╕реЗ рд▓реЛрдЧ рднреА рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реА ++ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрднреНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рд╡реЙрд▓реНрдпреВрдо рдФрд░ рд▓реЛрдб рдХреЗ рд╕рд╛рде, рд╣рдо рднреА рдЕрдХреНрд╖рдо рд░реВрдк рд╕реЗ рд▓реЛрд╣реЗ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрд╕ рдХреЛ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреА рдЬрд╛рддреА рд╣реИ: рдЕрдХреНрд╕рд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреНрдп рдорд┐рдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдирддреА рд╣реИред рдХреБрд╢рд▓ I / O рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде, рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рд╡рд╛рд╣ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмрдбрд╝рд╛ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ ... рдмрд╕ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдФрд░ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ:

 void View::Handle(Request&& request, const Dependencies& dependencies, Response response) { auto cluster = dependencies.pg->GetCluster(); cluster->Begin(storages::postgres::ClusterHostType::kMaster, [request = std::move(request), response](auto& trx) { const char* statement = "SELECT ok, baz FROM some WHERE id = $1 LIMIT 1"; psql::Execute(trx, statement, request.id, [request = std::move(request), response, trx = std::move(trx)](auto& res) { auto row = res[0]; if (!row["ok"].As<bool>()) { if (LogDebug()) { GetSomeInfoFromDb([id = request.id](auto info) { LOG_DEBUG() << id << " is not OK of " << info; }); } *response = Response400{}; } psql::Execute(trx, queries::kUpdateRules, request.foo, request.bar, [row = std::move(row), trx = std::move(trx), response]() { trx.Commit([row = std::move(row), response]() { *response = Response200{row["baz"].As<std::string>()}; }); }); }); }); } 

рдФрд░ рдпрд╣рд╛рдБ рд╕реНрдЯреИрдХрдлреБрд▓-рдХреЛрд░рдЯрд╛рдЗрди рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ:

  auto row = psql::Execute(trx, queries::kGetRules, request.id)[0]; 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдЧрднрдЧ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИ:

  1. рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ;
  2. рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди, рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп :: рд╣реИрдВрдбрд▓ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдирд┐рд▓рдВрдмрд┐рдд рд╣реИ;
  3. рд╣рдо рдУрдПрд╕ рдХреЗ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ: "рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдЖрддреЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХрддрд╛рд░ рдореЗрдВ рдирд┐рд▓рдВрдмрд┐рдд рдХреЛрд░рдЖрдЙрдЯ рдХреЛ рд░рдЦ рджреЗрдВ";
  4. рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдо рдХрддрд╛рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрдХ рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ C ++ 20 Coroutines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реЗ рдХреЛрдб рдХреЗ рдХрд░реАрдм рд╣реИ:

 Response View::Handle(Request&& request, const Dependencies& dependencies) { auto cluster = dependencies.pg->GetCluster(); auto trx = co_await cluster->Begin(storages::postgres::ClusterHostType::kMaster); const char* statement = "SELECT ok, baz FROM some WHERE id = $1 LIMIT 1"; auto row = co_await psql::Execute(trx, statement, request.id)[0]; if (!row["ok"].As<bool>()) { LOG_DEBUG() << request.id << " is not OK of " << co_await GetSomeInfoFromDb(); co_return Response400{"NOT_OK", "Please provide different ID"}; } co_await psql::Execute(trx, queries::kUpdateRules, request.foo, request.bar); co_await trx.Commit(); co_return Response200{row["baz"].As<std::string>()}; } 

рдпрд╣ рд╕рд┐рд░реНрдл рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ co_await рдФрд░ co_return рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ "рдЕрдкрдиреЗ рджрдо рдкрд░" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ std рдХреЙрд▓рд┐рдВрдЧ рд╕реЗ рддреЗрдЬ рд╣реИ :: this_thread :: рдпреАрд▓реНрдб ()ред рдкреВрд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрд╕реНрдЯ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдзрд╛рдЧреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдлрд┐рд▓рд╣рд╛рд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИрдВ:
* рдУрдПрд╕ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП;
* http рдФрд░ https (рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░);
* PostgreSQL;
* MongoDB;
* рд░реЗрдбрд┐рд╕;
* рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ;
* рдЯрд╛рдЗрдорд░;
* рдирдП coroutines рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдоред

I / O- рдмрд╛рдЙрдВрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди, рдЧреЛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рд╕реЗ рдореЗрдореЛрд░реА рдФрд░ рд╕реАрдкреАрдпреВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдХ рд╕рдореГрджреНрдз рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рдХрдВрдЯреЗрдирд░реЛрдВ рдФрд░ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдирд┐рд░рдВрддрд░рддрд╛, рдЖрд░рдПрдЖрдИрдЖрдИ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдХрдореА рдХреЗ рдмрд┐рдирд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рдШрдЯрдХ


рдмреЗрд╢рдХ, рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд░реВрдкрд░реЗрдЦрд╛ рди рдХреЗрд╡рд▓ рдХреЙрд░рдЖрдЙрдЯ рд╣реИред рдЯреИрдХреНрд╕реА рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдХрд╛рд░реНрдп рдмреЗрд╣рдж рд╡рд┐рд╡рд┐рдз рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
* рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП;
* рдХреИрд╢рд┐рдВрдЧ;
* рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ;
* рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ;
* рд╡рд┐рддрд░рд┐рдд рддрд╛рд▓реЗ;
* рдкрд░реАрдХреНрд╖рдг;
* рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг;
* рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдПрдВ рдФрд░ рднреЗрдЬреЗрдВ;
* REST рд╣реИрдВрдбрд▓рд░реНрд╕ рд▓рд┐рдЦрдирд╛;
+ рдХреЛрдб рдкреАрдврд╝реА рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕рдорд░реНрдерди (рдврд╛рдВрдЪреЗ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛)ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рдХреЛрдб рдкреАрдврд╝реА


рдЖрдЗрдП рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реИ:

 Response Handle(Request&& request, const Dependencies& dependencies); 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЖрдк рдХреЛрдИ рднреА рдорд╛рдЗрдХреНрд░реЛ-рд╕рд░реНрд╡рд┐рд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕реНрд╡реИрдЧрд░ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрдгрд┐рдд)ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡реИрдЧрд░ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 paths: /some/sample/{bar}: post: description: |     Habr. summary: | ,  -   . parameters: - in: query name: id type: string required: true - in: header name: foo type: string enum: - foo1 - foo2 required: true - in: path name: bar type: string required: true responses: '200': description: OK schema: type: object additionalProperties: false required: - baz properties: baz: type: string '400': $ref: '#/responses/ResponseCommonError' 

рдЦреИрд░, рдЪреВрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдпреЛрдЬрдирд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЙрддреНрддрд░реЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЗрд╕реА рд╕рдордп, рдкреНрд░реЛрдЯреЛрдмреБрдлрд╝ / рдлреНрд▓реИрдЯрдмрдлрд╝рд░ / ... рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рднреА рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рд╕рдм рдХреБрдЫ рдорд┐рд▓реЗрдЧрд╛, рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдВ рдФрд░ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд┐рдирд╛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдз рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдХреНрд░рдорд┐рдХрддрд╛ред

рдЗрд╕реА рд╕рдордп, рдХреЛрдб рдкреАрдврд╝реА рд╕реЗрд╡рд╛ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЖрдк рд╕рдВрдХреЗрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░рд╛рд╣рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 Request req; req.id = id; req.foo = foo; req.bar = bar; dependencies.sample_client.SomeSampleBarPost(req); 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рд╣реИ: рд╣рдореЗрд╢рд╛ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдкреНрд░рд▓реЗрдЦрдиред рдпрджрд┐ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдЕрдЪрд╛рдирдХ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рд▓реЙрдЧрд┐рдВрдЧ


рд╣рдо рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ рд▓реЙрдЧ рдХреЗ рдХрдИ рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдЪрд▓реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреА рдЕрдкрдиреА рдЪрд╛рд▓реЗрдВ рд╣реИрдВ:
* рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ (рдмреЗрд╢рдХ :-));
* рд╣рдо рдзреАрдореА рдПрд╕рдЯреАрдбреА рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд▓реЛрдХреЗрд▓ рдФрд░ рдПрд╕рдЯреА :: рдУрд╕реНрдЯреНрд░реАрдо;
* рд╣рдо рдордХреНрдЦреА рдкрд░ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛);
* рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ INFO рдФрд░ рд╕рдВрдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

  LOG_DEBUG() << request.id << " is not OK of " << GetSomeInfoFromDb(); 

рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ GetSomeInfoFromDb () рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЕрдЪрд╛рдирдХ рд╕реЗрд╡рд╛ "рдореВрд░реНрдЦ" рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рд╣рдореЗрд╢рд╛ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реЗрд╡рд╛ рдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ: "рд▓реЙрдЧ рдЗрди рдбреАрдмрдЧ рдореЛрдб"ред рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ "рдареАрдХ рдирд╣реАрдВ рд╣реИ" рд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреЗрдЧреА, GetSomeInfoFromDb () рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдмрдЬрд╛рдп рдпреЛрдЧ рдХреЗ


рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдЪрд╛рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХреАред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдХрд┐рди рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛрдЧреАред

рдЕрдм рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдУрдкрди рд╕реЛрд░реНрд╕ рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдЧрд░ рд╣рдо рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рд╛рдВ, рд╕реНрд░реЛрдд рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/hi474438/


All Articles