返回

微服务实践:订单服务从代码到k8s部署

后端

引言

微服务是一种流行的软件开发架构风格,它将一个大型复杂的服务拆分成多个小的、独立的服务,每个服务都有自己的职责和功能。这种架构风格可以带来很多好处,比如提高开发效率、提高系统可靠性和扩展性等。

订单服务

订单服务是微服务架构中非常重要的一部分,它负责处理订单相关的数据和业务逻辑。在本文中,我们将介绍如何使用go-zero开发一个简单的订单服务,并将其部署到k8s集群中。

开发订单服务

首先,我们需要创建一个新的go-zero项目。我们可以使用以下命令来创建一个名为order-service的项目:

go mod init order-service

接下来,我们需要安装go-zero框架和相关依赖。我们可以使用以下命令来安装它们:

go get github.com/tal-tech/go-zero
go get github.com/tal-tech/go-zero/tools/protoc-gen-go/v2

安装完成后,我们需要创建一个proto文件来定义我们的订单服务接口。我们可以使用以下命令来创建一个名为order.proto的文件:

protoc --go_out=plugins=grpc:. order.proto

在order.proto文件中,我们可以定义如下接口:

syntax = "proto3";

package order;

service OrderService {
  rpc CreateOrder(CreateOrderRequest) returns (CreateOrderResponse);
  rpc GetOrder(GetOrderRequest) returns (GetOrderResponse);
  rpc UpdateOrder(UpdateOrderRequest) returns (UpdateOrderResponse);
  rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse);
}

message CreateOrderRequest {
  string product_id = 1;
  int32 quantity = 2;
}

message CreateOrderResponse {
  string order_id = 1;
}

message GetOrderRequest {
  string order_id = 1;
}

message GetOrderResponse {
  Order order = 1;
}

message UpdateOrderRequest {
  Order order = 1;
}

message UpdateOrderResponse {
  Order order = 1;
}

message DeleteOrderRequest {
  string order_id = 1;
}

message DeleteOrderResponse {
  bool success = 1;
}

message Order {
  string order_id = 1;
  string product_id = 2;
  int32 quantity = 3;
}

接下来,我们需要创建一个名为main.go的文件,并在其中编写我们的订单服务代码。我们可以使用以下代码作为参考:

package main

import (
	"context"
	"log"
	"net"

	"github.com/tal-tech/go-zero/core/conf"
	"github.com/tal-tech/go-zero/core/service"
	"github.com/tal-tech/go-zero/zrpc"
	"google.golang.org/grpc"

	order "github.com/sunny-yang1996/micro-service-code-guide/6-order-service/proto/order"
)

type server struct{}

func (s *server) CreateOrder(ctx context.Context, req *order.CreateOrderRequest) (*order.CreateOrderResponse, error) {
	// TODO: implement CreateOrder
	return &order.CreateOrderResponse{}, nil
}

func (s *server) GetOrder(ctx context.Context, req *order.GetOrderRequest) (*order.GetOrderResponse, error) {
	// TODO: implement GetOrder
	return &order.GetOrderResponse{}, nil
}

func (s *server) UpdateOrder(ctx context.Context, req *order.UpdateOrderRequest) (*order.UpdateOrderResponse, error) {
	// TODO: implement UpdateOrder
	return &order.UpdateOrderResponse{}, nil
}

func (s *server) DeleteOrder(ctx context.Context, req *order.DeleteOrderRequest) (*order.DeleteOrderResponse, error) {
	// TODO: implement DeleteOrder
	return &order.DeleteOrderResponse{}, nil
}

func main() {
	// 1. 读取配置文件
	var c zrpc.RpcServerConf
	conf.MustLoad("etc/order-service.yaml", &c)

	// 2. 监听端口
	listener, err := net.Listen("tcp", c.ListenOn)
	if err != nil {
		log.Fatal("failed to listen on: ", err)
	}

	// 3. 创建grpc服务
	srv := zrpc.MustNewServer(c, func(grpcServer *grpc.Server) {
		order.RegisterOrderServiceServer(grpcServer, &server{})
	})

	// 4. 运行服务
	defer srv.Stop()
	service.RunService(srv, listener, service.WithGracefulShutdown(5*time.Second))
}

部署订单服务到k8s

现在,我们需要将我们的订单服务部署到k8s集群中。我们可以使用以下命令来创建一个名为order-service的Deployment对象:

kubectl create deployment order-service --image=registry.cn-hangzhou.aliyuncs.com/sunny-yang1996/order-service:latest

接下来,我们需要创建一个名为order-service的Service对象:

kubectl create service type=NodePort name=order-service --tcp=8080:8080

现在,我们的订单服务已经成功部署到k8s集群中了。我们可以使用以下命令来查看订单服务的状态:

kubectl get deploy,svc order-service

结语

在本文中,我们介绍了如何使用go-zero开发一个订单服务,并将其部署到k8s集群中。希望本文对您有所帮助。