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

go语言rpc初体验

go语言rpc初体验

package mainimport ("net""net/rpc"
)// 注册一个接口进来
type HelloService struct {
}func (s *HelloService) Hello(request string, replay *string) error {//返回值是通过修改replay的值*replay = "hello " + requestreturn nil
}// go语言内置rpc包
func main() {//注册名字 实例化一个severlistener, _ := net.Listen("tcp", ":1234") //监听//注册处理handle_ = rpc.RegisterName("HelloService", &HelloService{})//启动服务conn, _ := listener.Accept() //当一个新的连接进来的时候,生成套接字rpc.ServeConn(conn)          //调用一次连接就结束
}
package mainimport ("fmt""net/rpc"
)func main() {//建立连接client, err := rpc.Dial("tcp", "localhost:1234")if err != nil {panic("连接失败")}//var replay *string //reading body gob:DecodeValue of unassignable value 传递的nil 没有地址//var replay *string = new(string) //new 是分配一个空间 第一种方法var replay string //string有默认值 第二种方法err = client.Call("HelloService.Hello", "bobby", &replay)if err != nil {panic("调用失败")}fmt.Println(replay)
}

一连串的代码大部分都是net的包好像和rpc没有关系?
答:不行,rpc调用中有几个问题需要解决:1:call id,2序列化和反序列化
可以跨语言调用呢? 1. go语言的rpc的序列化协议是什么(Gob) 2. 能否替换成常见的序列化

替换rpc的传输协议为json

