国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

go-zero微服務(wù)實(shí)戰(zhàn)——基本環(huán)境搭建

這篇具有很好參考價(jià)值的文章主要介紹了go-zero微服務(wù)實(shí)戰(zhàn)——基本環(huán)境搭建。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

簡(jiǎn)介

項(xiàng)目架構(gòu)來(lái)源于go-zero實(shí)戰(zhàn):讓微服務(wù)Go起來(lái)。此對(duì)該項(xiàng)目有所刪減,相對(duì)簡(jiǎn)單適合初學(xué)者。

省去了項(xiàng)目中每個(gè)服務(wù)占用獨(dú)立docker的過(guò)程,省略了docker-compose的構(gòu)建過(guò)程。每個(gè)服務(wù)是一個(gè)獨(dú)立的程序不依賴與容器。

環(huán)境搭建

  1. 安裝goctl
go install github.com/zeromicro/go-zero/tools/goctl@latest
  1. 安裝protoc
goctl env check --install --verbose --force
  1. 安裝go-zero
go get -u github.com/zeromicro/go-zero@latest
  1. 生成api標(biāo)準(zhǔn)api服務(wù)
goctl api new apiservice
  1. 生成rpc服務(wù)
goctl rpc new rpcservice

生成代碼后go mod tidy下載所需依賴。

apiservice目錄下的apiservicelogic.go27行后修改為如下圖所示代碼:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

刪除apiservice目錄下etc下的配置文件,在主程序中做如何修改如下修改,直接配置方便一些:

func main() {

	var c config.Config
	c.Host = "0.0.0.0"
	c.Port = 8000

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

api服務(wù)統(tǒng)一為8000系列的端口。

rpcservice目錄下的yaml配置文件端口修改為9000系。主函數(shù)做如下修改:

func main() {
	var c config.Config
	c.ListenOn = "0.0.0.0:9000"
	c.Mode = "dev"
	ctx := svc.NewServiceContext(c)

	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
		rpcservice.RegisterRpcserviceServer(grpcServer, server.NewRpcserviceServer(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()
}

啟動(dòng)程序

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

瀏覽器訪問(wèn)

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

rpc客戶端訪問(wèn)

新項(xiàng)目復(fù)制兩個(gè)pb文件,編寫(xiě)客戶端主程序。

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"rpcclient/rpcservice"
)

func main() {
	//配置連連接參數(shù)(無(wú)加密)
	dial, _ := grpc.Dial("localhost:9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
	defer dial.Close()
	//創(chuàng)建客戶端連接
	client := rpcservice.NewRpcserviceClient(dial)
	//通過(guò)客戶端調(diào)用方法
	res, _ := client.Ping(context.Background(), &rpcservice.Request{Ping: "xiaoxu"})
	fmt.Println(res.Pong)

}

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

go-zero api服務(wù)構(gòu)建

整合mysql數(shù)據(jù)庫(kù)

構(gòu)建如項(xiàng)目上的4個(gè)服務(wù)。4個(gè)服務(wù)都是上一節(jié)構(gòu)建基本項(xiàng)目為基礎(chǔ)的gitee地址

整合數(shù)據(jù)庫(kù)就不再過(guò)多贅述了,整合x(chóng)orm框架,返回?cái)?shù)據(jù)庫(kù)引擎即可,如下:

xorm實(shí)戰(zhàn)——結(jié)構(gòu)體映射到實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作

import (
	"fmt"

	_ "github.com/go-sql-driver/mysql"
	"github.com/go-xorm/xorm"
)

var Engine *xorm.Engine

func init() {
	var err error
	e, err := xorm.NewEngine("mysql", "root:root@/zerotest?charset=utf8")
	if err != nil {
		fmt.Println("數(shù)據(jù)庫(kù)連接失敗!")
	}
	// err的錯(cuò)誤處理
	Engine = e
}

構(gòu)建mysql數(shù)據(jù)庫(kù)后在其他包下通過(guò)庫(kù)名.Engine即可使用數(shù)據(jù)庫(kù)引擎。

創(chuàng)建數(shù)據(jù)庫(kù)

CREATE TABLE `order` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `order_id` varchar(100) NOT NULL COMMENT '訂單編號(hào)',
  `type` tinyint DEFAULT NULL COMMENT '訂單類(lèi)型',
  `customer_id` int DEFAULT NULL COMMENT '用戶編號(hào)',
  `amount` int DEFAULT NULL COMMENT '數(shù)量',
  `payment` tinyint DEFAULT NULL COMMENT '支付方式',
  `status` tinyint DEFAULT NULL COMMENT '狀態(tài)',
  `create_time` varchar(100) DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='訂單表';

控制器邏輯實(shí)現(xiàn)

新建logic目錄

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

創(chuàng)建訂單邏輯類(lèi)

type orderLogic struct{}

var OrderLogic orderLogic

// 創(chuàng)建訂單
func (this orderLogic) Create(param models.Order) error {
	param.Id = 0
	_, err := db.Engine.Insert(param)
	if err != nil {
		fmt.Printf("logic module create err:%v", err)
		return err
	}
	return nil
}

//db是構(gòu)建服務(wù)器引擎的包

控制器調(diào)用邏輯代碼

// create
func OrderCreateController() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		//獲取請(qǐng)求參數(shù)
		var req models.Order
		err := httpx.ParseJsonBody(r, &req)
		if err != nil {
			//fmt.Printf("ordercontoller err:%v", err)
			httpx.WriteJson(w, 500, fmt.Sprintf("ordercontoller err:%v", err))
			return
		}
		//******************//
		err = orderlogic.OrderLogic.Create(req)
		//******************//
		if err != nil {
			//fmt.Printf("order create err:%v", err)
			httpx.WriteJson(w, 500, fmt.Sprintf("order create err:%v", err))
			return
		}
		httpx.OkJson(w, map[string]string{"code": "200", "message": "插入成功!"})

	}
}

