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

淺談Go-zero構(gòu)建RPC與API服務(wù)全流程

 更新時(shí)間:2025年09月15日 09:30:39   作者:數(shù)擎AI  
Go Zero 是一個(gè)流行的框架,它提供了構(gòu)建微服務(wù)的基礎(chǔ)設(shè)施,包括 RPC 服務(wù)和 RESTful API,本文主要介紹了Go-zero構(gòu)建RPC與API服務(wù)全流程,感興趣的可以了解一下

rpc服務(wù)與api服務(wù)的創(chuàng)建

1. rpc的protobuf文件創(chuàng)建

syntax = "proto3";

package user;

option go_package = "./user";


message  UserReq {
  string id = 1;
}

message UserResp {
  string id = 1;
  string name = 2;
  string phone = 3;
}

service User{
  rpc GetUser(UserReq) returns(UserResp);
}

2. rpc服務(wù)的創(chuàng)建

goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.  #通過(guò)proto生成服務(wù)

3. api的protobuf文件創(chuàng)建

api服務(wù)的創(chuàng)建

goctl api new api # 生成
goctl api go -api user.api -dir . style=gozero

api 服務(wù)調(diào)用rpc服務(wù)

1. api服務(wù)etc的添加

Name: User
Host: 0.0.0.0
Port: 8888

# userRpc服務(wù)調(diào)用
UserRpc:
  Etcd:
    Hosts:
      - 127.0.0.1:2379
    Key: user.rpc

2. api服務(wù)配置的添加

package config

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

type Config struct {
	rest.RestConf
	UserRpc zrpc.RpcClientConf // 添加調(diào)用rpc服務(wù)
}

3. api服務(wù)svc配置請(qǐng)求上下文

package svc

import (
	"easy-chat/examples/user/api/internal/config"
	"easy-chat/examples/user/rpc/userclient"
	"github.com/zeromicro/go-zero/zrpc"
)

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

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

4. api服務(wù)邏輯層調(diào)用rpc服務(wù)

// GetUser 獲取用戶信息
func (l *GetUserLogic) GetUser(req *types.UserReq) (resp *types.UserResp, err error) {

user, err := l.svcCtx.User.GetUser(l.ctx, &userclient.UserReq{Id: req.Id})
if err != nil {
return nil, err
}
return &types.UserResp{
Id:    user.Id,
Name:  user.Name,
Phone: user.Phone,
}, nil
}

rpc 服務(wù)響應(yīng)api服務(wù)

1. 邏輯層響應(yīng)api服務(wù)

// GetUser rpc 服務(wù)處理邏輯
func (l *GetUserLogic) GetUser(in *user.UserReq) (*user.UserResp, error) {
return &user.UserResp{
Id:    "123456",
Name:  "tom",
Phone: "159924****8",
}, nil
}

數(shù)據(jù)庫(kù)的操作

1. 編寫操作的sql文件并生成對(duì)應(yīng)的操作數(shù)據(jù)庫(kù)接口

