返回

TypeScript 微服务实战:Go + gRPC-Gateway(V2)和客户端库

前端

前言

微服务架构是一种将单一应用程序分解成多个独立且可部署的服务的架构风格。这种架构风格可以提高应用程序的扩展性、可维护性和可靠性。gRPC 是一个高性能、开源的 RPC 框架,它可以帮助我们轻松构建微服务。gRPC-Gateway 是一个可以将 gRPC 服务转换为 RESTful API 的工具,它使我们能够轻松地将微服务暴露给客户端。

TypeScript 是一种强大的 JavaScript 超集,它可以帮助我们构建健壮的客户端应用程序。TypeScript 客户端库可以帮助我们轻松地与 gRPC 服务进行通信。

微服务架构概述

微服务架构是一种将单一应用程序分解成多个独立且可部署的服务的架构风格。这种架构风格可以提高应用程序的扩展性、可维护性和可靠性。

微服务架构的特点包括:

  • 服务是独立的:每个服务都是一个独立的进程,它有自己的代码库和数据存储。
  • 服务是轻量的:每个服务都只负责完成一项特定的任务。
  • 服务是可扩展的:每个服务都可以独立地进行扩展,而不会影响其他服务。
  • 服务是可维护的:每个服务都是一个独立的单元,因此更容易进行维护。
  • 服务是可靠的:每个服务都是一个独立的进程,因此一个服务的故障不会影响其他服务。

gRPC 简介

gRPC 是一个高性能、开源的 RPC 框架,它可以帮助我们轻松构建微服务。gRPC 基于 HTTP/2 协议,它具有以下特点:

  • 高性能:gRPC 采用二进制编码,可以实现比 JSON 更快的通信速度。
  • 轻量级:gRPC 的客户端和服务器端库都很轻量级,不会增加应用程序的开销。
  • 语言无关性:gRPC 支持多种语言,包括 Go、Java、Python 和 C++。
  • 协议无关性:gRPC 可以使用多种协议进行通信,包括 HTTP/2、TCP 和 Unix 域套接字。

gRPC-Gateway 简介

gRPC-Gateway 是一个可以将 gRPC 服务转换为 RESTful API 的工具,它使我们能够轻松地将微服务暴露给客户端。gRPC-Gateway 基于以下原理工作:

  • gRPC-Gateway 将 gRPC 服务的定义转换成一个 OpenAPI 规范。
  • gRPC-Gateway 使用 OpenAPI 规范生成一个 RESTful API。
  • 客户端可以使用 RESTful API 来调用 gRPC 服务。

TypeScript 简介

TypeScript 是一种强大的 JavaScript 超集,它可以帮助我们构建健壮的客户端应用程序。TypeScript 具有以下特点:

  • 强类型:TypeScript 是一个强类型的语言,它可以帮助我们捕获类型错误。
  • 接口:TypeScript 支持接口,它可以帮助我们定义类型契约。
  • 类:TypeScript 支持类,它可以帮助我们组织代码。
  • 模块:TypeScript 支持模块,它可以帮助我们组织代码。

TypeScript 客户端库简介

TypeScript 客户端库是一个可以帮助我们轻松地与 gRPC 服务进行通信的库。TypeScript 客户端库具有以下特点:

  • 易于使用:TypeScript 客户端库非常易于使用,它只需要几行代码就可以与 gRPC 服务进行通信。
  • 类型安全:TypeScript 客户端库是类型安全的,它可以帮助我们捕获类型错误。
  • 性能优异:TypeScript 客户端库性能优异,它可以实现比 JSON 更快的通信速度。

微服务实战

接下来,我们将使用 Go + gRPC-Gateway(V2)和客户端库构建一个微服务。这个微服务将包括以下组件:

  • Go gRPC 服务:这是一个使用 Go 编写的 gRPC 服务,它提供了登录鉴权、业务请求和鉴权重试功能。
  • gRPC-Gateway:这是一个可以将 gRPC 服务转换为 RESTful API 的工具,它将 Go gRPC 服务转换为一个 RESTful API。
  • TypeScript 客户端库:这是一个可以帮助我们轻松地与 gRPC 服务进行通信的库,它将用于构建一个 TypeScript 客户端应用程序。

Go gRPC 服务

首先,我们创建一个 Go gRPC 服务。这个服务将提供登录鉴权、业务请求和鉴权重试功能。

package main

import (
	"context"
	"fmt"
	"log"
	"net"

	pb "github.com/grpc-ecosystem/grpc-gateway/v2/examples/proto/examplepb"
	"google.golang.org/grpc"
)

type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

gRPC-Gateway

接下来,我们使用 gRPC-Gateway 将 Go gRPC 服务转换为一个 RESTful API。

package main

import (
	"context"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
	pb "github.com/grpc-ecosystem/grpc-gateway/v2/examples/proto/examplepb"
)

func runGateway(ctx context.Context, grpcServerEndpoint, httpListenPort string) error {
	mux := runtime.NewServeMux()
	dialOpts := []grpc.DialOption{grpc.WithInsecure()}
	err := pb.RegisterGreeterHandlerFromEndpoint(ctx, mux, grpcServerEndpoint, dialOpts)
	if err != nil {
		return fmt.Errorf("failed to register gateway: %v", err)
	}

	httpServer := &http.Server{
		Addr:    httpListenPort,
		Handler: mux,
	}

	log.Printf("starting HTTP/1.1 gateway on %s", httpListenPort)
	return httpServer.ListenAndServe()
}

func main() {
	ctx := context.Background()
	grpcServerEndpoint := "localhost:8080"
	httpListenPort := ":8090"
	if err := runGateway(ctx, grpcServerEndpoint, httpListenPort); err != nil {
		log.Fatalf("failed to run gateway: %v", err)
	}
}

TypeScript 客户端库

接下来,我们使用 TypeScript 客户端库构建一个 TypeScript 客户端应用程序。

import {GreeterClient} from "./proto/examplepb_grpc_web_pb";
import {HelloRequest} from "./proto/examplepb_pb";

const client = new GreeterClient("http://localhost:8090");

const request = new HelloRequest();
request.setName("John Doe");

client.sayHello(request, (err, response) => {
  if (err) {
    console.error(err);
    return;
  }

  console.log(response.getMessage());
});

总结

在本文中,我们介绍了如何使用 Go + gRPC-Gateway(V2)和客户端库构建一个微服务。我们首先创建了一个 Go gRPC 服务,然后使用 gRPC-Gateway 将这个服务转换为一个 RESTful API,最后使用 TypeScript 客户端库构建了一个 TypeScript 客户端应用程序。

微服务架构是一种非常流行的架构风格,它可以帮助我们构建可扩展、可维护和可靠的应用程序。gRPC 是一个非常高效的 RPC 框架,它可以帮助我们轻松地构建微服务。gRPC-Gateway 是一个非常实用的工具,它可以帮助我们将 gRPC 服务转换为一个 RESTful API。TypeScript 客户端库是一个非常易用的库,它可以帮助我们轻松地与 gRPC 服务进行通信。

希望本文对您有所帮助。如果您有任何问题,请随时留言。