Create方法不使用結(jié)構(gòu)體模擬類(lèi),直接是一個(gè)函數(shù)也是可以的,但是函數(shù)就不能重名了,在微服務(wù)中可以為單個(gè)函數(shù),在單純的web服務(wù)中還是用類(lèi)實(shí)現(xiàn)比較好。

部分代碼:

// create
func OrderCreateController() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		//獲取請(qǐng)求參數(shù)
		var req models.Order
		err := httpx.ParseJsonBody(r, &req)
		if err != nil {
			//fmt.Printf("ordercontoller err:%v", err)
			httpx.WriteJson(w, 500, fmt.Sprintf("ordercontoller err:%v", err))
			return
		}
		err = orderlogic.OrderLogic.Create(req)
		if err != nil {
			//fmt.Printf("order create err:%v", err)
			httpx.WriteJson(w, 500, fmt.Sprintf("order create err:%v", err))
			return
		}
		httpx.OkJson(w, map[string]string{"code": "200", "message": "插入成功!"})

	}
}

// update
func OrderUpdateController() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req models.Order
		err := httpx.ParseJsonBody(r, &req)
		if err != nil {
			httpx.WriteJson(w, 500, fmt.Sprintf("update err:%v", err))
			return
		}
		err = orderlogic.OrderLogic.Update(req)
		if err != nil {
			//...
			return
		}
		httpx.OkJson(w, map[string]string{"code": "200", "message": "更新成功!"})

	}
}

//Remove

func OrderRemove() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req models.Order
		err := httpx.ParseJsonBody(r, &req)
		if err != nil {
			httpx.WriteJson(w, 500, fmt.Sprintf("remove err%v", err))
			return
		}
		err = orderlogic.OrderLogic.Remove(req)
		if err != nil {
			//...
			return
		}
		httpx.OkJson(w, map[string]string{"code": "200", "message": "刪除成功!"})
	}
}

//List

func OrderList() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		res, err := orderlogic.OrderLogic.List()
		if err != nil {
			//...
			return
		}
		httpx.OkJson(w, res)
	}
}

邏輯層直接省略了,就是xorm對(duì)mysql的CURD操作。