CREATE TABLE `users`
(
    `id`         varchar(24) COLLATE utf8mb4_unicode_ci  NOT NULL,
    `avatar`     varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
    `name`       varchar(24) COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '',
    `phone`      varchar(20) COLLATE utf8mb4_unicode_ci  NOT NULL DEFAULT '',
    `password`   varchar(191) COLLATE utf8mb4_unicode_ci          DEFAULT NULL,
    `status`     int(10) DEFAULT NULL,
    `created_at` timestamp NULL DEFAULT NULL,
    `updated_at` timestamp NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
# -c是增加緩存
goctl model mysql ddl -src user.sql -dir . -c 

2. proto文件增加添加用戶接口

syntax = "proto3";

package user;

option go_package = "./user";


message CreateReq {
  string id = 1;
  string name = 2;
  string phone = 3;
}

message CreateResp {
  string msg = 1;
}

message  UserReq {
  string id = 1;
}

message UserResp {
  string id = 1;
  string name = 2;
  string phone = 3;
}

service User{
  // CreateUser 創(chuàng)建用戶信息
  rpc CreateUser(CreateReq) returns(CreateResp);
  //GetUser  獲取用戶信息
  rpc GetUser(UserReq) returns(UserResp);

}

3. 生成對(duì)應(yīng)的rpc接口

goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.  #通過(guò)proto生成服務(wù)

4. 添加etc請(qǐng)求配置

Name: user.rpc
ListenOn: 0.0.0.0:8080

Etcd:
  Hosts:
    - 127.0.0.1:2379
  Key: user.rpc

Mysql:
  DataSource: root:V4Nn9fa#Xf!@tpc(127.0.0.1:3306)/user?charset=utf8mb4

Cache:
  - Host: 127.0.0.1:6379
    Type: node
    Pass:

5. 添加配置結(jié)構(gòu)體

package config

import (
	"github.com/zeromicro/go-zero/core/stores/cache"
	"github.com/zeromicro/go-zero/zrpc"
)

type Config struct {
	zrpc.RpcServerConf
	// mysql配置
	Mysql struct {
		DataSource string
	}
	// redis配置
	Cache cache.CacheConf
}

6. 添加svc 上下文

package svc

import (
	"easy-chat/examples/user/model"
	"easy-chat/examples/user/rpc/internal/config"
	"github.com/zeromicro/go-zero/core/stores/sqlx"
)

type ServiceContext struct {
	Config config.Config
	// mysql 連接信息
	UserModel model.UsersModel
}

func NewServiceContext(c config.Config) *ServiceContext {
	conn := sqlx.NewMysql(c.Mysql.DataSource)
	return &ServiceContext{
		Config: c,
		// mysql和redis配置
		UserModel: model.NewUsersModel(conn, c.Cache),
	}
}

7. logic增加用戶邏輯

// CreateUser  創(chuàng)建用戶信息
func (l *CreateUserLogic) CreateUser(in *user.CreateReq) (*user.CreateResp, error) {
_, err := l.svcCtx.UserModel.Insert(l.ctx, &model.Users{
Id:    in.Id,
Name:  in.Name,
Phone: in.Phone,
})

if err != nil {
return nil, err
}

return &user.CreateResp{Msg: "ok"}, nil
}

api 服務(wù)調(diào)用rpc服務(wù)

1. 增加添加用戶api

syntax = "v1"

type CreateReq {
    Id string `json:"id"`
    Name string `json:"name"`
    Phone string `json:"phone"`
}

type CreateResp {
    Msg string `json:"msg"`
}

type UserReq {
    Id string `json:"id"`
}

type UserResp {
    Id string `json:"id"`
    Name string `json:"name"`
    Phone string `json:"phone"`
}

service User {
    // createUser 添加用戶
    @handler createUser
    post /user (CreateReq) returns (CreateResp)

    // getUser 獲取用戶
    @handler getUser
    get /user (UserReq) returns (UserResp)
}

2. 生成對(duì)應(yīng)的api服務(wù)接口

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

3. 編寫對(duì)應(yīng)的邏輯

func (l *CreateUserLogic) CreateUser(req *types.CreateReq) (resp *types.CreateResp, err error) {
	user, err := l.svcCtx.User.CreateUser(l.ctx, &userclient.CreateReq{
		Id:    req.Id,
		Name:  req.Name,
		Phone: req.Phone,
	})
	if err != nil {
		return nil, err
	}

	return &types.CreateResp{Msg: user.Msg}, nil
}

到此這篇關(guān)于淺談Go-zero構(gòu)建RPC與API服務(wù)全流程的文章就介紹到這了,更多相關(guān)Go-zero構(gòu)建RPC與API服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • golang使用http client發(fā)起get和post請(qǐng)求示例

    golang使用http client發(fā)起get和post請(qǐng)求示例

    這篇文章主要介紹了golang使用http client發(fā)起get和post請(qǐng)求示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 深入理解Go語(yǔ)言的容器包

    深入理解Go語(yǔ)言的容器包

    Go語(yǔ)言的container標(biāo)準(zhǔn)包包含了堆(heap)、鏈表(list)和環(huán)(ring)三種數(shù)據(jù)結(jié)構(gòu),本文就來(lái)詳細(xì)的介紹一下這三種的使用,感興趣的可以了解一下
    2024-10-10
  • go切片的copy和view的使用方法

    go切片的copy和view的使用方法

    這篇文章主要介紹了go切片的copy和view的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 淺析如何利用Go的plugin機(jī)制實(shí)現(xiàn)熱更新

    淺析如何利用Go的plugin機(jī)制實(shí)現(xiàn)熱更新

    熱更新,或稱熱重載或動(dòng)態(tài)更新,是一種軟件更新技術(shù),允許程序在運(yùn)行時(shí),不停機(jī)更新代碼或資源,本文主要來(lái)討論下GO語(yǔ)言是否可以利用plugin機(jī)制實(shí)現(xiàn)熱更新,感興趣的可以了解下
    2024-04-04
  • Go中匿名結(jié)構(gòu)體的使用技巧

    Go中匿名結(jié)構(gòu)體的使用技巧

    這篇文章主要給大家分享一個(gè)使用匿名結(jié)構(gòu)體,提升Go編程效率的小技巧,沒(méi)什么技術(shù)深度,屬于在日常寫代碼過(guò)程中積累下來(lái)的一個(gè)提升自己編程效率的小經(jīng)驗(yàn)
    2023-08-08
  • Gin中數(shù)據(jù)解析和綁定的幾種方法實(shí)現(xiàn)

    Gin中數(shù)據(jù)解析和綁定的幾種方法實(shí)現(xiàn)

    本文主要介紹了Gin中數(shù)據(jù)解析和綁定的幾種方法實(shí)現(xiàn),包括Json數(shù)據(jù)、表單數(shù)據(jù)和URI數(shù)據(jù),每種類型的數(shù)據(jù)都有其特定的解析和綁定方法,下面就一起來(lái)了解一下
    2025-11-11
  • Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例

    Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例

    這篇文章主要介紹了Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • golang中值類型/指針類型的變量區(qū)別總結(jié)

    golang中值類型/指針類型的變量區(qū)別總結(jié)

    golang的值類型和指針類型receiver一直是大家比較混淆的地方,下面這篇文章主要給大家總結(jié)介紹了關(guān)于golang中值類型/指針類型的變量區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • golang實(shí)現(xiàn)協(xié)程池的方法示例

    golang實(shí)現(xiàn)協(xié)程池的方法示例

    本文主要介紹了golang實(shí)現(xiàn)協(xié)程池的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • go語(yǔ)言vscode集成開(kāi)發(fā)環(huán)境搭建

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

    本文將介紹如何使用VSCode搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境,Go語(yǔ)言是一種簡(jiǎn)潔高效的編程語(yǔ)言,而VSCode是一款輕量級(jí)的集成開(kāi)發(fā)環(huán)境,二者的結(jié)合可以提供良好的開(kāi)發(fā)體驗(yàn),
    2023-08-08

最新評(píng)論

腾冲县| 普宁市| 北京市| 榆中县| 盱眙县| 杭锦后旗| 稻城县| 健康| 雷山县| 临安市| 彭阳县| 新巴尔虎右旗| 渝北区| 白水县| 闽清县| 云阳县| 定安县| 通州市| 迁安市| 广灵县| 洪雅县| 清流县| 天全县| 揭东县| 巴青县| 固镇县| 迁西县| 灌云县| 横峰县| 天水市| 克东县| 金川县| 大悟县| 邢台市| 永泰县| 保山市| 共和县| 玉林市| 西平县| 郸城县| 新龙县|