Go微服务:基于net/rpc模块实现微服务远程调用

基于RPC协议实现微服务

  • 基于rpc实现跨语言调用,不限定服务提供方使用的语言
  • 在微服务架构中,每个微服务都被封装成了进程,相互独立
  • 在这里提供了客户端和服务端演示调用示例

1 )服务端

  • 新建 server/msg 目录,后执行 $ go mod init msg
  • 编辑 server/msg/main.go 文件
    package main// net 模块是go内置模块
    import ("fmt""net""net/rpc"
    )// 定义一个可供远程调用的struct
    type Msg struct {}// 为Msg这个struct添加被调用函数 GetReplay
    func (this Msg) GetReplay(req string, res *string) error {fmt.Println(req) // 服务端输出日志:请求参数*res = "这是服务端返回的信息:已收到客户端的请求参数,参数为:" + req // 这是返回信息return nil
    }func main() {// 1. 注册RPC服务err1 := rpc.RegisterName("msg", new(Msg))// 错误处理if err1 != nil {fmt.Println(err1)}// 2、监听端口listener, err2 := net.Listen("tcp", "127.0.0.1:3000")if err2 != nil {fmt.Println(err2)}// 3、应用退出的时候关闭监听端口defer listener.Close()for {// 4、建立链接conn, err3 := listener.Accept()// 错误处理if err3 != nil {fmt.Println(err3)}fmt.Print("客户端参数为: ");// 5. 绑定服务rpc.ServeConn(conn)}
    }
    
  • net包是一个 go 内置的一个模块
  • 准备调用函数 Msg.GetReplay
    • 此方法只能有两个可序列化的参数,注意第二个参数是指针类型
      • req 表示获取客户端传过来的数据
      • res 表示给客户端返回数据 (指针类型)
    • 方法要返回一个 error 类型,同时必须是公开的方法
    • req 和 res的类型不能是 channel(通道)、func(函数)
    • 因为它们均不能进行序列化
  • 整个流程如下:
    • 1 )通过 rpc.RegisterName 注册 rpc 服务,注意这里的 name 后期被客户端调用
    • 2 )通过 net.Listen 监听rpc服务,得到 listener 对象
    • 3 )通过 defer listener.Close() 应用退出时关闭监听端口
    • 4 )基于无限循环做响应处理,这里有两个环节
      • 4.1 )通过 listener.Accept() 接收连接信息,得到 conn 连接对象
      • 4.2 )通过 rpc.ServeConn(conn) 绑定服务

3 )客户端

  • 新建 client 目录,后执行 $ go mod init client

  • 这里在 client 项目目录中,新建一个 main.go 文件

  • 编辑 client/main.go 文件

    package mainimport ("fmt""net/rpc"
    )func main() {// 1. 用 rpc.Dial和rpc微服务端建立连接conn, err1 := rpc.Dial("tcp", "127.0.0.1:3000")// 错误处理if err1 != nil {fmt.Println(err1)}// 2、当客户端退出的时候关闭连接defer conn.Close()// 3. 调用远程函数var reply stringerr2 := conn.Call("msg.GetReplay", "滴滴滴", &reply)// 错误处理if err2 != nil {fmt.Println(err2)}// 4、获取微服务返回的数据fmt.Println(reply)
    }
    
  • 这里是客户端,需要经过以下几个步骤:

  • 1 )要连接的话,首先要建立连接 rpc.Dial 得到 conn 连接对象

  • 2 )添加客户端退出时的关闭连接处理 defer conn.Close()

  • 3 )基于 conn.Call 调用远程函数

    • 第一个参数,服务名.远程方法 的字符串形式
    • 第二个参数,给服务端的参数
    • 第三个参数,服务端返回的数据地址

3 )部署服务

  • 先启动服务端,再启动客户端
  • 当服务端启动的瞬间
    • 服务端接收到客户端的参数打印到服务端
    • 客户端接收到服务端的返回信息

注意

  • 在Golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持
  • Go RPC 可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式
  • Golang 官方的 net/rpc 库使用 encoding/gob 进行编解码,支持tcp或http数据传输方式
  • 由于其他语言不支持 gob 编解码方式,所以使用 net/rpc 库实现的 RPC 方法没办法进行跨语言调用
  • 另外,Golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法,JSON RPC采用JSON进行数据编解码
  • 因而支持跨语言调用,但目前的 jsonrpc 库是基于tcp协议实现的,暂时不支持使用http进行数据传输
  • 除了Golang官方提供的rpc库,还有许多第三方库为在 Golang 中实现RPC提供支持
  • 大部分第三方 RPC 库的实现都是使用 protobuf 进行数据编解码
  • 根据 protobuf 声明文件自动生成 RPC 方法定义与服务注册代码
  • 在 Golang 中可以很方便的进行 RPC 服务调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE:基于ERA5数据集(U和V风速分量)计算风速的幅值和风向

作者:CSDN @ _养乐多_ 本文将介绍使用Google Earth Engine (GEE)平台提供的API加载ERA5月度数据集,该数据集包含了从1979年至今的全球月度气象数据。然后,定义了一个数据计算函数,用于将U和V风速分量转换为风速的幅值和风向。 结果如下图所示, 文章目录 一、核心函数1…

代码随想录day36:动态规划part4,背包问题

文章目录 day36:动态规划part4,背包问题01背包416.分割等和子集 day36:动态规划part4,背包问题 01背包 https://kamacoder.com/problempage.php?pid1046 二维数组版本: dp[i][j]里的i和j表达的是什么了&#xff0…

