рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреА рдкреНрд░рднрд╛рд╡реА рдмрд╛рддрдЪреАрдд рдХрд╛ рд╕рдВрдЧрдарди

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрд╕реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдиреЗ рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рд╣реИред рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдорд╛рдкрдиреАрдпрддрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрд╕ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╣рдо рджреЛ рддрдХрдиреАрдХреЛрдВ рдХреЗ рдЕрдзреНрдпрдпрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: HTTP / 1.1 рдФрд░ gRPCред рдкрд╣рд▓реА рддрдХрдиреАрдХ рдХреЛ рдорд╛рдирдХ HTTP рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░рд╛ Google рдХреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ RPC рдврд╛рдВрдЪреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ HTTP / 1.1 рдФрд░ gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдХреЛ рджреЗрдЦрдирд╛, рдкреНрд░рджрд░реНрд╢рди рдорд╛рдк рд▓реЗрдирд╛, рдФрд░ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ microservices рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ


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


рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рдЖрд╡реЗрджрди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ:

  • рд╕рд┐рд╕реНрдЯрдо рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓: jMeter
  • рд╕реЗрд╡рд╛ A: рдПрдХ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рдЬреЛ рд╕реЗрд╡рд╛ B рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред
  • рд╕реЗрд╡рд╛ рдмреА (рд╕реЗрд╡рд╛ рдмреА): рдПрдХ рдРрд╕рд╛ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдЬреЛ рдЕрдкрдиреЗ рд╕рднреА рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ 10-рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╡рд┐рд▓рдВрдм рдХреЗ рдмрд╛рдж рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд╕реНрдерд┐рд░ JSON рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред
  • рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди (VM 1 рдФрд░ VM 2): рдЕрдореЗрдЬрд╝рди EC2 t2.xlarge рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред

тЦНHTTP / 1.1


HTTP / 1.1 рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рддрдХрдиреАрдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА HTTP- рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреИрд╕реЗ axios рдпрд╛ superagent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╕реЗрд╡рд╛ рдХреЛрдб B рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ API рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

server.route({  method: 'GET',  path: '/',  handler: async (request, h) => {    const response = await new Promise((resolve) => {      setTimeout(() => {        resolve({          id: 1,          name: 'Abhinav Dhasmana',          enjoys_coding: true,        });      }, 10);    });    return h.response(response);  }, }); 

рдпрд╣рд╛рдБ рд╕реЗрд╡рд╛ A рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ рдЬреЛ HTTP / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ B рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ:

 server.route({ method: 'GET', path: '/', handler: async (request, h) => { try { const response = await Axios({ url: 'http://localhost:8001/', method: 'GET', }); return h.response(response.data); } catch (err) { throw Boom.clientTimeout(err); } }, }); 

рдЗрди microservices рдХреЛ рдЪрд▓рд╛рдХрд░, рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП jMeter рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ 50 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рд┐рд╕реНрдЯрдо рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 2000 рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдорд╛рдк рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдФрд╕рдд 37 рдПрдордПрд╕ рд╣реИред


HTTP / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдкрд░рд┐рдгрд╛рдоред jMeter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

тЦНgRPC


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

 syntax = "proto3"; service SampleDataService { rpc GetSampleData (Empty) returns (SampleData) {} } message SampleData { int32 id = 1; string name = 2; bool enjoys_coding = 3; } message Empty {} 

рдЕрдм, рдЕрдм рдЪреВрдВрдХрд┐ рд╣рдо gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реЗрд╡рд╛ рдХреЛрдб B рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:

 const grpc = require('grpc'); const proto = grpc.load('serviceB.proto'); const server = new grpc.Server(); const GetSampleData = (call, callback) => { setTimeout(() => {   callback(null, {     id: 1,     name: 'Abhinav Dhasmana',     enjoys_coding: true,   }); }, 10); }; server.addService(proto.SampleDataService.service, { GetSampleData, }); const port = process.env.PORT; console.log('port', port); server.bind(`0.0.0.0:${port}`, grpc.ServerCredentials.createInsecure()); server.start(); console.log('grpc server is running'); 

