Go微服务: 基于GRPC结合Consul实现微服务调用

gRPC入门系列之4-consul服务注册与发现 在生产环境中,除非是直直接在固定ip的物理机/虚拟机上运行,否则ip地址是不固定的,而且服务的数量也是不固定的,这时候就需要服务注册与发现了。需要说明的是:在现实中,consul服务的地址可能是通过配置文件,或者配置中心获取的,不会写死在代码中。在微服务架构中,服务的注册与发现是一个非常重要的组件,它可以让服务之间的调用更加简单,也可以让服务更加健壮。在上面的代码中,我们通过consul客户端获取服务列表,然后随机选择一个服务节点,调用服务。根据服务列表返回的节点,随机选择一个节点,调用服务。 阅读详情

基于GRPC结合Consul实现微服务调用


1 )环境准备

2 )准备 protos

  • 由上面的目录设计可知,需要 users.proto
    syntax="proto3";
    option go_package="./users";
    
    service Users {
        rpc AddUser(AddUserReq) returns (AddUserRes);
        rpc GetUser(GetUserReq) returns (GetUserRes);
    }
    
    message UsersModel {
        string name = 1;
        int32 age = 2;
    }
    
    message AddUserReq {
        UsersModel user = 1;
    }
    
    message AddUserRes {
        string message = 1;
        bool success = 2;
    }
    
    message GetUserReq {
    }
    
    message GetUserRes {
        repeated UsersModel userList =1 ;
    }
    
  • 进入 demo/protos/users 目录生成 users.pb.go,users_grpc.pb.go
    • 执行 protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./users.proto

3 )处理 server

  • 新建 demo/server/main.go

    package main
    
    import (
    	"context"
    	"fmt"
    	"protos/users"
    	"net"
    	"strconv"
    	"google.golang.org/grpc"
    	"github.com/hashicorp/consul/api"
    )
    
    // 定义通用度变量
    var (
    	host string = "127.0.0.1"
    	port int = 9000
    	portStr string = strconv.Itoa(port)
    	address = host + ":" + portStr
    )
    
    type Users struct {
    	users.UnimplementedUsersServer
    }
    
    func (g Users) AddUser(c context.Context, req *users.AddUserReq) (*users.AddUserRes, error) {
    	fmt.Println(req)
    	return &users.AddUserRes{
    		Success: true,
    		Message: "增加用户成功",
    	}, nil
    }
    
    func (g Users) GetUser(c context.Context, req *users.GetUserReq) (*users.GetUserRes, error) {
    	var tempList []*users.UsersModel
    	for i := 0; i < 10; i++ {
    		tempList = append(tempList, &users.UsersModel{
    			Name:   "商品" + strconv.Itoa(i),
    			Age:   int32(i),
    		})
    	}
    	return &users.GetUserRes{
    		UserList: tempList,
    	}, nil
    }
    
    func main() {
    	// ----------------------- 1. 注册consul服务 -----------------------
    	// 1、初始化consul配置
    	consulConfig := api.DefaultConfig()
    	// consulConfig.Address = "127.0.0.1:8500"  // consul服务的默认地址可省略,如果不是本机,需要补充
    
    	// 2、获取consul操作对象
    	consulClient, _ := api.NewClient(consulConfig)
    
    	// 3、配置注册服务的参数
    	agentService := api.AgentServiceRegistration {
    		ID:      "1", // 不要重复
    		Tags:    []string{"test"},
    		Name:    "UsersService",
    		Port:    port, // 和下面 grpc server 的配置相同, 否则就连接不上微服务
    		Address: host, // 同上
    		Check: &api.AgentServiceCheck{
    			TCP:      address,
    			Timeout:  "5s",
    			Interval: "30s",
    		},
    	}
    	//  4、注册服务到consul上
    	consulClient.Agent().ServiceRegister(&agentService)
    	// ----------------------- 2. 注册GRPC -----------------------
    	// 1、获取Grpc示例
    	grpcServer := grpc.NewServer()
    	// 2、注册服务
    	users.RegisterUsersServer(grpcServer, &Users{})
    	// 3、监听端口
    	listener, err := net.Listen("tcp", address)
    	if err != nil {
    		fmt.Println(err)
    	}
    	// 4、退出服务的时候关闭监听
    	defer listener.Close()
    	// 5、启动服务
    	grpcServer.Serve(listener)
    }
    
  • 主要关注 main 函数中,注册consul服务相关代码

  • 重新处理依赖 $ go mod tidy

  • 运行起来 $ go run main.go

  • 刷新发现 127.0.0.1:8500 这个 consul 注册中心面板出来了一个新的服务

