返回

前端 BFF 进阶指南:grpc-node 拦截器操作全解

前端

前言

BFF(Back-end for Front-end)的概念已经广为人知,不再赘述。简单来说,BFF 就是一个进行接口聚合裁剪的 http server。随着后端 go 语言的流行,很多大公司的后端都开始使用 go 来构建服务。

然而,前端开发人员通常更熟悉 JavaScript,并且更喜欢使用 JavaScript 语言来构建应用程序。这导致了一个问题:如何让前端开发人员能够方便地调用后端 go 编写的服务?

grpc-node 就是一个解决这个问题的方案。它是一个用 JavaScript 编写的 gRPC 客户端库,允许前端开发人员使用 JavaScript 调用后端 go 编写的 gRPC 服务。

gRPC 拦截器

gRPC 拦截器是一个允许您在请求和响应被处理之前或之后执行自定义代码的机制。这使得您可以轻松地添加诸如身份验证、日志记录和指标之类的功能,而无需修改实际的服务代码。

在 grpc-node 中,您可以使用 interceptors 选项来指定要使用的拦截器。例如,以下代码显示了如何使用 grpc-health-check 拦截器来为您的服务添加健康检查端点:

const grpc = require('@grpc/grpc-js');
const health = require('@grpc/grpc-js/health');

const server = new grpc.Server();

server.addService(health.service, {
  check: (call, callback) => {
    callback(null, {
      status: health.HealthCheckResponse.ServingStatus.SERVING,
    });
  },
});

server.use(grpc.healthCheckInterceptor());

server.bindAsync('0.0.0.0:50051', (err, port) => {
  if (err) {
    throw err;
  }
  console.log(`Server listening on port ${port}`);
});

server.start();

自定义拦截器

您还可以创建自己的自定义拦截器。例如,以下代码显示了如何创建一个简单的日志记录拦截器:

const grpc = require('@grpc/grpc-js');

const interceptor = (call, next, metadata, options) => {
  const start = Date.now();
  next(call, metadata, options, (err, response) => {
    const end = Date.now();
    console.log(`Request took ${end - start}ms`);
    if (err) {
      console.error(err);
    }
  });
};

module.exports = interceptor;

然后,您可以使用以下代码将拦截器添加到您的服务:

const grpc = require('@grpc/grpc-js');
const interceptor = require('./interceptor');

const server = new grpc.Server();

server.use(interceptor);

server.addService(health.service, {
  check: (call, callback) => {
    callback(null, {
      status: health.HealthCheckResponse.ServingStatus.SERVING,
    });
  },
});

server.bindAsync('0.0.0.0:50051', (err, port) => {
  if (err) {
    throw err;
  }
  console.log(`Server listening on port ${port}`);
});

server.start();

总结

gRPC 拦截器是一个强大的工具,可用于扩展您的 gRPC 服务的功能。您可以使用它们来添加诸如身份验证、日志记录和指标之类的功能,而无需修改实际的服务代码。您还可以创建自己的自定义拦截器,以便能够根据自己的需要对请求和响应进行修改。