рдЗрд╕ рдХреЛрдб рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

  • рдХрдорд╛рдВрдб const server = new grpc.Server(); рд╣рдо рдПрдХ grpc рд╕рд░реНрд╡рд░ рдмрдирд╛рддреЗ рд╣реИрдВред
  • рдХрдорд╛рдВрдб рдХреЗ server.addService(proto... рд╣рдо рд╕реЗрд╡рд╛ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
  • server.bind(`0.0.0.0:${port}... рдХрдорд╛рдВрдб server.bind(`0.0.0.0:${port}... рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЛрд░реНрдЯ рдФрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм GRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ A рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:

 const protoPath = `${__dirname}/../serviceB/serviceB.proto`; const proto = grpc.load(protoPath); const client = new proto.SampleDataService('localhost:8001', grpc.credentials.createInsecure()); const getDataViagRPC = () => new Promise((resolve, reject) => { client.GetSampleData({}, (err, response) => {   if (!response.err) {     resolve(response);   } else {     reject(err);   } }); }); server.route({ method: 'GET', path: '/', handler: async (request, h) => {   const allResults = await getDataViagRPC();   return h.response(allResults); }, }); 

рдЗрд╕ рдХреЛрдб рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

  • рдХрдорд╛рдВрдб const client = new proto.SampleDataService... рд╣рдо рдПрдХ рдЬреАрдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
  • client.GetSampleData({}... рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░рд┐рдореЛрдЯ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред client.GetSampleData({}... рдХрдорд╛рдВрдбред

рдЕрдм рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЬреЗрдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдорд┐рд▓рд╛ред


рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдкрд░рд┐рдгрд╛рдо gMPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ jMeter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╕рд░рд▓ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдЖрдк рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ HTTP / 1.1 рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдзрд╛рди 27% рддреЗрдЬ рд╣реИред

рдХреНрд▓рд╕реНрдЯрд░ рдЖрд╡реЗрджрди


рдпрд╣рд╛рдБ рдПрдХ рдЖрд╡реЗрджрди рдХрд╛ рдПрдХ рдЖрд░реЗрдЦ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рд╢реЛрдз рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред


рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдпрджрд┐ рдЖрдк рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рддреБрд▓рдирд╛ рдкрд╣рд▓реЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рдПрдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ (рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░) рд╣реИ, рдЬреЛ NGINX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  • рд╕реЗрд╡рд╛ рдмреА рдЕрдм рддреАрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ рд╕реБрдирддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

рдПрдХ рдирдП рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ HTTP / 1.1 рдФрд░ gRPC рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ред

тЦНHTTP / 1.1


рдЬрдм рдХрд▓рд╕реНрдЯрд░ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ HTTP / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ microservices рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдмреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рд╕рдВрддреБрд▓рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ nginx рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝реЙрд░реНрдо рдХреЛ /etc/nginx/sites-available/default рдлрд╝рд╛рдЗрд▓ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 upstream httpservers {  server ip_address:8001;  server ip_address:8002;  server ip_address:8003; } server {  listen 80;  location / {     proxy_pass http://httpservers;  } } 

рдЕрдм рд╣рдо рдЬреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВред


HTTP / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕рдВрдзрд╛рди рдкрд░рд┐рдгрд╛рдо jMeter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдордВрдЭрд▓рд╛ 41 рдПрдордПрд╕ рд╣реИред

тЦНgRPC


рдЬреАрдЖрд░рдкреАрд╕реА рд╕рдорд░реНрдерди рдирдЧрдгреНрдп 1.13.10 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ nginx рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп sudo apt-get install nginx рдХрдорд╛рдВрдб рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рднреА рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рдореЗрдВ Node.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдореЛрдб рдореЗрдВ gRPC рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

Nginx рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдбреНрд╕ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 sudo apt-get install -y software-properties-common sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get install nginx 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ SSL рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \ -keyout localhost-privatekey.pem -out localhost-certificate.pem 

GRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ / etc/nginx/sites-available/default рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 upstream httpservers {  server ip_address:8001;  server ip_address:8002;  server ip_address:8003; } server {  listen 80;  location / {     proxy_pass http://httpservers;  } } 

рдЕрдм рд╕рдм рдХреБрдЫ jMeter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ gRPC рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред


JMeter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЛрдб рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдо

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдзреНрдп 28 рдПрдордПрд╕ рд╣реИ, рдЬреЛ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХрд┐рдП рдЧрдП рдПрдЪрдЯреАрдЯреАрдкреА / 1.1 рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рди рд╕рдВрдХреЗрддрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 31% рддреЗрдЬ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рдЕрдзреНрдпрдпрди рдХреЗ рдирддреАрдЬреЗ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ microservice- рдЖрдзрд╛рд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рдорд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 30% рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реИ рдЬреЛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдпрджрд┐ рдЖрдк рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЙрдирдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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


All Articles