4 )处理 client

  • 新建 demo/client/main.go

    package main
    
    import (
    	"fmt"
    	"protos/users"
    	"context"
    	"strconv"
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials/insecure"
    	"github.com/hashicorp/consul/api"
    )
    
    func main() {
    	// ------------------------------- 1. 初始化 consul 客户端 -------------------------------
    	// 1、初始化 consul 配置
    	consulConfig := api.DefaultConfig()
    	// consulConfig.Address = "127.0.0.1:8500"  // 默认consul服务的地址,如有改变,重新指定
    	// 2、获取consul操作对象
    	consulClient, _ := api.NewClient(consulConfig)
    	// ------------------------------- 2. 基于consul解析UserService的address -------------------------------
    	usersServiceEntry, _, _ := consulClient.Health().Service("UsersService", "test", false, nil)
    	usersServicePtr := usersServiceEntry[0].Service // service 指针对象
    	userAddress := usersServicePtr.Address + ":" + strconv.Itoa(usersServicePtr.Port)
    	// ------------------------------- 3. 基于GRPC连接和调用 -------------------------------
    	// 1、建立连接
    	userGrpcClient, err := grpc.Dial(userAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
    	if err != nil {
    		fmt.Println(err)
    	}
    	// 2、注册客户端
    	userClient := users.NewUsersClient(userGrpcClient)
    	// 3. 调用接口1:增加用户
    	res1, _ := userClient.AddUser(context.Background(), &users.AddUserReq {
    		User: &users.UsersModel {
    			Name:   "测试",
    			Age:   20,
    		},
    	})
    
    	fmt.Println(res1)
    	fmt.Println()
    
    	// 4. 调用接口2:获取数据
    	res2, _ := userClient.GetUser(context.Background(), &users.GetUserReq{})
    	fmt.Println(res2.UserList)
    
    	// ------------------------------- 4. 以上完成了 users 服务的调用,如果需要调用其他服务,仍需重复步骤2,获取其他服务的入口,再次进行步骤3处理 TODO -------------------------------
    }
    
  • 以上的调用,可以进行适当的封装来满足不同业务的调用,仅供演示

  • 当然结合数据库操作封装功能完成闭环调用,不再赘述

  • 在 demo/client 下执行 $ go mod tidy

  • 运行起来,$ go run main.go 发现服务端,客户端控制台都打印输出出来了

grpc使用consul做服务注册与发现 grpc consul 阅读详情

相关推荐

从零搭建 Go kit 微服务:Consul 服务发现和负载均衡指南

深入理解 Go kit 服务发现:Consul 集成最佳实践 Go kit 中的 Endpointer、Instancer 和 Balancer:Consul 服务发现解析

jsjbrdzhh的博客 1136

微服务 — gRPC+Consul项目实践

微服务 — gRPC+Consul项目实践 1、基于gRPC搭建采集类服务 2、基于Consul实现服务发现

xuanyu.li的博客 822

golang consul-grpc 服务注册与发现

在微服务架构里面,每个小服务都是由很多节点组成,节点的添加删除故障希望能对下游透明,因此有必要引入一种服务的自动注册和发现机制,而 consul 提供了完整的解决方案,并且内置了对 GRPC 以及 HTTP 服务的支持 总体架构 服务调用: client 直连 server 调用服务 服务注册: 服务端将服务的信息注册到 consul 里 服务发现: 客户端从 consul 里发现服...

hatlonely的专栏 6279

[golang 微服务] 6. GRPC微服务集群+Consul集群+grpc-consul-resolver案例演示

GRPC微服务集群+Consul集群+grpc-consul-resolver案例演示

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 3544

Golang GRPC Consul微服务demo

本文用到的语言是golang consul是用docker搭建的 端口8500 先启动consul,并在本地打开http://localhost:8500 因为是rpc服务,所以先编写proto文件 syntax = "proto3"; option go_package = "./;pb"; package pb; message Person { string name=1; int32 age=2; } //添加rpc服务 service hello { rpc sayHello

weixin_38418601的博客 699

微服务:go-microv4服务注册与发现+consul服务

因为项目需要,要使用go-micro框架,将已经实现的网站功能转到微服务里面实现,所以经过了许许多多踩坑之后终于实现了初步的demo。本文会记录实现过程和中间遇到的问题,希望能帮助到大家。

qq_34106714的博客 1134

8.12gRPC与consul配合使用

title date comments categories tags permalink gRPC与consul配合使用 2020/5/10 true 微服务 微服务 8.12 consul简介 Consul是一个服务网格(微服...

libing的专栏 926

【高等数值分析】Krylov子空间方法

文章目录1. 预备理论1.1 Krylov 子空间1.2 最佳逼近1.2.1 方法一:最佳平方逼近1.2.2 方法二:假设 AAA 对称正定1.2.3 方法三:残差2范数2. 基底正交化2.1 Arnoldi 过程(CGS)2.2 改进 Arnoldi 过程(MGS)2.3 Lanczos过程3. 方程组求解3.1 全正交方法 (FOM)3.2 D-Lanczos方法3.3 广义极小残量法(GMRES)3.4 MINRES 方法 1. 预备理论 现在需要求解一个大规模稀疏方程组 Ax=bAx=bAx=b,可

Glooow的博客 1万+

Go 微服务 RPC 实践:从 IDL 定义到 SDK 调用的完整链路

RPC(远程过程调用)是企业微服务架构的核心技术,通过IDL定义接口契约并自动生成SDK,实现高效跨服务通信。主要流程包括:定义Protobuf格式IDL、平台生成包含客户端初始化和接口方法的Go SDK、项目集成调用。相比HTTP,RPC具有二进制传输、强接口约束、高性能等优势,适合内部微服务通信。企业实践中通常基于gRPC等成熟框架,结合服务发现机制,实现高可用调用。关键原则是内部服务采用RPC保证性能,对外接口使用HTTP确保通用性。

m0_73884648的博客 1080

K8S证书过期解决办法之替换证书

k8s证书过期解决方案之替换证书

q_hsolucky的博客 1万+

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 894

[golang 微服务] 7. go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 6967

YOLOv11在视频流中的时序建模改进-(加入ConvLSTM或Transformer捕捉帧间关联)

本文提出了一种结合ConvLSTM和Transformer的改进YOLOv11算法,用于增强视频目标检测的时序建模能力。针对视频检测中运动模糊、遮挡等挑战,研究分析了ConvLSTM的局部时空特征建模和Transformer的全局注意力机制之间的互补性。通过数学公式详细阐述了ConvLSTM的门控机制和Transformer的自注意力计算原理,并提出分层融合策略:底层使用ConvLSTM处理高分辨率特征捕捉局部运动,高层应用Transformer建立全局时空关联。改进方案在YOLOv11架构中插入时序增强模

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 680

[golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群

.微服务服务发现介绍,安装以及consul的使用,Consul集群的部署以及使用

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 3166

Vue3 - 完美解决高德地图定位失败 Get ipLocation failed.Geolocation permission denied.(获取ipLocation失败。地理定位权限被拒绝。)

Get ipLocation failed.Geolocation permission denied.,vue3引入高德地图当前定位失败 ,vue3中使用高德地图定位报错,高德地图API用户定位失败,高德地图H5 定位失败报错排查和解决方案,微信公众号H5网页高德地图定位报错,谷歌浏览器-高德地图定位失败geolocation,getCurrentPosition 返回的 message报错,如何解决此问题,uniapp h5高德地图,微信、QQ等内置浏览器定位失败,高德地图实现实时用户位置定位,引入高德

🏆 前端领域优质创作者 4172

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

gRPC Web 应用实战从入门到精通(四):构建支持自发现的 gRPC 微服务(基于 Consul)

摘要: 本文介绍了如何构建支持自发现的gRPC微服务,使用Consul实现服务注册、发现与负载均衡。通过Docker快速部署Consul,并演示如何将gRPC服务注册到Consul,同时实现健康检查。客户端通过动态获取服务实例列表,结合gRPC负载均衡策略,实现多实例请求分配。代码示例展示了服务端注册逻辑和健康检查配置,为微服务架构提供了可扩展的解决方案。

写写代码做做饭 6190

微信小程序 - 实现人脸识别对比+人脸相似度数据,用户从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,微信小程序检测人脸相似度(免费纯前端方案+调用第三方API接口方案)

微信小程序实现人脸识别对比,微信小程序人脸对比 人脸对比识别 人脸对比相似度,实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,小程序人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,微信小程序人脸相似度对比分析,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。小程序如何实现人脸相似度比对,小程序纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,调用百度AI的人脸识别,微信小程序中实现人脸识别认证,实现人脸检测、人脸

🏆 前端领域优质创作者 4864

Docker安装consul + go使用consul + consul知识

集中式LB方案,如下图。首先,服务的消费方和提供方不直接耦合,而是在服务消费者和服务提供者之间有一个独立的LB(LB通常是专门的硬件设备如F5,或者基于软件如LVS,HAproxy等实现)。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务时,它向LB发起请求,由LB以某种策略(比如Round-Robin)做负载均衡后将请求转发到目标服务。LB一般具备健康检查能力,能自动摘除不健康的服务实例。服务消费方如何发现LB呢?

zwl153910的博客 1609

YOLO26 多任务统一架构:检测 / 分割 / 姿态 / OBB 设计

YOLO26提出了一种多任务统一架构,整合了目标检测、实例分割、姿态估计和旋转框检测(OBB)四大计算机视觉任务。该架构采用共享Backbone和Neck的设计,配合轻量级任务特定Head,解决了传统方法中多模型并行带来的高开发成本、大内存占用和低推理效率问题。核心设计包括:1)共享特征提取层实现参数复用;2)模块化Head结构支持灵活任务组合;3)统一接口实现单模型多任务处理。实验表明,该架构在保持各任务性能的同时显著提升了系统效率,为多任务视觉系统提供了新的实现范式。

