最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

goZero微服務開發(fā)小結

 更新時間:2026年04月03日 10:16:18   作者:水痕01  
本文主要介紹了使用go-zero搭建微服務環(huán)境的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、go-zero微服務環(huán)境安裝

1、go-zero腳手架的安裝

go install github.com/zeromicro/go-zero/tools/goctl@latest

2、etcd的安裝根據自己電腦操作系統(tǒng)下載對應的版本,具體的使用自己查閱文章

二、創(chuàng)建一個user-rpc服務

1、定義user.proto文件

syntax = "proto3";

package user;
option go_package="./user";


service User {
  rpc FindById(FindByIdReq) returns (FindByIdResp);
}

message FindByIdReq{
  int64 id = 1;
}

message FindByIdResp {
  int64 id = 1;
  string username = 2;
}

2、使用命令生成對應的項目文件

goctl rpc protoc ./user.proto --go_out=. --go-grpc_out=. --zrpc_out=./
goctl rpc protoc ./user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. --style goZero -m

3、安裝對應的依賴包

go mod tidy

4、運行user服務

go run user.go

5、在etcd中查看服務是否已經注冊成功

etcdctl get --prefix user.rpc

6、模擬業(yè)務代碼返回數(shù)據

func (l *FindByIdLogic) FindById(in *user.FindByIdReq) (*user.FindByIdResp, error) {
	return &user.FindByIdResp{
		Id:       in.Id,
		Username: "哈哈哈",
	}, nil
}

7、使用apifox可以直接調用rpc的服務,引入文件

三、在提供restful api接口端調用rpc服務返回數(shù)據給前端

1、創(chuàng)建一個user-api的項目

2、創(chuàng)建描述文件

syntax = "v1"

type GetUserReq {
    Id int64 `path:"id"` // 主鍵id
}

type GetUserResp {
    Id int64 `json:"id"`              // 用戶id
    Username string `json:"username"` // 用戶名
}
@server(
    prefix: api/v1/user
    group: user
)
service user-api {
    @doc "根據用戶id獲取用戶新"
    @handler GetUserByIdApi
    get /:id (GetUserReq) returns (GetUserResp)
}

3、使用腳本生成對應的項目文件

goctl api go -api *.api -dir . --style=gozero

4、在user-api的配置文件中引入rpc服務的配置

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

5、在apps/user-api/internal/config/config.go創(chuàng)建服務的配置

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

6、在apps/user-api/internal/svc/servicecontext.go依賴注入rpc服務

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)),
	}
}

7、模擬實現(xiàn)業(yè)務代碼

func (l *GetUserByIdApiLogic) GetUserByIdApi(req *types.GetUserReq) (resp *types.GetUserResp, err error) {
	// 模擬業(yè)務開發(fā)
	findByIdResp, err := l.svcCtx.UserRpc.FindById(l.ctx, &user.FindByIdReq{
		Id: req.Id,
	})
	if err != nil {
		return &types.GetUserResp{}, errors.New("查詢失敗")
	}
	return &types.GetUserResp{
		Id:       findByIdResp.Id,
		Username: findByIdResp.Username,
	}, nil
}

8、直接瀏覽模擬請求http://localhost:8888/api/v1/user/1

四、實際項目中可能是多個微服務的引入

1、在go-zero項目的svc文件夾下創(chuàng)建一個rpcClient.go的文件

type RpcClient struct {
	config      config.Config
  // 服務1
	systemRpc   zrpc.Client
	systemMutex sync.Mutex
	// 服務2
	usersMutex sync.Mutex
	usersRpc   zrpc.Client
}
func NewRpcClient(c config.Config) *RpcClient {
	return &RpcClient{
		config: c,
	}
}
func (r *RpcClient) GetSystemRpc() system.ConfigServiceClient {
	r.systemMutex.Lock()
	defer r.systemMutex.Unlock()
	if r.systemRpc == nil {
		systemRpc, err := zrpc.NewClient(r.config.SystemRpc)
		if err != nil {
			logx.Errorf("new system rpc failed: %+v", err)
			return nil
		}
		r.systemRpc = systemRpc
	}
	return system.NewConfigServiceClient(r.systemRpc.Conn())
}
func (r *RpcClient) GetUsersRpc() users.UsersClient {
	r.usersMutex.Lock()
	defer r.usersMutex.Unlock()
	if r.usersRpc == nil {
		usersRpc, err := zrpc.NewClient(r.config.UsersRpc)
		if err != nil {
			logx.Errorf("new user rpc failed: %+v", err)
			return nil
		}
		r.usersRpc = usersRpc
	}
	return users.NewUsersClient(r.usersRpc.Conn())
}

