首页 > 其他分享 >golang 学习之 etcd protobuffer grpc gorm 服务注册发现 go-micro

golang 学习之 etcd protobuffer grpc gorm 服务注册发现 go-micro

时间:2023-06-03 12:35:40浏览次数:44  
标签:0.1 127.0 http proto grpc protobuffer golang -- go

1.etcd使用步骤

1)下载:https://github.com/etcd-io/etcd/releases/

2)配置环境变量

3)编辑local-cluster-profile文件:(利用goreman 启动方式,生产环境参考官方文档)

etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 --listen-peer-urls http://127.0.0.1:2380 --initial-advertise-peer-urls http://127.0.0.1:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster infra1=http://127.0.0.1:2380,infra2=http://127.0.0.1:3380,infra3=http://127.0.0.1:4380 --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:3379 --advertise-client-urls http://127.0.0.1:3379 --listen-peer-urls http://127.0.0.1:3380 --initial-advertise-peer-urls http://127.0.0.1:3380 --initial-cluster-token etcd-cluster-1 --initial-cluster infra1=http://127.0.0.1:2380,infra2=http://127.0.0.1:3380,infra3=http://127.0.0.1:4380 --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:4379 --advertise-client-urls http://127.0.0.1:4379 --listen-peer-urls http://127.0.0.1:4380 --initial-advertise-peer-urls http://127.0.0.1:4380 --initial-cluster-token etcd-cluster-1 --initial-cluster infra1=http://127.0.0.1:2380,infra2=http://127.0.0.1:3380,infra3=http://127.0.0.1:4380 --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr

4)启动etcd集群:goreman -f local-cluster-profile start

2.protobuffer 使用步骤:

1)下载 https://github.com/protocolbuffers/protobuf/releases

2)配置环境变量

3)安装protoc-gen-go: go install github.com/golang/protobuf/protoc-gen-go@latest

4)新建项目proto,目录结构如下:

	proto/
		proto/
			userinfo.proto
		main.go

5)编辑userinfo.proto(代码如下):

// 注意;号
syntax = "proto3";
option go_package = "./userService;";
message userinfo{
    string username = 1;
    int32 age = 2;
    repeated string hobby = 3;
}

// 编译命令 cd proto && protoc --go_out=./ *.proto

6)回到项目根目录并且执行命令:go mod init proto && go mod tidy //自动安装上一步生成的pb.go中的依赖

7)编辑main.go (代码如下):

package main

import (
	"fmt"
	"proto/proto/userService"

	"google.golang.org/protobuf/proto"
)

func main() {
	u := &userService.Userinfo{
		Username: "lihh",
		Age:      31,
		Hobby:    []string{"a", "b", "c"},
	}
	fmt.Println(u)

	// proto 序列化
	data, _ := proto.Marshal(u)
	fmt.Println(data)

	// proto 反序列化
	user := userService.Userinfo{}
	proto.Unmarshal(data, &user)
	fmt.Println(&user, user.GetUsername())
}

附)生成grpc服务所需proto(示例代码如下,注意编译命令与上面不同):

syntax = "proto3";

option go_package = "./goodsService;";

// 定义rpc服务
service GoodsService {
    rpc AddGoods(AddGoodsReq) returns (AddGoodsRes);
    rpc GetGoods(GetGoodsReq) returns (GetGoodsRes);
}

message GoodsMode {
    string title = 1; 
    double price = 2;
    string content = 3;
}

// AddGoods 相关参数
message AddGoodsReq {
    GoodsMode params = 1;
}

message AddGoodsRes {
    string message = 1; 
    bool success = 2;
}

// GetGoods 相关参数
message GetGoodsReq {
    int32 id = 1;
}
message GetGoodsRes {
    repeated GoodsMode result = 1;
}

// 编译命令 protoc --go_out=plugins=grpc:./ *.proto

3.grpc

1)安装:go get -u -v google.golang.org/grpc

2)创建proto目录,生成proto:

目录结构:
	proto/
		greeter/
			greeter.pb.go
		greeter.proto
greeter.proto代码如下:

syntax = "proto3";
option go_package="./greeter";

service Greeter {
    rpc SayHello(HelloReq) returns (HelloRes);
}

message HelloReq {
    string name = 1;
}

message HelloRes {
    string message = 1;
}
// 编译命令 protoc --go_out=plugins=grpc:./ *.proto

3)server代码:

目录结构:
	greeter/
		proto/ (第2步构建的proto文件夹)
		main.go
main.go代码如下:

package main

import (
	"context"
	"fmt"
	"greeter/proto/greeter"
	"net"

	"google.golang.org/grpc"
)

// 1.定义远程调用的结构体喝方法 实现GreeterServer接口 interface
type Hello struct {
}

func (this *Hello) SayHello(c context.Context, req *greeter.HelloReq) (*greeter.HelloRes, error) {
	fmt.Println(req)

	return &greeter.HelloRes{
		Message: req.Name + ", hello",
	}, nil
}

