El entorno de desarrollo de sistemas Mac más simple y rápido para crear servicios distribuidos grpc

Detalles del entorno

  • vamos 1.18

  • macOS Gran Sur

  • prototipo 3

Fundamental

Todo el proceso de RPC es:

  1. El cliente envía datos (en flujo de bytes)
  2. El servidor recibe y analiza. Saber qué hacer por acuerdo. Luego devolver el resultado al cliente.

RPC es poner—

  1. El proceso anterior se encapsula para que su funcionamiento sea más optimizado.
  2. Normalízalo usando algún protocolo acordado

Entonces, el marco GRPC usa protobuf como estructura de datos para el paso de mensajes en este proceso.

Que es Protobuf

Protobuf es la abreviatura de Protocol Buffers. Es un lenguaje de descripción de datos desarrollado por Google. Se utiliza para describir un formato portátil y eficiente de almacenamiento de datos estructurados. Fue de código abierto en 2008. Protobuf se puede utilizar para serialización de datos estructurados o serialización. Su diseño es muy adecuado para portadores de datos en comunicaciones de red, y es muy adecuado para almacenamiento de datos o formato de intercambio de datos RPC.Serializa menos datos y almacena datos en forma de KV, que es compatible con las versiones de mensajes.Lenguaje muy fuerte -formato de datos estructurados serializados, escalable, independiente de la plataforma que se puede utilizar en protocolos de comunicación, almacenamiento de datos y otros campos. Los desarrolladores pueden usar las herramientas adjuntas a Protobuf para generar código y realizar la función de serializar datos estructurados.



Este tutorial describirá la sintaxis del archivo .proto y cómo generar clases de acceso a datos y clases de servicio grpc a través del archivo .proto en el siguiente contenido, y construirá un entorno de desarrollo de servidor grpc simple basado en esto.

instalación de herramientas

Cree un nuevo proyecto, seleccione módulos go, configure GOPROXY y otras operaciones sin repetirlas;

  1. Descargar dependencias grpc

ve a buscar -u google.golang.org/[email protected]

  1. protocolo de instalación de cerveza

elaborar cerveza instalar protobuf

Después de la instalación, puede ejecutar el comando protoc, que puede usarse como un compilador de protocolos y puede traducirse a archivos grpc en varios idiomas a través del archivo intermedio .proto

brew install protoc-gen-go

Un complemento que traduce archivos intermedios en archivos go

brew install protoc-gen-go-grpc

Un complemento que traduce archivos intermedios en archivos go-grpc.

Nota: Si la instalación falla, es posible que la instalación de la dependencia haya fallado, simplemente prepare la instalación para instalar la dependencia.

En este punto, las herramientas y las dependencias están instaladas y el proyecto se compilará a continuación.

Construcción del entorno

Estructura del proyecto go-rpc-server:

.

├── client.go ——para escribir pruebas de clientes

├── ir.mod

├── ir.sum

├── main.go ——iniciar el servidor

├── pbfiles: este directorio se utiliza para colocar el archivo proto original

│ └── Prod.proto

├── servicios ——Este directorio se utiliza para colocar los archivos go traducidos

Primero cree un nuevo archivo .proto. Este ejemplo demuestra la API para mostrar el inventario de productos, por lo que se llama Prod.proto;

La edición tiene lo siguiente:

syntax="proto3";
option go_package ="go-rpc-server/services"; //相对路径 和protoc的flag go_out拼接
//package services; //该选项配置后 客户端请求需要多加上services.的路径
message  ProdRequest {
  int32 prod_id =1;   //传入的商品ID
}
message ProdResponse{
  int32 prod_stock=1;//商品库存
}
//这里的内容其实可以独立配置一个.proto文件,因为 rpc 服务类的文件会独立于数据访问类
service ProdService {
  rpc GetProdStock (ProdRequest) returns (ProdResponse);
}

Referencia de la documentación Conceptos básicos del búfer de protocolo: Ir


Luego generado por protoc -
1. Clase de acceso a datos

protoc --go_out=./…/ pbfiles/Prod.proto

2. clase de servicio rpc

protoc --go-grpc_out=./…/ pbfiles/Prod.proto

Si se informa un error

archivo


Simplemente agregue la opción go_package = "go-rpc-server/services" en el archivo proto ;
especifique la ruta del archivo intermedio para generar el archivo go.

Escribir la implementación de la clase de servicio.

Cabe mencionar que a partir de cierta versión, la interfaz de implementación de la clase de servicio ha sufrido los siguientes cambios:

type ProdServiceServer interface {
	GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error)
	mustEmbedUnimplementedProdServiceServer() //这里是新增的
}

Y en la clase de servicio grpc generada:

type UnimplementedProdServiceServer struct {
}

func (UnimplementedProdServiceServer) GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetProdStock not implemented")
}
func (UnimplementedProdServiceServer) mustEmbedUnimplementedProdServiceServer() {}

La interfaz anterior está implementada; la recomendación oficial es que anidemos esta estructura al implementar la clase de servicio.



Así que hay la siguiente implementación:

type ProdService struct {
	UnimplementedProdServiceServer
}

func (ps *ProdService) GetProdStock(context.Context, *ProdRequest) (*ProdResponse, error) {
	return &ProdResponse{ProdStock: 233}, nil
}

La interfaz devuelve nuestros datos simulados;

Comienza el servicio

Escribe la función principal, monitoréala y ejecútala a través del paquete net.go run main.go

func main() {
	rpcServer := grpc.NewServer()
	services.RegisterProdServiceServer(rpcServer, new(services.ProdService))

	lis, _ := net.Listen("tcp", ":8087")

	rpcServer.Serve(lis)
}

Hasta ahora, nuestro entorno de servidor grpc se ha configurado.

pruebas de clientes

No hay mucho que decir, vaya directamente al código del cliente:

func main() {
	cli, _ := grpc.DialContext(context.Background(),
		"localhost:8087",
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)
	req := &services.ProdRequest{}
	rsp := &services.ProdResponse{}
	err := cli.Invoke(context.Background(),
		"/ProdService/GetProdStock", req, rsp)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(rsp.ProdStock)
}

ejecución go run client.go, por lo que tenemos:

archivo



¡Hecho!

¡Este artículo está publicado por OpenWrite, una plataforma de publicación múltiple para blogs !

Supongo que te gusta

Origin blog.csdn.net/kingu_crimson/article/details/128672952
Recomendado
Clasificación