golang grpc微服务实践

这篇博客介绍了如何在Golang中使用GRPC、etcd和grpc-gateway构建微服务。内容涵盖相关工具的安装,如protocol、grpc和grpc-gateway,以及一个基础微服务的实现,包括程序结构、proto文件和服务端、客户端代码。进一步讨论了使用etcd进行服务发现和负载均衡,并展示了如何通过grpc-gateway创建HTTP服务接口。最后,探讨了golang和grpc的数据流传输模式。
摘要由CSDN通过智能技术生成

这是一篇关于grpc,etcd,grpc-gateway的实践

相关工具安装

1. protocol安装

下载地址:

https://github.com/protocolbuffers/protobuf/releases

在这里插入图片描述
我选的是windows环境的
下载完之后,解压到文件夹内,并添加环境变量。

2. grpc,grpc-gateway安装

代码地址

https://github.com/grpc/grpc-go/tags

golang package

go get -u google.golang.org/grpc

go get google.golang.org/protobuf

// 会在go安装目录 go/bin下生成一个protoc-gen-go.exe
go get -u github.com/golang/protobuf/protoc-gen-go

// go/bin下protoc-gen-grpc-gateway.exe
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

3. etcd安装

docker 安装etcd并运行

  1. 拉取镜像 https://hub.docker.com/r/bitnami/etcd
docker pull bitnami/etcd:3.4.20
  1. 创建docker网络
docker network create etcd-bridge --driver bridge
  1. 运行
docker run -d --name etcd-server \
    --network etcd-bridge \
    --publish 2379:2379 \
    --publish 2380:2380 \
    --env ALLOW_NONE_AUTHENTICATION=yes \
    --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 \
    bitnami/etcd:3.4.20

一个基础微服务demo

1. 程序结构目录

/rpc
	/client
		-main.go
	/etcd_service
		-etcd.go
	/proto
		-product.proto
	/proto_service
		-pruduct.pb.go
		-pruduct.pb.gw.go
	/server
		-main.go
		-pruduct.go
 	-main.go

2. proto文件

// 使用的语法版本
syntax = "proto3";

// 生成的go文件包
option go_package = "./proto_service";

//service 服务 接口
service ProdService {
   
  rpc GetProductStock(ProductRequest) returns (ProductResponse);
}

// 请求参数
message ProductRequest {
   
  int32 prod_id = 1;
}

// 返回参数
message ProductResponse {
   
  int32 prod_stock = 1;
}

生成go文件

pwd
/rpc/proto

protoc --go_out=plugins=grpc:../ product.proto

命令会直接生成proto_service目录和product.pb.go文件

3. 服务端

product.go

package main

import (
	"context"
	"log"
	"rpc/proto_service"
)

// 建一个实例
var ProductService = &productService{
   }

type productService struct {
   }

// 服务端实现接口业务内容
func (p productService) GetProductStock(ctx context.Context, request *proto_service.ProductRequest) (*proto_service.ProductResponse, error) {
   
	log.Println("request: ", request)
	return &proto_service.ProductResponse{
   ProdStock: request.ProdId*1000 + 996}, nil
}

main.go

package main

import (
	"google.golang.org/grpc"
	"log"
	"net"
	"rpc/proto_service"
)

const addr = "127.0.0.1:8001"

func main() {
   
	rpcServer := grpc.NewServer()
	proto_service.RegisterProdServiceServer(rpcServer, ProductService)
	listener, err := net.Listen("tcp", addr)
	if err != nil {
   
		log.Fatal("启动监听出错", err)
	}
	err = rpcServer.Serve(listener)
	if err != nil {
   
		log.Fatal("启动服务出错", err)
	}
}

开启服务

go run main.go

4. 客户端代码

client/main.go

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
	"rpc/proto_service"
	"time"
)

const addr = "127.0.0.1:8001"

func main() {
   
	conn, err := grpc.Dial(addr,grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
   
		log.Fatal("服务端出错,连接不上:", err)
	}
	defer conn.Close()
	
	client := proto_service.NewProdServiceClient(conn)
	for i := 0; i < 100; i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值