Go微服务: 基于Go Micro框架实现微服务调用
Go Micro
1 )概述
- 在具体的项目开发过程中,开发者聚焦的是业务逻辑的开发和功能的实现
- 大量的环境配置,调试搭建等基础性工作会耗费相当一部分的精力
- 因此有必要将微服务架构中所涉及到的,相关的解决方案做集中管理和维护
- Go Micro 帮助我们解决了大部分上述问题,它是一个简化分布式开发的微服务生态系统
- 该系统为开发分布式应用程序提供了高效,便捷的模块构建, 主要目的是简化分布式系统的开发
- 它默认实现了consul 作为服务发现,通过http进行通信,通过protobuf和json进行编解码
2 ) 功能
- 身份验证
- 身份验证作为一等公民内置身份验证和授权通过为每个服务提供身份和证书
- 来实现安全的零信任网络, 这还包括基于规则的访问控制
- 动态配置
- 从任何地方加载和热重载动态配置
- config 接口提供了一种从任何来源(如环境变量、文件、etcd)加载应用程序级别配置的方法
- 可以合并源,甚至定义回退数据存储- 一个简单的数据存储接口,用于读取、写入和删除记录
- 它默认包括对内存、文件和CockroachDB 的支持
- 状态和持久性成为原型设计之外的核心要求,Micro 希望将其构建到框架中
- 服务发现
- 自动服务注册和名称解析。服务发现是微服务开发的核心
- 当服务 A 需要与服务 B 通话时,它需要该服务的位置
- 默认发现机制是多播 DNS (mdns),一个 zeroconf 系统
- 负载平衡
- 基于服务发现的客户端负载平衡
- 一旦我们有了任意数量的服务实例的地址,
- 我们现在需要一种方法来决定路由到哪个节点
- 我们使用随机散列负载平衡来提供跨服务的均匀分布,并在出现问题时重试不同的节点
- 消息编码
- 基于内容类型的动态消息编码
- 客户端和服务器将使用编解码器和内容类型为您无缝编码和解码 Go 类型
- 任何种类的消息都可以被编码并从不同的客户端发送
- 默认情况下,客户端和服务器会处理此问题
- 这默认包括 protobuf 和 json
- RPC 客户端/服务器
- 基于 RPC 的请求/响应,支持双向流。我们为同步通信提供了一个抽象
- 对服务的请求将被自动解析、负载平衡、拨号和流式传输
- Async Messaging
- PubSub 作为异步通信和事件驱动架构的一等公民内置
- 事件通知是微服务开发的核心模式
- 默认消息系统是 HTTP 事件消息代理。
- 事件流
- PubSub 非常适合异步通知,但对于更高级的用例,事件流是首选
- 提供持久存储,从偏移量和确认中消耗
- Go Micro 包括对 NATS Jetstream 和 Redis 流的支持
- 同步
- 分布式系统通常以最终一致的方式构建
- 对分布式锁定和领导的支持作为同步接口内置
- 当使用最终一致的数据库或调度时,请使用 Sync 接口
- Pluggable Interfaces
- Go Micro 为每个分布式系统抽象使用 Go 接口
- 因此,这些接口是可插拔的,并允许 Go Micro 与运行时无关
- 您可以插入任何底层技术
3 )环境准备:
- 先安装工具:https://github.com/go-micro/cli
- 进行安装 $
go install github.com/go-micro/cli/cmd/go-micro@latest - 验证: $
go-micro -v, 查看输出go-micro version v1.1.4 - 运行起来 consul $
consul agent -dev,访问 http://localhost:8500 可看到默认的一个服务- consul的安装配置参考如下
- https://blog.csdn.net/Tyro_java/article/details/129989046
- https://blog.csdn.net/Tyro_java/article/details/129992606
4 )创建一个名为 helloworld 的服务端
- 在demo项目中,新建 demo/server目录
- 在这个 server 目录下执行 $
go-micro new service helloworld - 进入这个目录 $
cd helloworld可以看到里面生成了一系列的文件 - 在 Linux(Mac)上执行 $
make init proto update tidy - 可以看到这个Make文件中封装了很多命令,方便了我们的操作
- 改编 main.go
package mainimport ("fmt""helloworld/handler"pb "helloworld/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"version = "latest" )func main() {consulReg := consul.NewRegistry(registry.Addrs("127.0.0.1:8500"),)fmt.Println(consulReg.Options())// Create servicesrv := micro.NewService(micro.Name(service),micro.Address("127.0.0.1:8080"), // 可以指定端口micro.Version(version),micro.Registry(consulReg),)srv.Init()// 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 mod tidy - 运行起来 $
go run main.go - 在注册中心可发现多出来一个新的服务,点进去就是这个 127.0.0.1:8080的 helloworld 新服务
5 )创建一个名为 helloworld-client 的客户端
- 新建 demo/client 目录
- 在这个目录下执行 $
go-micro new client helloworld - $
cd helloworld-client - $
make update tidy - 这里仍旧使用服务端的proto,但是之前的workspace管理不适合这里的模式,修改起来较为麻烦
- 这里将其拷贝到 helloworld-client 目录中,后期可单独做一个模块来管理
- 改编 main.go
package mainimport ("context""time"pb "helloworld-client/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.Registry(consulReg),)srv.Init()// Create clientc := pb.NewHelloworldService(service, srv.Client())for {// Call servicersp, err := c.Call(context.Background(), &pb.CallRequest{Name: "张三"})if err != nil {logger.Fatal(err)}logger.Info(rsp)time.Sleep(1 * time.Second)} }- 可以看到,这里写了一个无限循环的调用
- 这里添加了一些工具库,重新运行下 $
go mod tidy - 运行起来 $
go run main.go - 好,发现客户端和服务端的控制台都一直在输出:请求,响应,请求,响应, …
相关文章:
Go微服务: 基于Go Micro框架实现微服务调用
Go Micro 1 )概述 在具体的项目开发过程中,开发者聚焦的是业务逻辑的开发和功能的实现大量的环境配置,调试搭建等基础性工作会耗费相当一部分的精力因此有必要将微服务架构中所涉及到的,相关的解决方案做集中管理和维护Go Micro …...
大模型prompt提示词如何调优?
当使用大型模型(如GPT-3.5)时,可以通过优化提示(prompt)来引导模型生成更加符合预期的内容。以下是一些调优提示词的建议: 1、清晰的问题陈述:确保你的问题或提示清晰、简明,能够准…...
【Python/crawl】如何使用Python爬虫将一系列网页上的同类图片下载到本地
【需求】 从网页https://www.zhainq.com/%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f%e6%9c%ba%e6%9e%84/%e6%97%a5%e6%9c%ac%e7%be%8e%e5%a5%b3%e5%86%99%e7%9c%9f/109012.html 开始,有十七页,每页都有大漂亮“小濑田麻由”的若干图片,想要将其…...
Postgresql 连接数查看,死锁问题解决
-- 查看所有连接 select * -- datname,pid,application_name,state from pg_stat_activity; -- 查询最大连接数 select max_conn-now_conn as resi_conn from (select setting::int8 as max_conn,(select count(*) from pg_stat_activity) as now_conn from pg_settings where…...
ssm蛋糕甜品商城系统(程序+文档+数据库)
** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…...
算法空间复杂度计算
目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法(递归实现)的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…...
C++ lambda函数个人理解
及方便自己在函数内部定义函数 int main() {int i 1;auto c [](int a, int c) {return ab;};int d a(2, i);cout<<c;return 0; }格式: auto functionname [capture](parameters) -> return_type { /* … */ }; (1)[capture] &a…...
SwiftUI的context Menu
SwiftUI的 context Menu 现在来演示一下如何使用 SwiftUI 的 Context Menu 。 代码: import SwiftUIstruct ContextMenuBootCamp: View {State var bgColor: Color .purplevar body: some View {VStack(alignment: .leading, spacing: 10.0) {Image(systemName: …...
【数据结构】树与堆 (向上/下调整算法和复杂度的分析、堆排序以及topk问题)
文章目录 1.树的概念1.1树的相关概念1.2树的表示 2.二叉树2.1概念2.2特殊二叉树2.3二叉树的存储 3.堆3.1堆的插入(向上调整)3.2堆的删除(向下调整)3.3堆的创建3.3.1使用向上调整3.3.2使用向下调整3.3.3两种建堆方式的比较 3.4堆排…...
安装CDH平台的服务器磁盘满了,磁盘清理过程记录
1.使用hdfs命令查看哪个文件占用最大 hdfs dfs -du -h /tmp 2.我的服务器上显示/tmp/hive/hive文件夹下的,一串字符串命名的文件特别大几乎把磁盘占满了 网上查到/tmp文件是临时文件,由于hiveserver2任务运行异常导致缓存未删除,正常情况下…...
《互联网的世界》第七讲-能源
本想聊聊 tcp 和 quic,但这些都属于术的范畴,变化多端,等孩子们长大了又不知变成什么样子了,趁这段时间在家,还是得讲一些相对不变的东西,或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…...
前端代码整洁与规范之CSS篇
一、代码整洁 1. 命名规范 CSS 类名的命名应该简洁清晰,能够准确描述元素的作用。避免使用无意义的名称,例如“a”、“b”等,而应该使用有意义的英文单词或单词缩写。同时,也要避免使用驼峰命名法和下划线命名法混杂使用&#x…...
在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】
作为一款功能强大的集成开发环境(IDE),IntelliJ IDEA为Web服务器提供了卓越的支持,从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源,这些资源在完成开发后&…...
【SSM】任务列表案例 基本CRUD SSM整合
文章目录 一、案例功能预览二、接口分析三、前端工程导入四、后端程序实现和测试4.1 准备4.2 功能实现4.2.1 分页查询显示4.2.2 添加计划4.2.2 删除计划4.2.3 修改计划 4.3 前后联调 一、案例功能预览 Github 地址 : ssm-integration-part 二、接口分析 学习计划…...
基于微信小程序的校园跑腿小程序,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
网络学习:9个计算机的“网络层”知识点
目录 一、IP 地址 1.1 分类表示法: 1.1.1 分类表示地址的其他说明 1.2 无分类编址 CIDR 二、IP 数据报文格式 Q: IP 报文里有什么?可以不按顺序或者字节来讲一讲 三、 路由概念 3.1 路由表 3.2 路由网络匹配 3.3 ARP 解析 3.4 RARP 逆地址解析…...
web项目的搭建
使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm,可能会导致原本的idea失效,注册码过期 3、taobao的npm过期,导致npm is sass执行不成功,需…...
C++for语句
1.求平均年龄 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位 输入 第1行有一个整数n(1 <= n <=100),表示学生的人数;其后n行每行有1个整数,表示每个学生的年龄,取值为15~25 输出 一行,包含一个浮点数,为所求的平…...
最新基于R语言lavaan结构方程模型(SEM)技术
原文链接:最新基于R语言lavaan结构方程模型(SEM)技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…...
【网络安全】-数字证书
数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据,它为网络应用提供了一种验证通信实体身份的方式。具体来说,数字证书是由权威的证书授权(CA)中心签发的,包含公开密钥拥有者信息以及公开密…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
