当前位置: 首页 > news >正文

[Go 微服务] go-micro + consul 的使用

文章目录

      • 1.go-micro 介绍
      • 2.go-micro 的主要功能
      • 3.go-micro 安装
      • 4.go-micro 的使用
        • 4.1 创建服务端
        • 4.2 配置服务端 consul
        • 4.3 生成客户端
      • 5.goodsinfo 服务
        • 5.1 服务端开发
        • 5.2 客户端开发

1.go-micro 介绍

Go Micro是一个简化分布式开发 的微服务生态系统,该系统为开发分布式应用程序提供了 高效, 便捷的模块构建, 主要目的是 简化分布式系统的开发,它默认实现了 consul作为服务发现(2019年源码修改了默认使用 mdns),通过 http进行通信,通过 protobuf和 json进行编解码,可以方便开发者们非常简单的开发出微服务架构的项目,并且随着业务模块的增加和功能的增加,Go Micro还能够提供管理微服务环境的工具和功能。

2.go-micro 的主要功能

  1. 身份验证
  2. 动态配置
  3. 数据存储
  4. 服务发现: 自动服务注册和 名称解析,服务发现是 微服务开发的核心,当服务 A 需要与服务 B 通话时,它需要该服务的位置,默认发现机制是 多播 DNS (mdns),一个 zeroconf 系统。
  5. 负载均衡
  6. 消息编码: 基于 内容类型的 动态消息编码,客户端和服务器将使用 编解码器和 内容类型无缝编码和解码 Go 类型,任何种类的消息都可以被编码并从不同的客户端发送,默认情况下,客户端和服务器会处理此问题,这默认包括 protobuf 和 json。
  7. RPC 客户端/服务器
  8. Async Messaging: PubSub 作为 异步通信和 事件驱动架构的一等公民内置, 事件通知是 微服务开发的核心模式,默认消息系统是 HTTP 事件消息代理。
  9. 事件流: 从偏移量和确认中消耗,Go Micro 包括对 NATS Jetstream 和 Redis 流的支持。
  10. 同步分布式系统通常以 最终一致的方式构建,对 分布式锁定和 领导(Leader)的支持作为同步接口内置,当使用 最终一致的数据库或 调度时,请使用 Sync 接口。
  11. Pluggable Interfaces: Go Micro 为每个分布式系统抽象使用 Go 接口,因此,这些接口是 可插拔的,并 允许 Go Micro 与运行时无关,可以插入任何底层技术。

3.go-micro 安装

go install github.com/go-micro/cli/cmd/go-micro@latest

在这里插入图片描述

在这里插入图片描述

4.go-micro 的使用

4.1 创建服务端
go-micro new service helloworld

在这里插入图片描述

在这里插入图片描述

#init里面的命令:引入需要的包
go get -u google.golang.org/protobuf/proto
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest
#proto:执行生成对应的protobuf相关文件
protoc --proto_path=. --micro_out=. --go_out=:. proto/helloworld.proto

会生成相关 .pd.go 文件

在这里插入图片描述

go mod tidy

在这里插入图片描述

go get go-micro.dev/v4

在这里插入图片描述

4.2 配置服务端 consul
go get github.com/go-micro/plugins/v4/registry/consul

在这里插入图片描述

# 实例化consul
consulReg := consul.NewRegistry()# 注册consul
srv := micro.NewService(micro.Address("192.168.1.132:8080"),  // 选择注册服务器地址,默认为本机,也可以选择consul集群中的clientmicro.Name(service),micro.Version(version),micro.Registry(consulReg),
)

main.go

package mainimport ("helloworld/handler"pb "helloworld/proto""go-micro.dev/v4""go-micro.dev/v4/logger""github.com/go-micro/plugins/v4/registry/consul"
)var (service = "helloworld"version = "latest"
)func main() {//集成consulconsulReg := consul.NewRegistry()// Create servicesrv := micro.NewService(micro.Address("127.0.0.1:8080"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的clientmicro.Name(service),micro.Version(version),//注册consulmicro.Registry(consulReg),)srv.Init(micro.Name(service),micro.Version(version),)// Register handlerif err := pb.RegisterHelloworldHandler(srv.Server(), new(handler.Helloworld)); err != nil {logger.Fatal(err)}// Run serviceif err := srv.Run(); err != nil {logger.Fatal(err)}
}
go run main.go

在这里插入图片描述

在这里插入图片描述

服务端配置操作完成

4.3 生成客户端
go-micro new client helloworld

在这里插入图片描述

在这里插入图片描述

需要把helloworld/proto修改为helloworld-client/proto

在这里插入图片描述

go mod tidygo get github.com/go-micro/plugins/v4/registry/consul 

main.go