基于docker 配置hadoop-hive-spark-zeppelin环境进行大数据项目的开发

转载于: 基于docker的spark-hadoop分布式集群之一: 环境搭建 - Fordestiny - 博客园 (cnblogs.com) ---------------------------------------------------------- 如有侵权请私信,看到私信后会立即删除... ------------------------------…

计算机设计大赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

hive分区和分桶你熟悉吗?

两种用于优化查询性能的数据组织策略,数仓设计的关键概念,可提升Hive在读取大量数据时的性能。 1 分区(Partitioning) 根据表的某列的值来组织数据。每个分区对应一个特定值,并映射到HDFS的不同目录。 常用于经常查…

Keepalived工具的基本介绍(原理:VRRP协议)

目录 一、keepalived工作原理 1、VRRP 1.1 VRRP相关术语 1.2 VRRP相关技术 1.3 VRRP工作过程 2、keepalived介绍 2.1 Keepalived架构 3、keepalived的工作原理 3.1Keepalived高可用故障切换转移原理 4、脑裂 4.1什么是脑裂? 4.2造成脑裂的原因有哪些&am…

力扣--76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如…

外边距折叠的原因和解决

参考文章 什么时候出现外边距塌陷 外边距塌陷,也叫外边距折叠,在普通文档流中,在垂直方向上的2个或多个相邻的块级元素(父子或者兄弟)外边距合并成一个外边距的现象,不过只有上下外边距才会有塌陷&#x…

podman checkpoint 性能优化

项目原因,需要使用checkpoint相关功能 团队一直比较熟悉 docker,于是开始对docker的checkpoint进行性能测试。 性能对比 docker环境 麒麟V10 SP3docker: 24criu:3.15进程: java进程, 内存约5GHDD命令 docker checkpoint create 容器ID checkpointName整个checkpoint 耗…

有什么针对新闻媒体行业的安全解决方案

对媒体行业而言,门户网站是最易受到攻击的地方。常见的攻击方式有网页篡改、挂马和被植入暗链等。门户网站作为新闻媒体对外的第一扇门,通常承载了大量的流量,一旦遭到攻击,造成的影响会更具有可怕的“传播力”。那么我们应该如何…

搭建一款实用的个人IT工具箱——it-tools

一、it-tools介绍 IT-Tools是一款开源的个人工具箱,专为IT从业人员打造,支持Docker私有化部署,包含众多实用的IT工具。其功能丰富多样,涵盖二维码生成、数据格式转换、MAC地址生成等,可满足用户多样化的需求。 二、本…

开源的python代码分析工具介绍

本文将为您详细讲解开源的 Python 代码分析工具,以及它们的特点、区别和应用场景。Python 社区提供了多种代码分析工具,这些工具可以帮助您在 Python 应用程序中进行代码质量评估、性能分析、安全检查等功能。 1. Pylint 特点 - 用于检查 Python…

python实现--顺序查找

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 顺序查找(Sequential Search),也称线性查找,是一种简单直观的查找算法。它的基本思想是逐个遍历数据集合中的元素,直到找到目标元素…

字节3-1大佬分享:字节跳动代码架构设计

最近和字节3-1的大佬交流,他分享了一些字节跳动代码架构设计理念,接下来用故事化的角度阐述。 面试官: 你好,今天我们要讨论的是享元模式。首先,你能解释一下什么是享元模式吗? 求职者: 当然可以。享元模式是一种结构…

怎么在学习强国网上发布文章,学习强国投稿发稿方法途径,附学习强国多少钱价格明细表

学习强国是一款受用户欢迎的学习软件,许多人希望在其平台上发布自己的文章,以分享和传播自己的学习成果和心得体会。那么,怎么在学习强国网上发布文章呢?接下来,我们将介绍一些投稿发稿的方法和途径。 首先&#xff0c…

Feed、RSS、Atom概念对比及ROME实战

概述 在豆瓣等网站里,经常会看到如下订阅Button: 本文记录一下相关概念学习成果。 Feed Feed:消息来源,一种资料格式,网站通过它将最新资讯传播给用户。用户能够订阅某网站的前提条件是网站有提供Feed。Feed被很多…

方程式工具包远程溢出漏洞图形界面版V0.3(内置永恒之蓝、永恒冠军、永恒浪漫等)

Part1 前言 大家好,我是ABC_123。我从年前到现在,一直在整理曾经写过的红队工具,逐步把自己认为比较好用的原创工具发出来给大家用一用,方便大家在日常的攻防比赛、红队评估项目中解放双手,节省时间精力和体力。本期给…

Linux智能网关结合Node-RED实现实时工业数据采集

工业4.0的发展,物联网技术在制造业中的应用越来越广泛。其中,基于Linux系统的工业物联网智能网关因其开放性、稳定性和安全性而备受青睐。这类智能网关创新性地集成了开源工具Node-RED,为从各种工业设备(如PLC)中高效收…

LInux系统架构----Apache与Nginx动静分离

LInux系统架构----Apache与Nginx动静分离 一.动静分离概述 Nginx的静态处理能力比较强,但是动态处理能力不足,因此在企业中常采用动静分离技术在LNMP架构中,静态页面交给Nginx处理,动态页面交给PHP-FPM模块处理。在动静分离技术…

elementui的el-upload图片上传到服务器的对象储存cos并且展示出来

目录 0.前提1.准备工作1.买一个腾讯云服务器(你可以买其他的),我这里是去买了61元一年的轻量级应用云服务器,操场系统是宝塔Linux2.买一个对象储存cos(这里腾讯云可以不用购买,因为开通的时候可以有180天的…