注冊(cè)路由

func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
	server.AddRoutes(
		[]rest.Route{
			{
				Method:  http.MethodGet,
				Path:    "/from/:name",
				Handler: ApiserviceHandler(serverCtx),
			},
			//自定義路由
			{
				Method: http.MethodPost,
				Path: "/create",
				Handler: OrderCreateController(),
			},
			{
				Method: http.MethodPost,
				Path: "/update",
				Handler: OrderUpdateController(),
			},
			{
				Method: http.MethodPost,
				Path: "/remove",
				Handler: OrderRemove(),
			},
			{
				Method: http.MethodPost,
				Path: "/list",
				Handler: OrderList(),
			},
		},
	)
}

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
綜上所屬,已經(jīng)成功的構(gòu)建了一個(gè)web服務(wù),包括對(duì)訂單order的基本操作。

如果不想手寫(xiě)這莫多代碼,可以看看zero的api語(yǔ)法,直接使用api文件一鍵生成更加方便。

go-zero rpc服務(wù)構(gòu)建

在rpc遠(yuǎn)程調(diào)用中主要用于rpc服務(wù)器注冊(cè)本地的方法,實(shí)現(xiàn)服務(wù)器之間的內(nèi)部調(diào)用。在上述服務(wù)中,都是沿用了插件生成的目錄,僅修改了部分配置文件??梢詤⒖既缦逻B接的目錄結(jié)構(gòu)層次清晰。

go-zero實(shí)戰(zhàn)

刪除舊的rpc服務(wù)的所有目錄,保留proto文件,添加如下內(nèi)容:

syntax = "proto3";

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

message Request {
  string ping = 1;
}

message Response {
  string pong = 1;
}

service Rpcservice {
  rpc Ping(Request) returns(Response);
  // 自定義方法區(qū)
  rpc Create (Request) returns (Response);
  rpc Update (Request) returns (Response);
  rpc Remove (Request) returns (Response);
  rpc Detail (Request) returns (Response);
  rpc List (Request) returns (Response);
}

注意這里不再是goctl rpc new [name]了,該命令是一鍵生成rpc標(biāo)準(zhǔn)服務(wù)命令,而需要自定義rpc服務(wù)即根據(jù)編寫(xiě)的.proto文件生成服務(wù)需要使用protobuf插件命令。

protoc-gen-go,protoc-gen-go-grpc

這兩個(gè)插件在grpc服務(wù)中一般是需要獨(dú)立安裝的,但是在go-zero中goctl集成了這兩個(gè)插件。

protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto

以下是自定義rpc服務(wù)部分,goctl生成直接跳過(guò)

運(yùn)行完指令后在proto文件指定的目錄生成了grpc服務(wù)源碼,如下

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

注意如果之前已經(jīng)使用了goctl rpc命令,那么目錄下不止有這兩個(gè)文件,建議刪除goctl生成的文件自定義構(gòu)建,因?yàn)樵S多用不著到。goctl生成的代碼主要是結(jié)合了zrpc.RpcServerConf的配置,即config目錄下的對(duì)象,如下:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
在goctl生成的代碼中也是支持flag庫(kù)的,如下,這里后續(xù)將會(huì)改成靜態(tài)的省去配置文件。
微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

goctl生成部分

通過(guò)兩個(gè)命令生成rpc服務(wù)文件,如下:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

在生成的代碼中已經(jīng)具備了邏輯層的方法,如下:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

修改主程序注釋調(diào)用flag參數(shù)獲取功能,原因是api服務(wù)和rpc服務(wù)中都有獨(dú)立的yaml文件這是不合理的,兩個(gè)flag參數(shù)獲取存在沖突,所以將兩個(gè)都注冊(cè)掉改為靜態(tài)配置,后續(xù)可以改為一個(gè)配置文件。

