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

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; }格式&#xff1a; auto functionname [capture](parameters) -> return_type { /* … */ }; &#xff08;1&#xff09;[capture] &a…...

SwiftUI的context Menu

SwiftUI的 context Menu 现在来演示一下如何使用 SwiftUI 的 Context Menu 。 代码&#xff1a; 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堆的插入&#xff08;向上调整&#xff09;3.2堆的删除&#xff08;向下调整&#xff09;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文件夹下的&#xff0c;一串字符串命名的文件特别大几乎把磁盘占满了 网上查到/tmp文件是临时文件&#xff0c;由于hiveserver2任务运行异常导致缓存未删除&#xff0c;正常情况下…...

《互联网的世界》第七讲-能源

本想聊聊 tcp 和 quic&#xff0c;但这些都属于术的范畴&#xff0c;变化多端&#xff0c;等孩子们长大了又不知变成什么样子了&#xff0c;趁这段时间在家&#xff0c;还是得讲一些相对不变的东西&#xff0c;或法或势。 从 安阳卖血糕的精巧篦子 想到如何做圆米粉和圆面条&a…...

前端代码整洁与规范之CSS篇

一、代码整洁 1. 命名规范 CSS 类名的命名应该简洁清晰&#xff0c;能够准确描述元素的作用。避免使用无意义的名称&#xff0c;例如“a”、“b”等&#xff0c;而应该使用有意义的英文单词或单词缩写。同时&#xff0c;也要避免使用驼峰命名法和下划线命名法混杂使用&#x…...

在【IntelliJ IDEA】中配置【Tomcat】【2023版】【中文】【图文详解】

作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;IntelliJ IDEA为Web服务器提供了卓越的支持&#xff0c;从而极大地简化了程序员在Web开发过程中的工作流程。学习Java Web开发实质上就是掌握如何创造动态Web资源&#xff0c;这些资源在完成开发后&…...

【SSM】任务列表案例 基本CRUD SSM整合

文章目录 一、案例功能预览二、接口分析三、前端工程导入四、后端程序实现和测试4.1 准备4.2 功能实现4.2.1 分页查询显示4.2.2 添加计划4.2.2 删除计划4.2.3 修改计划 4.3 前后联调 一、案例功能预览 Github 地址 &#xff1a; ssm-integration-part 二、接口分析 学习计划…...

基于微信小程序的校园跑腿小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

网络学习:9个计算机的“网络层”知识点

目录 一、IP 地址 1.1 分类表示法&#xff1a; 1.1.1 分类表示地址的其他说明 1.2 无分类编址 CIDR 二、IP 数据报文格式 Q: IP 报文里有什么&#xff1f;可以不按顺序或者字节来讲一讲 三、 路由概念 3.1 路由表 3.2 路由网络匹配 3.3 ARP 解析 3.4 RARP 逆地址解析…...

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm&#xff0c;可能会导致原本的idea失效&#xff0c;注册码过期 3、taobao的npm过期&#xff0c;导致npm is sass执行不成功&#xff0c;需…...

C++for语句

1.求平均年龄 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位 输入 第1行有一个整数n(1 <= n <=100),表示学生的人数;其后n行每行有1个整数,表示每个学生的年龄,取值为15~25 输出 一行,包含一个浮点数,为所求的平…...

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…...

【网络安全】-数字证书

数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据&#xff0c;它为网络应用提供了一种验证通信实体身份的方式。具体来说&#xff0c;数字证书是由权威的证书授权&#xff08;CA&#xff09;中心签发的&#xff0c;包含公开密钥拥有者信息以及公开密…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...

游戏开发中常见的战斗数值英文缩写对照表

游戏开发中常见的战斗数值英文缩写对照表 基础属性&#xff08;Basic Attributes&#xff09; 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...