一个基于 gin+ grpc + etcd 等框架开发的小栗子
一、标准的项目结构
首先我们看一个标准的项目结构是什么样子的,github 上给出的一个示例:golang-standards/project-layout










二、服务注册与发现流程

三、示例代码
项目地址:gRPC-GoWeb
1、服务注册
服务注册和发现都可参考 etcd官网 的注册和发现流程,以下是项目的几个步骤的代码,详细的可下载项目查看。
1、连接etcd注册中心
func New(etcdAddr []string) (*EtcdRegister, error) {
log.Printf("开始连接etcd注册中心... \n")
cli, err := clientv3.New(clientv3.Config{
Endpoints: etcdAddr,
DialTimeout: 5 * time.Second,
})
if err != nil {
log.Printf("连接etcd注册中心失败,失败原因是: %v \n", err)
return nil, err
}
log.Printf("连接etcd注册中心成功! \n")
return &EtcdRegister{
cli: cli,
}, nil
}
2、服务注册
func (etcdRegister *EtcdRegister) Register(srvName string, srvAddr string, ttl int64) error {
etcdRegister.srvName = srvName
etcdRegister.srvAddr = srvAddr
log.Printf("开始创建etcd端点管理器... \n")
em, err := endpoints.NewManager(etcdRegister.cli, srvName)
if err != nil {
log.Printf("创建etcd端点管理器失败,失败原因是: %v \n", err)
return err
}
etcdRegister.em = em
log.Printf("创建etcd端点管理器成功! \n")
log.Printf("开始创建服务租期... \n")
lease, err := etcdRegister.cli.Grant(context.TODO(), ttl)
if err != nil {
log.Printf("创建服务租期失败,失败原因是: %v", err)
}
etcdRegister.ttl = ttl
etcdRegister.leaseID = lease.ID
log.Printf("创建服务租期成功! \n")
log.Printf("开始注册服务,服务名: %s,服务地址: %s \n", srvName, srvAddr)
em.AddEndpoint(context.TODO(), fmt.Sprintf("%v/%v", srvName, srvAddr), endpoints.Endpoint{Addr: srvAddr}, clientv3.WithLease(lease.ID))
if err != nil {
log.Printf("注册服务失败! \n")
return err
}
log.Printf("注册服务成功! \n")
log.Printf("开始服务定期续租! \n")
leaseChan, err := etcdRegister.cli.KeepAlive(context.TODO(), etcdRegister.leaseID)
if err != nil {
log.Printf("服务定期续租失败! \n")
return err
}
etcdRegister.leaseChan = leaseChan
log.Printf("服务定期续租成功! \n")
return nil
}
3、提供服务(需要用到Protobuf)
func init() {
pb.RegisterUserServiceServer(server.GrpcServer, &UserService{})
}
2、服务发现
1、服务发现
func (etcdDiscovery *etcdDiscovery) Discovery(srvName string) (*grpc.ClientConn, error) {
target := fmt.Sprintf("etcd:///%s", srvName)
conn, err := grpc.Dial(target, grpc.WithResolvers(etcdDiscovery.resolver), grpc.WithInsecure())
if err != nil {
log.Printf("%s服务发现失败,原因是: %v \n", srvName, err)
return nil, err
}
return conn, nil
}
2、调用服务方法
func UserRegister(ginCtx *gin.Context) {
etcdDiscovery := serviceDiscovery.EtcdCenter
//获取用户服务
conn, _ := etcdDiscovery.Discovery("study-user-service")
userService := pb.NewUserServiceClient(conn)
data, err := userService.SayHello(ginCtx, &pb.Request{})
if err != nil {
log.Printf("调用用户服务出错了,原因是: %v \n", err)
}
ginCtx.JSON(200, gin.H{
"message": data,
})
}
备注:api-gateway 和 study-user-service 都使用了空导入的方式,所以主要看空导入的几个 init 函数,main 方法都是空的。
如果对 Go 的代码执行顺序不熟悉的,可以了解一下!
一个基于 gin+ grpc + etcd 等框架开发的小栗子的更多相关文章
- 【转】发布一个基于NGUI编写的UI框架
发布一个基于NGUI编写的UI框架 1.加载,显示,隐藏,关闭页面,根据标示获得相应界面实例 2.提供界面显示隐藏动画接口 3.单独界面层级,Collider,背景管理 4.根据存储的导航信息完成界面 ...
- 发现了一个关于 gin 1.3.0 框架的 bug
gin 1.3.0 框架 http 响应数据错乱问题排查 问题概述 客户端同时发起多个http请求,gin接受到请求后,其中一个接口响应内容为空,另外一个接口响应内容包含接口1,接口2的响应内容,导致 ...
- 基于mpvue的框架开发微信小程序(搭建环境)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_103 美团很早就开源了mpvue这个项目,如此看来,美团可不仅仅是一家团购网站,真正的技术驱动型企业,使得我们多了一种用来开发微信 ...
- mpvue 应用 Vant Weapp框架开发微信小程序
今天在使用mpvue开发微信小程序的过程中需要实现一个底部上拉选择列表的功能,因为之前做过H5微信公众号的开发,使用的就是有赞的Vant-ui,所以第一时间就想到了有赞的Vant Weapp UI框架 ...
- 一个定时任务管理器,基于Go语言和beego框架开发
链接 https://github.com/lisijie/webcron 安装说明 系统需要安装Go和MySQL. 获取源码 $ go get github.com/lisijie/webcron ...
- ShutIt:一个基于 Python 的 shell 自动化框架
ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是“没有痛点的expect”.它可以通过pip进行安装. Hel ...
- 一个基于cocos2d-x 3.0和Box2d的demo小程序
p图demo小应用.想怎么p就怎么p 本文參考于http://blog.csdn.net/xiaominghimi/article/details/6776096和http://www.cnblogs ...
- 部署wepy框架开发微信小程序
我用的是yarn,如果你使用的是npm,也可以 首先需要安装wepy命令行工具 npm install wepy-cli -g 然后在选定的位置使用脚手架工具创建wepy项目 wepy init st ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring使用AspectJ开发AOP基于XML和基于Annotation
AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
随机推荐
- 【Java面试指北】Exception Error Throwable 你分得清么?
读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么? 你的反应是不是像下面一样呢? 你在写代码时会经常 try catch(Exception ...
- JavaEE Day00 Java Web课程介绍
1.什么是Java Web? 使用Java语言开发互联网项目,简单理解为使用Java语言开发网站 2.课程介绍:30天 1.数据库(5天,第一阶段) 2.静态网页前端(5天,第二阶段) 3.Web核心 ...
- Python面试常见算法题集锦(递归部分)
0x1 前言 开始学习python基础的时候,有以下几种算法是面试中常见的,也是前期学习python的时候可以连带学习了解的,不卡门槛哟 0x2 实现算法的方式很多种,而算法的实现也是分程序语言的,此 ...
- JavaScript:对象:如何创建对象?
JS是面向对象的语言,除开基础数据类型,其他所有的数据类型都是对象,包括函数. 如何去理解对象,什么是对象呢? 举个例子,比如我们将日常生活中见到的猫这种动物,抽象成一个类Cat,这里不去谈类是什么概 ...
- JavaScript:七大基础数据类型:数值number及其表示范围
数值number类型,用来表示任何类型的数字:整数或者浮点数都可以: 实际上,JS中的数值,是一个64位的浮点数,这与Java中的double类型的浮点数是一致的: 但是它有表示的范围,在范围内,JS ...
- drf快速使用 CBV源码分析 drf之APIView分析 drf之Request对象分析
目录 序列化和反序列化 drf介绍和安装 使用原生django写接口 django DRF安装 drf快速使用 模型 序列化类 视图 路由 datagrip 使用postman测试接口 CBV源码分析 ...
- Spark详解(03) - Spark3.0.0运行环境安装
Spark详解(03) - Spark3.0.0运行环境安装 Spark运行模式 Spark常见部署模式: Local模式:在本地部署单个Spark服务 所谓的Local模式,就是不需要其他任何节点资 ...
- AI换脸实战教学(FaceSwap的使用)---------第二步Tools:处理输入数据集。
续上篇:https://www.cnblogs.com/techs-wenzhe/p/12936809.html 第一步中已经提取出了源视频的人脸照片以及对应人脸遮罩(landmark以及其他自选遮罩 ...
- WPF-3D图形
WPF-3D图形 WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染.本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试.2d控件如何在3D ...
- echarts系列-带图教你调整左右位置x轴样式网格虚线刻度居中双轴Y轴滚动上下移动文字旋转改分割线颜色部分字体改色折注混合,X轴的颜色,X轴字体颜色,调整柱子颜色,调整小图标图例的大小和位置,鼠标hover时候的样式,用纵向阴影
上面先说注意事项 1.如果使用show hidden控制图表显示隐藏,某些切换效果很奇怪,比如饼图,会从左上角开始放大,很丑,这个时候我们可以设置其宽高来解决问题,给其设置宽高后,切换的奇怪效果即可消 ...