func main() {
	// 1. 初始化 grpc对象
	grpcServer := grpc.NewServer()

	// 2. 注册服务
	greeter.RegisterGreeterServer(grpcServer, &Hello{})

	// 3. 监听端口
	listenner, err := net.Listen("tcp", "0.0.0.0:8001")
	if err != nil {
		fmt.Println(err)
	}

	// 4. 启动服务
	grpcServer.Serve(listenner)
}

执行命令:go mod init greeter && go mod tidy && go run main.go

4)client代码:

目录结构:
	greeter/
		proto/ (第2步构建的proto文件夹)
		main.go
main.go代码如下:

package main

import (
	"greeter/proto/greeter"
	"context"
	"fmt"

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

func main() {
	// 1. 建立连接
	/*
		credentials.NewClientTLSFromFile:从输入的证书文件中为客户端构造TLS凭证
		grpc.WithTransportCredentials:配置连接级别的安全凭证(例如,TLS/SSL),返回一个DialOption,用于连接服务器
	*/
	grpcClient, err := grpc.Dial("0.0.0.0:8001", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		fmt.Println(err)
	}

	// 2. 注册客户端
	client := greeter.NewGreeterClient(grpcClient)
	res, err := client.SayHello(context.Background(), &greeter.HelloReq{
		Name: "lihh",
	})
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res, res.GetMessage())

}

执行命令:go mod init greeter && go mod tidy && go run main.go

4.gorm(整理中)

5.服务注册发现(整理中)

6.go-micro(整理中)

标签:0.1,127.0,http,proto,grpc,protobuffer,golang,--,go
From: https://www.cnblogs.com/lihuanghao/p/17453797.html

相关文章

  • Golang标准库之bytes介绍
    本次主要介绍golang中的标准库bytes,基本上参考了字节|bytes、Golang标准库——bytes文章。bytes库主要包含5大部分,即:常量变量函数BufferReader我们依次学习上面的5大部分。1、常量constMinRead=512bytes.MinRead是一个常量,表示在使用ReadFrom方法从i......
  • golang的打点定时器
    定时器方式1:使用time.NewTicker(时间间隔)来设置定时器//定时器,定义一个1秒间隔的定时器ticker:=time.NewTicker(time.Second)n:=0fori:=rangeticker.C{fmt.Println(i)n++ifn>5{//终止定时器ticker.Stop()return......
  • go语言中protobuf以及grpc的使用
    首先定义数据结构,保存为.proto文件syntax="proto3";packagetutorial;//Theprotocolcompilergeneratesaclassfromthefollowing.protofilewith//methodsforwritingandreadingthemessagefields.Theclassiscalled//"Person"andisin......
  • Golang - 选项模式 vs 构建器模式
    在使用Golang创建复杂对象时,常用的两种模式是选项模式(Optionspattern)和构建器模式(Builderpattern)。这两种模式各有优缺点,选择适合项目需求的模式取决于具体情况。问题假设我们想创建一个具有许多可选参数的复杂对象。一种方法是创建一个构造函数,该构造函数接受所有参数,并为可......
  • golang实现设计模式之享元模式总结-代码、优缺点、适用场景
    享元模式是一种结构型的设计模式,通过共享细粒度对象实现对象的复用,从而达到减少对象创建与销毁,减少内存消耗,其本质是本质是缓存共享对象,降低内存消耗。享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象......
  • golang依赖注入工具digo
    golang依赖注入工具digo工具地址:https://github.com/werbenhu/digo特性使用注释中的注解自动代码生成自动检测循环依赖编译时期依赖注入自动初始化支持实例组的管理快速开始更多示例请参考:examples编写代码和注解packagemainimport( "log" "github.com/werbe......
  • golang实现设计模式之构建者模式总结-代码、优缺点、适用场景
    构建者模式也是一种创建型的设计模式,该模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的对象。大白话就是,构建者模式,从输出角度看依然是创建个对象实例,但是构建者模式更关注创建的细节,或者说一个对象的创建可以拆分为多个步骤,所有的步骤完成才创建出这个对......
  • 优雅实现golang默认参数
    原生的golang中,函数定义不支持默认参数。但是在实际开发过程中,经常会有些参数用户可以不关心或者可以根据实际情况去定制实现,这个时候需要使用到默认参数,在C++中,函数的定义和实现本来就支持默认参数,如果需要在golang中实现默认参数,可以参考一下做法: packagemainimport"fmt......
  • golang vscode开发环境配置
    1.下载go安装包并安装官网下载地址2.下载vscode并安装官网下载地址3.安装vscodego语言开发扩展(插件)4.切换国内下载源,cmd输入如下代码goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cn,direct5.安装vscodego开发工具包windows下vscodeCtrl+Shift+P找......
  • golang之recover
    recover是什么golang的recover是一个内置函数,用于在发生panic时恢复程序的控制流。当程序发生panic时,程序会停止执行当前的函数,并向上层函数传递panic,直到被recover函数捕获。recover函数必须在defer语句中调用,否则无法捕获panic。如果没有发生panic或者没有被recover函数捕获,程序......