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)中心签发的,包含公开密钥拥有者信息以及公开密…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...
