Skip to content

DevAmarkr/node-grpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

content: |

πŸš€ Node.js gRPC Microservice β€” User Service

A simple and clean gRPC-based microservice built with Node.js, showcasing how to fetch user details with high performance and low latency.

πŸ” What is gRPC?

gRPC (Google Remote Procedure Call) is a high-performance, open-source RPC framework that allows services to communicate efficiently, using:

  • πŸš„ HTTP/2 (bi-directional streaming, multiplexing)

  • πŸ“¦ Protocol Buffers (Protobuf) for fast, typed serialization

  • 🧠 Contract-first design with .proto files

    βœ… gRPC vs REST

    Feature REST (Express.js) gRPC (Node.js)
    Protocol HTTP/1.1 HTTP/2
    Data Format JSON (text-based) Protobuf (binary, compact)
    Contract Swagger (optional) .proto (enforced)
    Speed Slower πŸš€ Faster (10x+)
    Streaming Manual (WebSockets) Native, full-duplex streaming
    Best for Public APIs Microservices/internal services

    πŸ“ Project Structure

    grpc-user-service/
    β”œβ”€β”€ protos/
    β”‚   └── user.proto
    β”œβ”€β”€ src/
    β”‚   β”œβ”€β”€ server/
    β”‚   β”‚   β”œβ”€β”€ index.js
    β”‚   β”‚   β”œβ”€β”€ service.js
    β”‚   β”‚   └── loader.js
    β”‚   β”œβ”€β”€ client/
    β”‚   β”‚   β”œβ”€β”€ index.js
    β”‚   β”‚   └── loader.js
    β”‚   └── config/
    β”‚       └── grpc.js
    β”œβ”€β”€ package.json
    └── README.md
    

    πŸ” Request Flow

    Client (index.js)
       β”‚
       └──▢ Calls GetUser({ id: "123" })
              ↓
         Client Stub (loader.js)
              ↓
       Sends Protobuf request via HTTP/2
              ↓
         Server receives request
              ↓
         Server Handler (service.js)
              ↓
       Processes and returns UserResponse
              ↓
         Client receives response
       ◀── Logs or uses returned data
    

    Code

files:
  - path: protos/user.proto
    content: |
      syntax = "proto3";

      package user;

      service UserService {
        rpc GetUser (UserRequest) returns (UserResponse);
      }

      message UserRequest {
        string id = 1;
      }

      message UserResponse {
        string name = 1;
        string email = 2;
      }

  - path: src/server/index.js
    content: |
      const server = require('./loader');
      server.start();

  - path: src/server/loader.js
    content: |
      const grpc = require('@grpc/grpc-js');
      const protoLoader = require('@grpc/proto-loader');
      const { implementUserService } = require('./service');

      const PROTO_PATH = __dirname + '/../../protos/user.proto';
      const packageDef = protoLoader.loadSync(PROTO_PATH);
      const userProto = grpc.loadPackageDefinition(packageDef).user;

      const server = new grpc.Server();
      server.addService(userProto.UserService.service, implementUserService());

      exports.start = () => {
        server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
          console.log('βœ… gRPC Server started on 0.0.0.0:50051');
          server.start();
        });
      };

  - path: src/server/service.js
    content: |
      exports.implementUserService = () => ({
        GetUser: (call, callback) => {
          const { id } = call.request;
          console.log('User ID:', id);
          callback(null, {
            name: "Amar Kumar",
            email: "amar@example.com"
          });
        }
      });

  - path: src/client/index.js
    content: |
      const client = require('./loader');

      client.GetUser({ id: "123" }, (err, res) => {
        if (err) console.error(err);
        else console.log('🧾 Response:', res);
      });

  - path: src/client/loader.js
    content: |
      const grpc = require('@grpc/grpc-js');
      const protoLoader = require('@grpc/proto-loader');

      const PROTO_PATH = __dirname + '/../../protos/user.proto';
      const packageDef = protoLoader.loadSync(PROTO_PATH);
      const userProto = grpc.loadPackageDefinition(packageDef).user;

      module.exports = new userProto.UserService(
        'localhost:50051',
        grpc.credentials.createInsecure()
      );

  - path: src/config/grpc.js
    content: |
      module.exports = {
        GRPC_PORT: '0.0.0.0:50051',
        GRPC_CREDENTIALS: require('@grpc/grpc-js').ServerCredentials.createInsecure()
      };
  ## βš™οΈ Setup & Run

  ```bash
  yarn install
  node src/server/index.js   # Start server
  node src/client/index.js   # Run client
  ```

  ## βœ… Sample Response

  ```json
  {
    "name": "Amar Kumar",
    "email": "amar@example.com"
  }
  ```

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published