package mainimport ("context""time"pb "helloworld-client/proto""go-micro.dev/v4""go-micro.dev/v4/logger"   "go-micro.dev/v4/registry""github.com/go-micro/plugins/v4/registry/consul"
)var (service = "helloworld" //需要和微服务服务端对应的service名统一,这样才能调用该微服务version = "latest"
)func main() {//集成consulconsulReg := consul.NewRegistry(//指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的clientregistry.Addrs("127.0.0.1:8500"),)// Create servicesrv := micro.NewService(//注册consulmicro.Registry(consulReg),)srv.Init()// 创建客户端实例c := pb.NewHelloworldService(service, srv.Client())for {// Call service: CallRequest就是.proto中的rsp, err := c.Call(context.Background(), &pb.CallRequest{Name: "张三"})if err != nil {logger.Fatal(err)}logger.Info(rsp)//每隔一段时间请求time.Sleep(2 * time.Second)  // 每隔2秒请求}
}

客户端:

在这里插入图片描述

服务端:

在这里插入图片描述

客户端配置操作完成

5.goodsinfo 服务

5.1 服务端开发
go-micro new service goodsinfo

goodsinfo.proto

syntax = "proto3";package goodsinfo;option go_package = "./proto;goodsinfo";//商品相关方法
service Goodsinfo {//AddGoods: 定义增加商品的微服务, 这里的写法和gRPC中的写法一致rpc AddGoods(AddRequest) returns (AddResponse) {}
}//和gRPC中的写法一致
message AddRequest {string title = 1;string price = 2;string content = 3;
}//和gRPC中的写法一致
message AddResponse {string message = 1;bool success = 2;
}
#init:引入相关包
go get -u google.golang.org/protobuf/proto
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest
#proto: 生成protobuf相关文件
protoc --proto_path=. --micro_out=. --go_out=:. proto/goodsinfo.proto
go get go-micro.dev/v4
go mod tidy

修改远程调用的方法handler/goodsinfo.go

package handlerimport ("context""go-micro.dev/v4/logger"pb "goodsinfo/proto"
)type Goodsinfo struct{}func (e *Goodsinfo) AddGoods(ctx context.Context, req *pb.AddRequest, rsp *pb.AddResponse) error {logger.Infof("request: %v", req)//书写返回的逻辑结果rsp.Message = "增加成功"rsp.Success = truereturn nil
}

引入consul

go get github.com/go-micro/plugins/v4/registry/consul 

maiin.go

package mainimport ("goodsinfo/handler"pb "goodsinfo/proto""go-micro.dev/v4""go-micro.dev/v4/logger""github.com/go-micro/plugins/v4/registry/consul"
)var (service = "goodsinfo"version = "latest"
)func main() {//集成consulconsulReg := consul.NewRegistry()// Create servicesrv := micro.NewService(micro.Address("127.0.0.1:8080"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的clientmicro.Name(service),micro.Version(version),//注册consulmicro.Registry(consulReg),)srv.Init(micro.Name(service),micro.Version(version),)// Register handlerif err := pb.RegisterGoodsinfoHandler(srv.Server(), new(handler.Goodsinfo)); err != nil {logger.Fatal(err)}// Run serviceif err := srv.Run(); err != nil {logger.Fatal(err)}
}
go run main.go

在这里插入图片描述

在这里插入图片描述

服务端开发成功

5.2 客户端开发

在这里插入图片描述

go get go-micro.dev/v4go get github.com/go-micro/plugins/v4/registry/consulgo mod tidy

main.go

package mainimport ("context""go-micro.dev/v4/registry""time"pb "goodsinfo-client/proto""go-micro.dev/v4""go-micro.dev/v4/logger""github.com/go-micro/plugins/v4/registry/consul"
)var (service = "goodsinfo"version = "latest"
)func main() {//集成consulconsulReg := consul.NewRegistry(//指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的clientregistry.Addrs("127.0.0.1:8500"),)// Create servicesrv := micro.NewService(//注册consulmicro.Registry(consulReg),)srv.Init()// 创建客户端服务c := pb.NewGoodsinfoService(service, srv.Client())// Call servicersp, err := c.AddGoods(context.Background(), &pb.AddRequest{Title: "我是一个商品",Price: "20.22",Content: "内容展示",})if err != nil {logger.Fatal(err)}logger.Info(rsp)
}

在这里插入图片描述

go run .\main.go

在这里插入图片描述

客户端开发成功, 并通过consul调用服务端的请求

在这里插入图片描述

相关文章:

[Go 微服务] go-micro + consul 的使用

文章目录 1.go-micro 介绍2.go-micro 的主要功能3.go-micro 安装4.go-micro 的使用4.1 创建服务端4.2 配置服务端 consul4.3 生成客户端 5.goodsinfo 服务5.1 服务端开发5.2 客户端开发 1.go-micro 介绍 Go Micro是一个简化分布式开发 的微服务生态系统,该系统为开…...