package mainimport ("net""net/rpc""net/rpc/jsonrpc"
)// 注册一个接口进来
type HelloService struct {
}func (s *HelloService) Hello(request string, replay *string) error {//返回值是通过修改replay的值*replay = "hello " + requestreturn nil
}// go语言内置rpc包
func main() {//注册名字 实例化一个severlistener, _ := net.Listen("tcp", ":1234") //监听//注册处理handle_ = rpc.RegisterName("HelloService", &HelloService{})for { //如果使用死循环,有一个弊端如果同时多个客户端处理,需要一个一个处理,所以需要加协程//启动服务conn, _ := listener.Accept() //当一个新的连接进来的时候,生成套接字//但使用指定的编解码器,以编码请求主体和解码回复主体。go rpc.ServeCodec(jsonrpc.NewServerCodec(conn)) //后面传来的东西,然后支持的编码都可以}}

如果使用死循环,有一个弊端如果同时多个客户端处理,需要一个一个处理,所以需要加协程

package mainimport ("fmt""net""net/rpc""net/rpc/jsonrpc"
)func main() {//建立连接conn, err := net.Dial("tcp", "localhost:1234")if err != nil {panic("连接失败")}//jsonrpc.NewClientCodec(conn) 包装连接变成一个新的connclient := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn)) //因为他是json的格式var replay string                                              //string有默认值 第二种方法err = client.Call("HelloService.Hello", "bobby", &replay)      //发送数据格式为jsonif err != nil {panic("调用失败")}fmt.Println(replay)
}

修改rpc调用代码

client.go

package mainimport ("awesomeProject123/new_helloworld/client_proxy""fmt"
)func main() {//建立连接//1 只想写业务逻辑,不想关注每个函数的名称//客户端部分client := client_proxy.NewHelloServiceClient("tcp", "localhost:1234")//jsonrpc.NewClientCodec(conn) 包装连接变成一个新的connvar replay string                     //string有默认值 第二种方法err := client.Hello("bobby", &replay) //发送数据格式为jsonif err != nil {panic("调用失败")}fmt.Println(replay)
}

client_proxy.go

package client_proxyimport ("awesomeProject123/new_helloworld/handler""net/rpc"
)type HelloServerStub struct {*rpc.Client
}// NewHelloServiceClient 在go语言中没有类、对象,就意味着没有初始化方法
func NewHelloServiceClient(protol, address string) HelloServerStub {conn, err := rpc.Dial(protol, address)if err != nil {panic("connect error!")}return HelloServerStub{conn}
}func (c *HelloServerStub) Hello(request string, replay *string) error {err := c.Call(handler.HelloServiceName+".Hello", request, replay)if err != nil {return err}return nil
}

server.go

package mainimport ("awesomeProject123/new_helloworld/handler""awesomeProject123/new_helloworld/server_proxy""net""net/rpc"
)// go语言内置rpc包
func main() {//注册名字 实例化一个severlistener, _ := net.Listen("tcp", ":1234") //监听//注册处理handler_ = server_proxy.RegisterHelloService(&handler.NewHelloService{})//_ = rpc.RegisterName(handler.HelloServiceName, &handler.HelloService{})for {//启动服务conn, _ := listener.Accept() //当一个新的连接进来的时候,生成套接字rpc.ServeConn(conn)          //调用一次连接就结束}
}

server_proxy.go

package server_proxyimport ("awesomeProject123/new_helloworld/handler""net/rpc"
)type HelloServicer interface {Hello(request string, replay *string) error
}// RegisterHelloService 解耦  --我们关心的是函数,鸭子类型
func RegisterHelloService(srv HelloServicer) error {return rpc.RegisterName(handler.HelloServiceName, srv)
}

protoc安装

https://github.com/protocolbuffers/protobuf/releases

相关文章:

go语言rpc初体验

go语言rpc初体验 package mainimport ("net""net/rpc" )// 注册一个接口进来 type HelloService struct { }func (s *HelloService) Hello(request string, replay *string) error {//返回值是通过修改replay的值*replay "hello " requestret…...

嵌入式LINUX——环境搭建 windows、虚拟机、开发板 互ping

摘要: 本文包含,如果设置linux开发板和虚拟机、windows 互ping成功 以及设置过程中出现的虚拟机、开发板查询不到eth0 windows ping开发板出项丢包等问题的解决方式。 windows端设置 windows端插入USB转网卡 打开windows桌面下右下角的网络标识 打开“更改适配器选项”…...

评论:AlexNet和CaffeNet有何区别?

一、说明 在这个故事中,我们回顾了AlexNet和CaffeNet。AlexNet 是2012 年ILSVRC(ImageNet 大规模视觉识别竞赛)的获胜者,这是一项图像分类竞赛。而CaffeNet是AlexNet的单GPU版,因此,我们平时在普通电脑的Al…...

什么是 IT 资产管理(ITAM),以及它如何简化业务

IT 资产管理对任何企业来说都是一项艰巨的任务,但使用适当的工具可以简化这项任务,例如,IT 资产管理软件可以为简化软件和硬件的管理提供巨大的优势。 什么是 IT 资产管理 IT 资产管理(ITAM)是一组业务实践&#xff…...

git快速上传代码

① git init; 初始化git,之后在文件夹里有.git文件,这个需要 勾选才能查看。 ② git remote add test myFisrtTest: 测试专用 这里的test是自定义的,myFisrtTest: 测试专用 是远程仓库 ③ git branch -a 这里是查看分支 ④ …...

stable diffusion comfyui的api使用教程

一、为什么要使用comfyui的api?对比webui的api,它有什么好处? 1、自带队列 2、支持websocket 3、无需关心插件是否有开放api接口,只要插件在浏览器中可以正常使用,接口就一定可以使用 4、开发人员只需关心绘图流程的搭建 5、切换…...

Swift中的strong, weak, unowned

在 Swift 中,strong, weak, 和 unowned 关键词用于管理内存中对象的引用。这些关键词与 Swift 的自动引用计数(ARC)系统紧密相关,用于防止内存泄漏和强引用循环。下面是对这三种引用类型的简要说明: 1. Strong 默认行…...

Linux命令——ssh

Linux命令——ssh 背景 SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。 历史上,网络主机之间的通信是不加密的,属于明文通信。这使得通信很不安全&a…...

在qml中,text如何左对齐,对齐方式有哪些?如何换行?

在Qt Quick(即QML)中,你可以使用Text组件的horizontalAlignment属性来控制文本的对齐方式。以下是一些常用的对齐方式: Align.Left: 文本左对齐。这是默认的对齐方式。 Align.Center: 文本居中对齐。 Align.Right: 文本右对齐。 …...

【Rust 易学教程】第 1 天:Rust 基础,基本语法

上一节:【Rust 易学教程】学前准备:Cargo, 你好 今天,我们正式进入 Rust 基础的学习。在本文的内容中,我会为大家介绍以下内容: 基本 Rust 语法: 变量、标量和复合类型、枚举、结构、引用、函数和方法。控…...

Linux(命令)——结合实际场景的命令 查找Java安装位置命令

前言 在内卷的时代,作为开发的程序员也需要懂一些Linux相关命令。 本篇博客结合实际应用常见,记录Linux命令相关的使用,持续更新,希望对你有帮助。 目录 前言引出一、查找Java安装位置命令1、使用which命令2、使用find命令3、查…...

C语言基础 -- scanf函数的返回值及其应用

前言、scanf函数有返回值 我们在作PTA上的编程作业时,经常在编译窗口会看到如下的信息: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 当时老师一定会告诉你,这个一个&qu…...

mac 安装 selenium + chrome driver

前言 使用 selenium 模拟浏览器渲染数据,需要依赖各浏览器的驱动才能完成,因此需要单独安装chrome driver 查看本地 chrome 浏览器的版本 可以看到我这里已经是 arm 架构下最新的版本了 下载对应的 chrome driver 访问下面的地址: Chrome…...

【阿里云】函数计算 X 通义千问快速部署

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…...

el-table本地与线上的样式不一致出现错乱

使用el-table的时候有几个表头是循环出来的,出现在本地运行的时候,表头内el-input输入框样式正常,但是发布以后出现样式错乱问题 线上样式错乱:​ 本地正常: 出现这个问题的原因是我有几个表头是循环出来的&#xff0…...

C语言--从键盘输入当月利润I,求应发奖金总数。

题目描述: 企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%; 利润高于100000 元,低于200000元(1000001000000时,超过1000000元的部分按 1%提成。从键盘输入当月利润I,求应发奖金总数。 int main() {int m…...

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日,以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕,本次大会由中国电信、广东省人民政府联合举办,是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会,深度参与了大…...

基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。

演示视频: 基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff…...

阿里云服务中断事件:原因、影响与解决方案

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰 如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊 文章目录 阿里云服务中断事件:原因、影…...

搜维尔科技:「体育类」Movella Xsens极限运动捕捉测试

搜维尔科技:「体育类」Movella Xsens极限运动捕捉测试...

当今互联网安全的基石 - TLS/SSL

LS(Transport Layer Security)传输层安全协议 发展历程 TLS 是 SSL 协议的继任者。由于 SSL 协议存在一些安全漏洞,并且随着网络安全需求的不断提高,IETF(Internet Engineering Task Force)对 SSL 3.0 进…...

【含文档+PPT+源码】基于SSM框架的农产品销售平台的设计与实现

项目介绍本课程演示的是一款 基于SSM框架的农产品销售平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项…...

细致配置Doctrine,专注于指定前缀表的迁移

在使用Symfony和Doctrine进行项目开发时,如何优雅地处理数据库迁移是一个常见的问题。本文将详细探讨如何配置Doctrine,使其在生成迁移文件时仅关注特定前缀的表(如pp_前缀的表),从而避免迁移文件中包含不必要的表。 背景介绍 假设你有一个Symfony项目,该项目中数据库已…...

AI集成开发工程师的技术实践与转型之路

第一章:技术架构演进与AI融合趋势 1.1 传统开发范式的演进 现代软件开发正经历从单一业务系统向智能化业务系统的转型。传统的.NET技术栈作为企业级应用开发的基石,其技术架构也在不断演进: // 典型的三层架构示例 public class BusinessLogic {private readonly IDataAc…...

10分钟掌握Deep-Live-Cam:从零搭建实时AI换脸系统的完整指南

10分钟掌握Deep-Live-Cam:从零搭建实时AI换脸系统的完整指南 【免费下载链接】Deep-Live-Cam real time face swap and one-click video deepfake with only a single image 项目地址: https://gitcode.com/GitHub_Trending/de/Deep-Live-Cam Deep-Live-Cam是…...

决策树剪枝实战:用C++和Python分别实现,我踩过的坑你别再踩了

决策树剪枝实战:用C和Python分别实现,我踩过的坑你别再踩了 第一次在C里实现决策树剪枝时,内存泄漏让我调试到凌晨三点;而用Python重写时,又因为没注意NumPy的广播机制导致准确率计算全错。这篇文章记录了我从零实现两…...

LSTM预测不准?试试这个全局注意力“外挂”:一个PyTorch模块提升你的时序模型性能

LSTM预测不准?试试这个全局注意力“外挂”:一个PyTorch模块提升你的时序模型性能 当你发现精心调参的LSTM模型在预测股票价格、设备故障率或能源消耗时,总是错过关键转折点,问题可能不在你的数据清洗或超参选择——而是模型缺乏对…...

立创庐山派K230 RT-Smart GPIO驱动开发实战:从零构建LED控制应用

1. 庐山派K230开发板与RT-Smart系统初探 庐山派K230开发板是当前嵌入式开发领域的热门硬件平台,搭载了双核处理器架构,能够同时运行Linux和RT-Smart实时操作系统。RT-Smart作为一款轻量级实时操作系统,特别适合需要精确时序控制的嵌入式应用场…...

分组网络频率同步互通测试

概述随着3G/4G网络大规模的部署和应用,网络和业务的全IP化发展,分组传送技术将替代SDH/MSTP网络而成为主流的传送承载网络。这时,一方面新的传送网络技术会对网络的同步性能提出相应的要求,另一方面在通信网络由电路交换型向分组交…...

终极Redis可视化工具:Another Redis Desktop Manager完全使用指南

终极Redis可视化工具:Another Redis Desktop Manager完全使用指南 【免费下载链接】AnotherRedisDesktopManager 🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, …...