一键难忘的博客 706

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

go grpc测试_我用 php 调通了 go-micro 的grpc服务

我们都知道搞微服务,除了拥有完美生态的java Spring Cloud那套,golang的微服务架构也是非常理想的。而且golang相比java 的臃肿内存占用更小,golang引入了协程并发粒度相比java的多线程先对更小,更可控,并发学习成本更低,不得不说golang就是趋势。 但是相对国内来说,使用golang中小企业较少,而大多数从14,15年开始的中小型公司一直使用php,为了统一技术...

weixin_39750854的博客 254

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

go语言微服务项目,高级篇--02micro-consul-grpc-gomicro框架

作业:grpc 远程调用。 服务端 grpc 初始一个 grpc 对象 注册服务 设置监听, 指定 IP、port 启动服务。---- serve() 客户端 grpc 连接 grpc 服务 给 grpc.Dial() 传参2 : grpc.WithInsecure() . 表示:以安全的方式操作。 初始化 grpc 客户端 调用远程服务。 给 grpc.SayHello() 传参1: context.TODO() 表示:空对象。 go-mirco micro 简介 go-

无尘的躺坑记录 776

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

go-micro+grpc+web+consul微服务基于linux操作系统

这些天学习go-micro不断的踩坑,才有了这篇文章,大概是目前使用micro+grpc+consul+web最新的配置。 首先为了和我同步,避免配置不相同,先说明一下我的环境 go version go1.14.12 linux/amd64 micro version 1.18.0 Consul 0.6.4.dev Consul Protocol: 3 (Understands back to: 1) 系统是ubuntu-linux 可以根据我的版本进行配置,可以大概率避免出错 第一步开启consul 首

