小滴大课训练营-微服务架构-海量数据商用短链平台项目大课
//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.go和greeting_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”作为名称。
这个