2、在serviceContext.go文件中注入上面的rpcClient.go

type ServiceContext struct {
	Config    config.Config
	RpcClient *RpcClient
}
func NewServiceContext(c config.Config) *ServiceContext {
	rpcClient := NewRpcClient(c)
	if rpcClient == nil {
		logx.Errorf("new rpc client failed")
		panic(0)
	}
	return &ServiceContext{
		Config:    c,
		RpcClient: rpcClient,
	}
}

3、正常使用user服務的方法

到此這篇關于goZero微服務開發(fā)小結的文章就介紹到這了,更多相關goZero微服務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文帶你了解Go語言中的匿名函數(shù)

    一文帶你了解Go語言中的匿名函數(shù)

    無論是在Go語言還是其他編程語言中,匿名函數(shù)都扮演著重要的角色,本文將詳細介紹Go語言中匿名函數(shù)的概念和使用方法,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • Go語言同步與異步執(zhí)行多個任務封裝詳解(Runner和RunnerAsync)

    Go語言同步與異步執(zhí)行多個任務封裝詳解(Runner和RunnerAsync)

    這篇文章主要給大家介紹了關于Go語言同步與異步執(zhí)行多個任務封裝(Runner和RunnerAsync)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • golang常見接口限流算法的實現(xiàn)

    golang常見接口限流算法的實現(xiàn)

    本文主要介紹了golang常見接口限流算法的實現(xiàn),包含固定窗口、滑動窗口、漏桶和令牌桶,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • go語言fasthttp使用實例小結

    go語言fasthttp使用實例小結

    fasthttp?是一個使用?Go?語言開發(fā)的?HTTP?包,主打高性能,針對?HTTP?請求響應流程中的?hot?path?代碼進行了優(yōu)化,下面我們就來介紹go語言fasthttp使用實例小結,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • go語言vscode集成開發(fā)環(huán)境搭建

    go語言vscode集成開發(fā)環(huán)境搭建

    本文將介紹如何使用VSCode搭建Go語言開發(fā)環(huán)境,Go語言是一種簡潔高效的編程語言,而VSCode是一款輕量級的集成開發(fā)環(huán)境,二者的結合可以提供良好的開發(fā)體驗,
    2023-08-08
  • 快速升級Go版本(幾分鐘就搞定了)

    快速升級Go版本(幾分鐘就搞定了)

    go現(xiàn)在的更新速度是非常的快啊,用著用著網上的教程就不配套了,下面這篇文章主要給大家介紹了關于快速升級Go版本的相關資料,文中介紹的方法幾分鐘就搞定了,需要的朋友可以參考下
    2024-05-05
  • Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout

    Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayo

    這篇文章主要為大家介紹了Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go語言中strings包的用法匯總

    go語言中strings包的用法匯總

    Golang語言 strings標準庫包主要涉及字符串的基本操作,下面我們來詳細分析下吧
    2018-10-10
  • goland 斷點調試顯示“變量不可用”的問題解決

    goland 斷點調試顯示“變量不可用”的問題解決

    本文主要介紹了goland 斷點調試顯示“變量不可用”的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-11-11
  • 生產環(huán)境go-redsync使用示例

    生產環(huán)境go-redsync使用示例

    go-redsync是go語言實現(xiàn)分布式鎖的常用工具,但官方文檔是的入門示例并不是一個可以直接用于生產環(huán)境的版本,本文提供一個可以用于生產環(huán)境的使用示例,感興趣的可以了解一下
    2025-10-10

最新評論

怀来县| 历史| 苍梧县| 克山县| 涿州市| 兴安县| 太白县| 穆棱市| 泗水县| 涞源县| 博乐市| 黔西| 叶城县| 大悟县| 宁海县| 襄城县| 大渡口区| 吉木萨尔县| 奉贤区| 桦川县| 万盛区| 邯郸市| 建水县| 灵山县| 平利县| 沂水县| 白城市| 多伦县| 平昌县| 西安市| 罗田县| 田林县| 修文县| 无棣县| 宜兰市| 方城县| 洞头县| 铅山县| 九江市| 道孚县| 伊吾县|