Golang 实现一个简单的 RPC 服务
分享一个简单的 rpc 服务框架
一、服务端实现
package mainimport ("log""net""net/rpc"
)const HelloServiceName = "main.HelloService"type HelloServiceInterface interface {Hello(request string, replay *string) error
}func RegisterHelloService(svc HelloServiceInterface) error {//todo 其中 rpc.Register 函数调用会将对象类型中所有满足 RPC 规则的对象方法注册为 RPC 函数,所有注册的方法会放在 “HelloService” 服务空间之下。return rpc.RegisterName(HelloServiceName, svc)
}type HelloService struct{}//todo RPC方法需要满足的规则:只能有两个可序列化的参数,第二个参数表reply是指针类型,函数返回error类型,函数需要大写进行公开func (p *HelloService) Hello(request string, reply *string) error {*reply = "hello:" + requestreturn nil
}func main() {//rpc.RegisterName("HelloService", new(HelloService))RegisterHelloService(new(HelloService))//todo 然后我们建立一个唯一的 TCP 连接,并且通过 rpc.ServeConn 函数在该 TCP 连接上为对方提供 RPC 服务。listener, err := net.Listen("tcp", ":1234")if err != nil {log.Fatal("ListenTCP error:", err)}for {conn, err := listener.Accept()if err != nil {log.Fatal("Accept error:", err)}//todo 启动协程去处理每个tcp请求go rpc.ServeConn(conn)}
}
二、客户端实现
package mainimport ("fmt""log""net/rpc"
)const HelloServiceName = "main.HelloService"type HelloServiceInterface interface {Hello(request string, replay *string) error
}type HelloServiceClient struct {*rpc.Client
}// todo 在编译阶段检查 HelloServiceClient 类型是否实现了 HelloServiceInterface 接口。
// TODO 这里将 nil 转换为 *HelloServiceClient 类型并赋值给 _(匿名变量),编译器会自动检查 HelloServiceClient 是否实现了接口 HelloServiceInterface 中声明的所有方法。
// TODO 如果 HelloServiceClient 没有实现接口中的所有方法,这段代码会导致编译失败,从而在编码阶段就能发现潜在的问题。
var _ HelloServiceInterface = (*HelloServiceClient)(nil)func DialHelloService(network, address string) (*HelloServiceClient, error) {c, err := rpc.Dial(network, address)if err != nil {return nil, err}return &HelloServiceClient{Client: c}, nil
}func (p *HelloServiceClient) Hello(request string, reply *string) error {return p.Client.Call(HelloServiceName+".Hello", request, reply)
}func main() {client, err := DialHelloService("tcp", "localhost:1234")if err != nil {log.Fatal("dialing:", err)}var reply stringerr = client.Hello("world", &reply)if err != nil {log.Fatal(err)}fmt.Println(reply)
}
相关文章:
Golang 实现一个简单的 RPC 服务
分享一个简单的 rpc 服务框架 一、服务端实现 package mainimport ("log""net""net/rpc" )const HelloServiceName "main.HelloService"type HelloServiceInterface interface {Hello(request string, replay *string) error }func…...
Linux系统(centos,redhat,龙芯,麒麟等)忘记密码,怎么设置新的密码
Linux系统(centos,redhat,龙芯,麒麟等)忘记密码,怎么设置新的密码 今天在操作服务器时,DBA忘记了人大金仓数据库的kingbase密码,他的密码试了好多遍,都不行。最后只能给重置密码了 解决办法&a…...
SpringBoot的启动原理
运行Main方法: 应用程序启动始于Main方法的执行。在Main方法中,创建了一个SpringApplication实例,用于引导应用程序的启动。同时,SpringApplication会根据spring.factories文件加载并注册监听器、ApplicationContextInitializer等…...
git查看单独某一个文件的历史修改记录
git查看单独某一个文件的历史修改记录 git log -p 文件具体路径 注意,Windows下默认文件路径分隔符是 \,在git bash 里面需要改成 /。 git基于change代码修改与提交_git change-CSDN博客文章浏览阅读361次。git cherry-pick:复制多个提交comm…...
一键开启Scrum回顾会议的精彩时刻
其实回顾会议作为一个检视、反馈、改进环节,不仅在传统的瀑布管理模式中,还是在Scrum一类的敏捷管理流程中,都是非常重要的活动。一些团队认为它无法产生直接的价值,所以有意忽略了这个会议;一些团队在越来越多的回顾中…...
Python计算多个表格中多列数据的平均值与标准差并导出为新的Excel文件
本文介绍基于Python语言,对一个或多个表格文件中多列数据分别计算平均值与标准差,随后将多列数据对应的这2个数据结果导出为新的表格文件的方法。 首先,来看一下本文的需求。现有2个.csv格式的表格文件,其每1列表示1个变量&#x…...
nginx支持的多种负载均衡策略
目录 1.轮询(默认) 2. ip_hash 3. 加权轮询(weight) 4. fair(第三方) 5. 最少连接(least_conn) 1.轮询(默认) 将请求依次分配给每个服务器,确…...
FNP preptool has not been run on this executable
pycharm导入arcgis pro的python运行程序后提示 我也看了很多解决方法,也重新安装过一遍,终于看到一个说法是你的arcgis pro是学习版所以才会有这个提示,不会影响输入 测试代码 import arcpy print(arcpy.GetInstallInfo()[Version])输出结果…...
算法-反转单向链表
需求 思路 链表必有节点,节点两要素:当前元素值,下一个节点地址 import java.util.Scanner;// 定义一个单向链表 public class MyLinkedList<E> {int size 0;// 顶一个私有的内部类,表示链表的节点public class Node {E da…...
Ps 滤镜:方框模糊
Ps菜单:滤镜/模糊/方框模糊 Filter/Blur/Box Blur 方框模糊 Box Blur滤镜通过计算图像中每个像素及其周围像素的平均颜色值来实现模糊效果。适合于需要突出主题、减少背景(尤其是颜色变化)干扰的场景。 “方框模糊”滤镜按照设定的半径值&…...
MTK Android13 霸屏实现
一、背景 在台式POS场景下,经常有应用会需要获取霸屏的权限,隐藏状态栏或者导航栏,且不能被划出,其实系统已经系统了隐藏状态栏也导航栏的接口,但是无法做到禁止滑出。 View decorView ((Activity) context).getWin…...
PyTorch神经网络打印存储所有权重+激活值(运行时中间值)
很多时候嵌入式或者新硬件需要纯净的权重模型和激活值(运行时中间值),本文提供一种最简洁的方法。 假设已经有模型model和pt文件了,在当前目录下新建weights文件夹,运行这段代码,就可以得到模型的权重&…...
grpc-教程(golang版)
目录 一、介绍 二、环境准备 三、Golang中使用grpc 1.编写protobuf文件 2.服务端 3.客户端 四、proto文件详解 1.proto语法 2.数据类型 基本数据类型 数组类型 map类型 嵌套类型 编写风格 3.多服务 4.多个proto文件 五、流式传输 1.普通rpc 2.服务器流式 …...
Spring与Spring Boot的区别:从框架设计到应用开发
这是我自己开发的一款小程序,感兴趣的可以体验一下: 进入正题: 在Java开发领域,Spring和Spring Boot都是备受推崇的框架,它们为开发人员提供了丰富的功能和便捷的开发体验。然而,许多人对它们之间的区别仍…...
React Hooks 全解: 常用 Hooks 及使用场景详解
React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…...
第十三届蓝桥杯真题:x进制减法,数组切分,gcd,青蛙过河
目录 x进制减法 数组切分 gcd 青蛙过河 x进制减法 其实就是一道观察规律的题。你发现如果a这个位置上的数x,b这个位置上的数是y,那么此位置至少是max(x,y)1进制。一定要把位置找对啊 #include <bits/stdc.h> using namespace std; typedef l…...
JavaEE初阶Day 6:多线程(4)
目录 Day 6:多线程(4)1. 线程不安全的原因2. 锁3. synchronized Day 6:多线程(4) 前序:针对Day 5结尾的count 多线程的执行,是随机调度抢占式的执行模式,某个线程执行指…...
微信小程序 django+nodejs电影院票务售票选座系统324kd
小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 前端:HTML5,CSS3 VUE 后端:java(springbootssm)/python(flaskdja…...
基于springboot实现桂林旅游景点导游平台管理系统【项目源码+论文说明】计算机毕业设计
基于springboot实现桂林旅游景点导游平台管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了桂林旅游景点导游平台的开发全过程。通过分析桂林旅游景点导游平台管理的不足,创建了一个计算…...
idea 开发serlvet汽车租赁管理系统idea开发sqlserver数据库web结构计算机java编程layUI框架开发
一、源码特点 idea开发 java servlet 汽车租赁管理系统是一套完善的web设计系统sqlserver数据库 系统采用serlvetdaobean mvc 模式开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 java se…...
2026论文写作工具红黑榜:AI论文工具怎么选?用过才敢说!
2026年论文写作工具红黑榜出炉,千笔AI、ThouPen、豆包位列红榜,适配国内学术规范,提升写作效率;黑榜需避开低质免费工具、无真实引用平台及过度依赖全文生成的工具。选择时可按需求匹配度 - 数据可信度 - 成本承受力三维模型进行评…...
C++ 无原生 JSON 支持?一文实现通用序列化与反序列化封装方案
前言 在现代软件开发中,JSON(JavaScript Object Notation)因其轻量级和易读性成为数据交换的主流格式。C虽无原生JSON支持,但通过封装第三方库(如nlohmann/json),可高效实现序列化(…...
告别裸机!用状态机思路重构你的51单片机温度监测程序(以DS18B20为例)
告别裸机!用状态机思路重构你的51单片机温度监测程序(以DS18B20为例) 在嵌入式开发中,51单片机因其简单易用、成本低廉而广受欢迎。但当项目复杂度上升时,传统的"while循环延时"式代码往往会陷入维护噩梦——…...
TradingView图表库集成宝典:15+主流框架实战指南
TradingView图表库集成宝典:15主流框架实战指南 【免费下载链接】charting-library-examples Examples of Charting Library integrations with other libraries, frameworks and data transports 项目地址: https://gitcode.com/gh_mirrors/ch/charting-library-…...
从g2o优化框架看TEB算法:手撕局部路径规划的图优化实现
从g2o优化框架看TEB算法:手撕局部路径规划的图优化实现 在机器人导航领域,局部路径规划算法的性能直接决定了机器人在动态环境中的反应速度和避障能力。TEB(Timed Elastic Band)算法作为ROS生态中广泛采用的解决方案,其…...
Windows下MySQL 8.0数据库存储路径迁移实战:释放C盘空间
Windows下MySQL 8.0存储路径迁移全指南:彻底解放C盘空间 对于长期在本地开发环境中使用MySQL的开发者来说,系统盘空间被数据库文件逐渐蚕食是常见痛点。默认安装的MySQL 8.0会将数据目录存放在C盘的隐蔽位置,随着业务数据增长,不仅…...
Twisted Protocols终极指南:快速构建高性能网络协议的简单方法
Twisted Protocols终极指南:快速构建高性能网络协议的简单方法 【免费下载链接】twisted Event-driven networking engine written in Python. 项目地址: https://gitcode.com/gh_mirrors/tw/twisted Twisted是一个用Python编写的事件驱动网络引擎࿰…...
如何免费获取专业级多语言字体:Poppins字体完整使用秘籍
如何免费获取专业级多语言字体:Poppins字体完整使用秘籍 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins字体是一款完全开源免费的专业级几何无衬线字体&…...
通义千问多模态检索系统:图文视频混合输入全解析
通义千问多模态检索系统:图文视频混合输入全解析 1. 多模态检索的行业痛点与解决方案 在信息爆炸的时代,传统文本检索系统面临三大核心挑战: 跨模态匹配失效:用户用文字描述"红色跑车在沙漠驰骋",系统却返…...
用 AI 生成视频?试试 Hailuo 视频生成 API!
在现代数字时代,视频内容的需求不断增长,而制作高质量视频的门槛也随之降低。今天,我想和大家分享一个强大的工具——Ace Data Cloud Hailuo 视频生成 API。这款 API 不仅支持文本转语音、多个声音切换和情感调整,还能为你提供清晰…...
