分享小滴大课训练营-微服务架构-海量数据商用短链平台项目大课

118 阅读2分钟

小滴大课训练营-微服务架构-海量数据商用短链平台项目大课

//xia仔k:百度网盘

微服务架构是一种将单一应用程序拆分成一组小型服务的方法,每个服务都运行在其独立的进程中,并使用轻量级通信机制进行通信。这种架构风格有助于提高系统的可伸缩性、灵活性和可维护性。以下是一个简单的微服务架构核心技术原理代码示例,使用Go语言编写,并借助gRPC进行服务间通信。

首先,我们定义一个简单的gRPC服务接口。创建一个名为proto/greeting.proto的文件:

protobuf复制代码syntax = "proto3";    package greeting;    // The greeting service definition.  service Greeter {    // Sends a greeting    rpc SayHello (HelloRequest) returns (HelloReply) {}  }    // The request message containing the user's name.  message HelloRequest {    string name = 1;  }    // The response message containing the greetings.  message HelloReply {    string message = 1;  }

然后,我们需要生成gRPC服务和客户端的代码。这可以通过protobuf编译器和gRPC插件完成:

sh复制代码protoc -I proto/ proto/greeting.proto \    --go_out=. \    --go_opt=paths=source_relative \    --go-grpc_out=. \    --go-grpc_opt=paths=source_relative

这将在当前目录下生成greeting.pb.gogreeting_grpc.pb.go文件。

接下来,我们实现gRPC服务:

go复制代码// server/main.go  package main    import (  	"context"  	"log"  	"net"    	pb "path/to/generated/proto" // 替换为实际生成的protobuf包路径  	"google.golang.org/grpc"  )    // server is used to implement greeting.Greeter.  type server struct {  	pb.UnimplementedGreeterServer  }    // SayHello implements greeting.Greeter.  func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {  	log.Printf("Received: %v", in.GetName())  	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil  }    func main() {  	addr := "localhost:50051"  	lis, err := net.Listen("tcp", addr)  	if err != nil {  		log.Fatalf("failed to listen: %v", err)  	}  	s := grpc.NewServer()  	pb.RegisterGreeterServer(s, &server{})  	log.Printf("server listening at %v", addr)  	if err := s.Serve(lis); err != nil {  		log.Fatalf("failed to serve: %v", err)  	}  }

现在,我们实现一个简单的gRPC客户端来调用这个服务:

go复制代码// client/main.go  package main    import (  	"context"  	"log"  	"os"    	pb "path/to/generated/proto" // 替换为实际生成的protobuf包路径  	"google.golang.org/grpc"  )    func main() {  	addr := "localhost:50051"  	// 创建gRPC连接  	conn, err := grpc.Dial(addr, grpc.WithInsecure())  	if err != nil {  		log.Fatalf("did not connect: %v", err)  	}  	defer conn.Close()  	c := pb.NewGreeterClient(conn)    	// 调用gRPC服务  	name := "World"  	if len(os.Args) > 1 {  		name = os.Args[1]  	}  	r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})  	if err != nil {  		log.Fatalf("could not greet: %v", err)  	}  	log.Printf("Greeting: %s", r.GetMessage())  }

请确保将上述代码中的path/to/generated/proto替换为实际生成的protobuf Go包的路径。

现在,你可以分别运行服务器和客户端:

sh复制代码# 启动gRPC服务器  go run server/main.go    # 在另一个终端中启动gRPC客户端  go run client/main.go Alice

客户端应该会收到来自服务器的问候消息:“Hello Alice”。如果你不提供命令行参数,客户端将默认使用“World”作为名称。

这个