//注釋掉flag獲取參數(shù)的部分
func main() {
	flag.Parse()

	var c config.Config
	// conf.MustLoad(*configFile, &c)
	c.ListenOn = "0.0.0.0:9000"
	c.Name = "order.rpc"
	ctx := svc.NewServiceContext(c)
	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
		rpcservice.RegisterRpcserviceServer(grpcServer, server.NewRpcserviceServer(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()
}

修改rpc服務(wù)的邏輯如下所示:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
編寫(xiě)客戶端訪問(wèn)rpc服務(wù)

import (
	"context"
	"fmt"
	"rpcclient/rpcservice"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func main() {
	//配置連連接參數(shù)(無(wú)加密)
	dial, _ := grpc.Dial("localhost:9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
	defer dial.Close()
	//創(chuàng)建客戶端連接
	client := rpcservice.NewRpcserviceClient(dial)
	//通過(guò)客戶端調(diào)用方法
	res, err := client.Ping(context.Background(), &rpcservice.Request{ReqJson: "xiaoxu"})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(res)

}

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
成功訪問(wèn),ping的案例是goctl已經(jīng)實(shí)現(xiàn)了的,雖然早proto中編寫(xiě)了自定義的方法,如下

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
但是卻仍然無(wú)法調(diào)用,回報(bào)未繼承的錯(cuò)誤,在客戶端加入如下代碼:

//order list
r, err := client.List(context.Background(), &rpcservice.Request{})
if err != nil {
	fmt.Println(err)
	return
}
fmt.Println(r.ResJson)

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

List not implemented該錯(cuò)誤的原因時(shí)雖然存在該方法名,但方法沒(méi)有方法體,也就說(shuō)函數(shù)沒(méi)有將處理邏。

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
在服務(wù)端通過(guò)反射獲取到Rpcservice_Ping_FullMethodName的Ping方法,也就是/rpcservice.Rpcservice/Ping的Ping方法。如下圖

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

該方法就是生成文件的server目錄下包的方法,如下:

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

官方提供的方法ping調(diào)用了生成的logic的ping方法,其實(shí)就是實(shí)現(xiàn)了邏輯的解耦,將邏輯功能分隔開(kāi)來(lái)。如下所示,logic層部分只寫(xiě)邏輯處理,在serve下調(diào)用邏輯處理部分函數(shù)。

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero
微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

當(dāng)然不論如何解耦,核心還是server目錄的文件,必須在此處注冊(cè)邏輯函數(shù),才可以在rpc武器生成函數(shù)實(shí)例,客戶端才可以成功調(diào)用。

該方法實(shí)際上也是proto中定義的方法的一個(gè)重寫(xiě)過(guò)程,是接口的是實(shí)現(xiàn)。

注冊(cè)自定義函數(shù)

//list 繼承
func (s *RpcserviceServer) List(ctx context.Context,in *rpcservice.Request) (*rpcservice.Response, error) {
	//r, err := logic.List(in)
	o, err := orderlogic.OrderLogic.List()
	if err != nil {
		fmt.Printf("rpc err:%v", err)
		return &rpcservice.Response{}, err
	}
	//o 賺json字符串
	josnstr, _ := json.Marshal(o)
	return &rpcservice.Response{ResJson: string(josnstr)}, nil
}

上面代碼邏輯部分一起寫(xiě)在rpc方法注冊(cè)的函數(shù)中,當(dāng)邏輯代碼多是就會(huì)十分冗余,最好將邏輯部分提取出來(lái)封裝在新函數(shù)中,在注冊(cè)是調(diào)用新方法即可,想官方提供的模板一樣。

服務(wù)端注冊(cè)成功后,服務(wù)端調(diào)用,代碼如下:

package main

import (
	"context"
	"fmt"
	"rpcclient/rpcservice"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func main() {
	//配置連連接參數(shù)(無(wú)加密)
	dial, _ := grpc.Dial("localhost:9000", grpc.WithTransportCredentials(insecure.NewCredentials()))
	defer dial.Close()
	//創(chuàng)建客戶端連接
	client := rpcservice.NewRpcserviceClient(dial)
	//通過(guò)客戶端調(diào)用方法
	res, err := client.Ping(context.Background(), &rpcservice.Request{ReqJson: "xiaoxu"})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(res)

	//order list
	r, err := client.List(context.Background(), &rpcservice.Request{})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(r.ResJson)

}

微服務(wù)環(huán)境搭建,# go-zero,golang,微服務(wù),開(kāi)發(fā)語(yǔ)言,go-zero

別忘了克隆_grpc.pbpb文件。

到此服務(wù)order已經(jīng)可以同時(shí)提供api服務(wù)和rpc服務(wù)了。

gitee地址:https://gitee.com/fireapproval/xiaoxu/tree/xiaoxu/go/go-zero-test文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729772.html

到了這里,關(guān)于go-zero微服務(wù)實(shí)戰(zhàn)——基本環(huán)境搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用go-zero快速構(gòu)建微服務(wù)

    使用go-zero快速構(gòu)建微服務(wù)

    本文是對(duì) 使用go-zero快速構(gòu)建微服務(wù) [1] 的親手實(shí)踐 編寫(xiě)API Gateway代碼 mkdir api goctl api -o api/bookstore.api cd api goctl api go -api bookstore.api -dir . go run bookstore.go -f etc/bookstore-api.yaml 啟動(dòng)API Gateway服務(wù),默認(rèn)偵聽(tīng)在8888端口 因?yàn)槟J(rèn)生成的 api/etc/bookstore-api.yml 為: 按提示下載,再次運(yùn)行

    2024年02月13日
    瀏覽(25)
  • go-zero的rpc服務(wù)案例解析

    go-zero的rpc服務(wù)案例解析

    go-zero的遠(yuǎn)程調(diào)用服務(wù)是基于gRpc的gRPC教程與應(yīng)用。 zero使用使用gRpc需要安裝 protoc 插件,因?yàn)間Rpc基于protoc插件使用protocol buffers文件生成rpc服務(wù)器和api的代碼的。 gRPC 的代碼生成還依賴 protoc-gen-go,protoc-gen-go-grpc 插件來(lái)配合生成 Go 語(yǔ)言的 gRPC 代碼。 也可以使用go get命令安裝

    2024年02月13日
    瀏覽(21)
  • go-zero學(xué)習(xí) 第三章 微服務(wù)

    go-zero學(xué)習(xí) 第三章 微服務(wù)

    1.1 API服務(wù)模塊 goctl 使用 api 文件生成 api服務(wù) 命令: 1.2 RPC服務(wù)模塊 goctl 使用 protoc 文件生成 rpc服務(wù) 命令: 注意: --go_out 、 --go-grpc_out 、 --zrpc_out 三者配置的路徑需要完全一致,否則會(huì)報(bào)下列錯(cuò)誤。 基礎(chǔ)代碼:已生成基本的API服務(wù)、RPC服務(wù)。 這里以API服務(wù)調(diào)用RPC服務(wù)的登

    2024年02月16日
    瀏覽(21)
  • 【go-zero】go-zero阿里云oss 前端上傳文件到go-zero API服務(wù) 并在k8s pod中創(chuàng)建文件 并推送到阿里云oss 最佳實(shí)踐

    問(wèn)題:在本地通過(guò)上傳文件,然后將文件推送到aliyun的oss中,是沒(méi)問(wèn)題的 但是部署到了k8s中,則出現(xiàn)了問(wèn)題,一直報(bào)錯(cuò)沒(méi)有創(chuàng)建的權(quán)限 思路:開(kāi)始認(rèn)為應(yīng)該將該文件掛載到configmap中,然后通過(guò)這種方式修改了deployment和dockerfile。最終發(fā)現(xiàn)應(yīng)該是go的創(chuàng)建文件路徑方式搞錯(cuò)了,

    2024年02月13日
    瀏覽(29)
  • 微服務(wù)框架 go-zero logx 日志組件剖析

    微服務(wù)框架 go-zero logx 日志組件剖析

    上一篇我們說(shuō)到咱們還剩下 addTenant 功能還未實(shí)現(xiàn),不知道有沒(méi)有兄弟感興趣去實(shí)驗(yàn)一波的,本篇文章進(jìn)行簡(jiǎn)要補(bǔ)充 根據(jù)上一篇文章分析,其實(shí)我們只需要執(zhí)行如下幾步即可: 編寫(xiě) tenant.api,提供外部 addTenant 的 http 接口 編寫(xiě) tenant.api 提供一個(gè) POST http 的接口 / api /tenant/addt

    2024年02月11日
    瀏覽(23)
  • Go-Zero微服務(wù)快速入門(mén)和最佳實(shí)踐(一)

    并發(fā)編程和分布式微服務(wù) 是我們Gopher升職加薪的關(guān)鍵。 畢竟Go基礎(chǔ)很容易搞定,不管你是否有編程經(jīng)驗(yàn),都可以比較快速的入門(mén)Go語(yǔ)言進(jìn)行簡(jiǎn)單項(xiàng)目的開(kāi)發(fā)。 雖說(shuō)好上手,但是想和別人拉開(kāi)差距,提高自己的競(jìng)爭(zhēng)力, 搞懂分布式微服務(wù)和并發(fā)編程還是灰常重要的,這也是我

    2024年04月28日
    瀏覽(21)
  • 微服務(wù)架構(gòu)|go-zero 的自適應(yīng)熔斷器

    原文鏈接: go-zero 的自適應(yīng)熔斷器 上篇文章我們介紹了微服務(wù)的限流,詳細(xì)分析了計(jì)數(shù)器限流和令牌桶限流算法,這篇文章來(lái)說(shuō)說(shuō)熔斷。 熔斷和限流還不太一樣,限流是控制請(qǐng)求速率,只要還能承受,那么都會(huì)處理,但熔斷不是。 在一條調(diào)用鏈上,如果發(fā)現(xiàn)某個(gè)服務(wù)異常,

    2024年02月10日
    瀏覽(24)
  • go-zero/grpc的rpc服務(wù)間傳遞額外數(shù)據(jù)

    go-zero/grpc的rpc服務(wù)間傳遞額外數(shù)據(jù) 2024/02/18 客戶端: 初始化 md 也可如下方式: 追加新的如下: 也可使用 md 的 Set 和 Append 方法追加: 服務(wù)端: 注意 key 都會(huì)被轉(zhuǎn)為小寫(xiě),即使客戶端為大寫(xiě): 而且 key 只能由 數(shù)字、字母和三個(gè)特殊字符“-_.”組成,大寫(xiě)字母會(huì)自動(dòng)被轉(zhuǎn)為小寫(xiě)

    2024年02月19日
    瀏覽(25)
  • GoZero微服務(wù)個(gè)人探索之路(三)Go-Zero官方rpc demo示例探究

    GoZero微服務(wù)個(gè)人探索之路(三)Go-Zero官方rpc demo示例探究

    兩個(gè)文件均為protoc-gen-go-grpc自動(dòng)生成 構(gòu)成一個(gè)完整的 gRPC 服務(wù)的定義和實(shí)現(xiàn) demo.go goctl生成的客戶端代碼 Request 和 Response 別名: 定義了 Request 和 Response 兩個(gè)別名,實(shí)際上是從 demo 包中導(dǎo)入的對(duì)應(yīng)的消息類(lèi)型。 Demo 接口: 定義了一個(gè) Demo 接口,其中包含了調(diào)用 gRPC 服務(wù)中 P

    2024年01月18日
    瀏覽(54)
  • 基于go-zero的api服務(wù)刨析并對(duì)比與gin的區(qū)別

    基于go-zero的api服務(wù)刨析并對(duì)比與gin的區(qū)別

    官網(wǎng)go-zero go-zero是一個(gè)集成了各種工程實(shí)踐的微服務(wù)框架,集多種功能于一體,如服務(wù)主要的API服務(wù),RPC服務(wù)等。除了構(gòu)建微服務(wù)工程外,zero也是一款性能優(yōu)良的web框架,也可以構(gòu)建單體web應(yīng)用。 更多移步www.w3cschool.cn/go-zero。 go的web框架是很多的,例如github較為流行的有:

    2024年02月13日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包