嵌入式网页服务实现

嵌入式网页服务的实现方式主要可以归纳为以下几种: 单片机Webchip网关: Webchip:作为专用网络接口芯片,独立于单片机与网关,通过SPI接口与MCU进行指令交互,并通过RS232、USB、Modem等接口与PC作为网关进行通…...

python---OpenCv(二),背景分离方法较有意思

目录 边界矩形 旋转矩形(最小外接矩形): 计算轮廓 找4个点的坐标 把浮点型转为Int 画轮廓 边界矩形--(最大外接矩形) 转灰度 找轮廓 找顶点 画矩形 显示 背景分离方法(这个很好玩,可以识别在动的物体) 边…...

java TCP服务器与客户端通信示例

目录 背景: TCP服务代码解析: TCP服务器的代码: 服务器程序的工作流程: TCP客户端代码解析 : TCP客户端代码: 客户端工作流程: 总结: 背景: 如何使用Java编程语言实现一个简单的TCP服务器和客户端。那么TCP是什么?TCP(Transmission Control Protocol&…...

【C++】构造函数和析构函数

目录 对象初始化-构造函数构造函数的分类构造函数的调用拷贝构造的应用构造函数调用规则深拷贝和浅拷贝初始化列表类对象作为类成员静态成员 对象释放-析构函数 对象初始化-构造函数 构造函数是类实例化的时候会自动调用的初始化函数,如果用户不写编译器会提供一个…...

Docker Compose:多容器应用的管理利器

在现代应用开发中,微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具,通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例&#xff0c…...

Leetcode - 133双周赛

目录 一,3190. 使所有元素都可以被 3 整除的最少操作数 二,3191. 使二进制数组全部等于 1 的最少操作次数 I 三,3192. 使二进制数组全部等于 1 的最少操作次数 II 四,3193. 统计逆序对的数目 一,3190. 使所有元素都…...

C++总结

...

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车,累计行驶里程约为28.4万km,车主反映车辆无法加速。 故障诊断 接车后路试,行驶约1 km,踩下加速踏板,无法加速,车速为20 km/h左右,同时组合仪表上的电机及控制…...

前端开发之webpack

安装与入门超详细!webpack入门教程(一)-腾讯云开发者社区-腾讯云...

将内容复制到剪贴板?分享 1 段优质 JS 代码片段!

大家好,我是大澈! 本文约 600 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 JS 代码片段,使用 Clipboard API 实现将内容复制到剪贴板。 老规矩,先阅读代码片段并思考,再看代码解析…...

MAS0902量产工具分享,MAS0902A开卡教程,MAS0901量产工具下载

MAS0902和MAS1102都是基于SATA3.2技术开发的DRAM-less SSD控制芯片,简单来说就是SATA协议无缓存主控。下面是我摸索的麦光黑金300 240G SSD开卡修复简易教程,也就是MAS0902量产过程: 注意:开卡转接线必须要用ASM1153E或JMS578主控…...

从我邮毕业啦!!!

引言 时间过的好快,转眼间就要从北邮毕业了,距离上一次月度总结又过去了两个月,故作本次总结。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star! 毕业🎓 6月1号完成了自己的…...

gemini 1.5 flash (node项目)

https://www.npmjs.com/package/google/generative-ai https://ai.google.dev/pricing?hlzh-cn https://aistudio.google.com/app/apikey https://ai.google.dev/gemini-api/docs/models/gemini?hlzh-cn#gemini-1.5-flash https://ai.google.dev/gemini-api/docs/get-started…...

在线字节大端序小端序转换器

具体请前往:在线字节大端序小端序转换器...

css_17_背景属性鼠标属性

一.背景属性 -属性值:background-color(设置背景颜色) 默认背景颜色是 transparent。 -属性值:background-image(设置背景图片) url(图片的地址) -属性值:background-re…...

Python hash编码(go hash编码)

id"中国人" 首先,go语言hash: import (mmh3 "murmurhash3") mmh3.Murmurhash3([]byte(id)) 对应到Python hash编码,可以直接使用mmh3 import mmh3 mmh3.hash(id,signedFalse) 其源码可以表示为 def sum32WithSeed(datas, seed…...

004 插入排序(lua)

文章目录 123 1 -- Lua中没有类和方法的概念,所以我们将所有功能都写在一个脚本中 -- 交换数组中两个元素的功能 local function swap(arr, i, j) local temp arr[i] arr[i] arr[j] arr[j] temp end -- 插入排序算法的实现 local function insertionS…...

计算机网络 —— 基本概念

基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…...

高精度除法的实现

高精度除法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现 在这里就不再详细讲解,只讲解主体过程qwq 主体过程 高精度除法的原理和小学学习的竖式除法是一样的。 …...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...