Xiang_lhh的博客 2398

【启程Golang之旅】Go-Micro框架的高效开发技巧

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。

ztK63LrD的博客 1831

构建高可用微服务通信层:基于 Go + gRPC 的服务架构设计与实现

/ 请求前:记录日志// 执行业务逻辑// 请求后:统计耗时解耦通用逻辑与业务代码,减少重复代码,提升可维护性。4. 服务注册与发现:集成 Consul为实现多实例部署下的高可用与负载均衡,需将 gRPC 服务注册到服务发现中心。

Landcc的博客 1286

2026 Go微服务全栈实战:Gin框架+gRPC通信+Consul服务注册发现+Nacos配置中心+GORM数据库操作+ProtoBuf+负载均衡+优雅停机完整指南

Go微服务全栈开发实战指南(2026) 本文提供基于Go语言的微服务全栈开发完整解决方案,涵盖以下核心技术组件: 核心架构 采用Gin框架构建Web层 使用gRPC实现高效服务间通信 Consul实现服务注册与发现 Nacos作为分布式配置中心 关键技术点 数据库操作:GORM集成与连接池优化 协议定义:ProtoBuf代码生成规范 负载均衡:轮询策略实现 运维保障:优雅停机机制 健康检查:服务状态监控 开发流程 从Proto定义到服务注册的全链路实现 动态配置管理方案 生产级连接池调优建议 健康检查与负载

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 2471
上一篇: Go微服务: 基于Go Micro框架实现微服务调用
下一篇: Jenkins: 搭建Jenkins服务,调通Webhook链路
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值