[go-zero] 简单微服务调用

1.注意事项

go-zero微服务的注册中心默认使用的是Etcd。

本小节将以一个订单服务调用用户服务来简单演示一下,其实订单服务是api服务,用户服务是rpc服务。

这里的创建步骤和官方文档的不一致,做了部分优化,前提是已经了解了go-zero微服务调用及配置流程。初学者还是推荐按照官方文档操作。

2.服务划分及创建

2.1 用户微服务

在这里插入图片描述

在这里插入图片描述

syntax = "proto3";

package user;

// protoc-gen-go 版本大于1.4.0, proto文件需要加上go_package,否则无法生成
option go_package = "./user";

message IdRequest {
    string id = 1;
}

message UserResponse {
    // 用户id
    string id = 1;
    // 用户名称
    string name = 2;
    // 用户性别
    string gender = 3;
}

service User {
    rpc getUser(IdRequest) returns(UserResponse);
}

在这里插入图片描述

user服务的代码逻辑主要是在 internal/logic/xxxlogic.go里填写,xxxlogic.go的xxx指的是在.proto中定义的方法名的小写。

在这里插入图片描述

rpc getUser(IdRequest) returns(UserResponse);

对应 internal/logic/getuserlogic.go,一个rpc方法对应一个logic.go。在logic.go中可以进一步处理请求,比如操作数据库,Redis等。

package logic

import (
	"context"

	"go-zero-micro/rpc/user/internal/svc"
	"go-zero-micro/rpc/user/user"

	"github.com/zeromicro/go-zero/core/logx"
)

type GetUserLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLogic {
	return &GetUserLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *GetUserLogic) GetUser(in *user.IdRequest) (*user.UserResponse, error) {
	// todo: add your logic here and delete this line
	userRes :=&user.UserResponse{
		Id: in.Id,
		Gender: "男",
	}
	if in.Id == "1" {
		userRes.Name = "admin"
	}else {
		userRes.Name = "test"
	}
	return userRes, nil
}

2.2 订单微服务

在order服务下添加order.api文件,增加getUser方法:

在这里插入图片描述

syntax = "v1"

type Request {
	Name string `path:"name,options=you|me"`
}

type Response {
	Message string `json:"message"`
}

type (
	OrderReq {
		Id string `path:"id"`
	}
	OrderResp {
		Id       string `json:"id"`
		Name     string `json:"name"`
		UserName string `json:"userName"`
	}
)

service order-api {
	@handler OrderHandler
	get /from/:name (Request) returns (Response)
	@handler GetOrderHandler
	get /api/order/get/:id (OrderReq) returns (OrderResp)
}

执行生成order服务的命令

在这里插入图片描述

在这里插入图片描述

order服务调用user服务需要改动3个地方。

  1. etc/order.yaml
  2. internal/config/config.go
  3. internal/svc/servicecontext.go

order.yaml

Name: order-api
Host: 0.0.0.0
Port: 8888
UserRpc:
  Etcd:
    Hosts:
      - localhost:2379
    Key: user.rpc

user.yaml

Name: user.rpc
ListenOn: 0.0.0.0:8080
Etcd:
  Hosts:
  - 127.0.0.1:2379
  Key: user.rpc

加入user服务的RPC。

config.go

package config

import (
	"github.com/zeromicro/go-zero/rest"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct {
	rest.RestConf
	UserRpc zrpc.RpcClientConf
}

user服务接口加入到 order服务的ServiceContext中。

servicecontext.go

package svc

import (
	"github.com/zeromicro/go-zero/zrpc"
	"mall/order/internal/config"
	"mall/user/userclient"
)

type ServiceContext struct {
	Config  config.Config
	UserRpc userclient.User
}

func NewServiceContext(c config.Config) *ServiceContext {
	return &ServiceContext{
		Config:  c,
		UserRpc: userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),
	}
}

order服务修改 getorderlogic.go。

getorderlogic.go

package logic

import (
	"context"
	"github.com/pkg/errors"
	"mall/user/user"
	"strconv"

	"mall/order/internal/svc"
	"mall/order/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type GetOrderLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewGetOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetOrderLogic {
	return &GetOrderLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *GetOrderLogic) GetOrder(req *types.OrderReq) (resp *types.OrderResp, err error) {
	// todo: add your logic here and delete this line

	Id, err := strconv.Atoi(req.Id)
	if err != nil {
		return nil, err
	}
	if Id < 1 {
		return nil, errors.New("用户不存在")
	}
	userRes, err := l.svcCtx.UserRpc.GetUser(l.ctx, &user.IdRequest{
		Id: req.Id,
	})
	if err != nil {
		return nil, err
	}

	return &types.OrderResp{
		Id:       req.Id,
		Name:     userRes.Name,
		UserName: "userName",
	}, nil
}

3.启动服务

3.1 etcd 服务启动

在这里插入图片描述

在这里插入图片描述

3.2 微服务启动

在这里插入图片描述

user.go

package main

import (
	"flag"
	"fmt"
	"mall/user/internal/config"
	"mall/user/internal/server"
	"mall/user/internal/svc"
	"mall/user/user"

	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/core/service"
	"github.com/zeromicro/go-zero/zrpc"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

var configFile = flag.String("f", "etc/user.yaml", "the config file")

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)
	ctx := svc.NewServiceContext(c)

	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
		user.RegisterUserServer(grpcServer, server.NewUserServer(ctx))

		if c.Mode == service.DevMode || c.Mode == service.TestMode {
			reflection.Register(grpcServer)
		}
	})
	defer s.Stop()

	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
	s.Start()
}

在这里插入图片描述

order.go

在这里插入图片描述

package main

import (
	"flag"
	"fmt"

	"mall/order/internal/config"
	"mall/order/internal/handler"
	"mall/order/internal/svc"

	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/rest"
)

var configFile = flag.String("f", "etc/order.yaml", "the config file")

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c)

	server := rest.MustNewServer(c.RestConf)
	defer server.Stop()

	ctx := svc.NewServiceContext(c)
	handler.RegisterHandlers(server, ctx)

	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}
3.3 测试访问

http://localhost:8888/api/order/get/1

在这里插入图片描述

http://localhost:8888/api/order/get/2

在这里插入图片描述
http://localhost:8888/api/order/get/-1

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 11:52:03       4 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 11:52:03       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 11:52:03       4 阅读
  4. Python语言-面向对象

    2024-07-10 11:52:03       5 阅读

热门阅读

  1. 基于Gunicorn+Flask+Docker模型高并发部署

    2024-07-10 11:52:03       8 阅读
  2. SQL FOREIGN KEY

    2024-07-10 11:52:03       9 阅读
  3. 安全保障措施

    2024-07-10 11:52:03       8 阅读
  4. Android IdleHandler源码分析

    2024-07-10 11:52:03       8 阅读
  5. docker-1

    docker-1

    2024-07-10 11:52:03      7 阅读
  6. Git批量删除本地h和远程分支说明

    2024-07-10 11:52:03       9 阅读
  7. mvccaa

    2024-07-10 11:52:03       9 阅读
  8. Linux 常用指令详解

    2024-07-10 11:52:03       8 阅读
  9. 第2章 源码编译构建LAMP

    2024-07-10 11:52:03       8 阅读
  10. 数据库doris中的tablet底层解析

    2024-07-10 11:52:03       9 阅读