0
0
Lập trình
Admin Team
Admin Teamtechmely

[Phần 1] Khám Phá GRPC Với Golang: Hướng Dẫn Cài Đặt và Sử Dụng

Đăng vào 4 ngày trước

• 3 phút đọc

Giới thiệu

Trong bài viết này, chúng ta sẽ đi sâu vào công nghệ GRPC và hướng dẫn cách cài đặt một số mô hình đơn giản bằng ngôn ngữ lập trình Golang. Đây cũng là cách để mình vừa học vừa ghi chép lại, giúp bạn đọc có được cái nhìn tổng quan về công nghệ này.

Nội dung

1. Hiểu Về GRPC: GRPC Là Gì?

RPC (Remote Procedure Call) là một khái niệm rất quen thuộc. Nguyên lý hoạt động của GRPC cho phép client gọi hàm như thể chúng đang chạy cục bộ, mặc dù các hàm này thực chất được triển khai trên server. Cách này rất thuận tiện cho người dùng.

Khi client thực hiện cuộc gọi, chúng ta sẽ sử dụng một giao thức gọi là 'protocol buffers' để đóng gói (serialize) và giải nén (deserialize) dữ liệu giữa đối tượng và định dạng byte. Điều này giống với HTTP nhưng GRPC cung cấp nhiều tính năng mạnh mẽ hơn.

Để tìm hiểu thêm về protocol buffers, bạn có thể truy cập tại đây.

2. Cài Đặt GRPC

Chúng ta sẽ bắt đầu với việc viết code để hiểu cách GRPC hoạt động. Mỗi khi giới thiệu một khái niệm mới, mình sẽ kèm theo ví dụ bằng code để lượng kiến thức được truyền tải một cách hiệu quả hơn.

Như đã đề cập, protocol buffers giống như một định nghĩa về dịch vụ mà chúng ta sẽ sử dụng. Yêu cầu (Request) và phản hồi (Response) sẽ có những trường thông tin cụ thể.

protobuf Copy
syntax = "proto3";

option go_package = "go_fundamental/grpc/helloworld"; // Định nghĩa gói cho mã Go

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Dịch vụ này đơn giản chỉ cần gọi hàm SayHello(name) và nhận lại một thông điệp.

bash Copy
# Lệnh dùng để sinh mã Go từ file .proto
$ protoc --go_out=./code_gen --go_opt=paths=source_relative --go-grpc_out=./code_gen --go-grpc_opt=paths=source_relative helloworld.proto

3. Triển Khai Server

Phần tiếp theo sẽ hướng dẫn cách triển khai server, bao gồm việc cài đặt handler để trả lời yêu cầu từ client.

go Copy
package main

import (
	"context"
	"fmt"
	helloworld "go-fundamental/grpc/code_gen"
	"net"
	"errors"
	"google.golang.org/grpc"
)

type server struct {
	helloworld.UnimplementedGreeterServer // Cần thêm dòng này
}

func newServer() *server {
	return &server{}
}

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

func main() {
	server := newServer()

	grpcServer := grpc.NewServer()
	helloworld.RegisterGreeterServer(grpcServer, server)

	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(errors.New("cannot create listener" + err.Error()))
	}

	fmt.Println("Server is running on port :8080")
	grpcServer.Serve(listen)
}

4. Triển Khai Client

Nhiệm vụ của client là gửi yêu cầu đến server và nhận phản hồi.

go Copy
package main

import (
	"context"
	helloworld "go-fundamental/grpc/code_gen"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func main() {
	cred := insecure.NewCredentials() // Chỉ dùng cho mục đích thử nghiệm
	client, err := grpc.Dial("localhost:8080", grpc.WithTransportCredentials(cred))
	if err != nil {
		panic("cannot create conn to localhost:8080" + err.Error())
	}

	greeterService := helloworld.NewGreeterClient(client)

	res, err := greeterService.SayHello(context.Background(), &helloworld.HelloRequest{Name: "John"})
	if err != nil {
		panic("cannot call SayHello" + err.Error())
	}

	println("Message: ", res.Message)
}

Đến đây, chúng ta đã có một mô hình client-server cơ bản giao tiếp qua GRPC. Trong các phần tiếp theo, mình sẽ khám phá thêm nhiều tính năng khác của GRPC và cách thực hiện chúng qua mã nguồn.

Tóm tắt

Chúng ta đã cùng nhau tìm hiểu những kiến thức cơ bản và cài đặt một mô hình client-server cơ bản sử dụng GRPC. Bạn có thể tham khảo mã nguồn tại đây. Đừng quên thực hiện lại mô hình để làm quen nhé! Hẹn gặp lại trong các phần sau.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào