elgong / elgongrpc Goto Github PK
View Code? Open in Web Editor NEW动手实现基于golang 的 rpc 微服务框架
动手实现基于golang 的 rpc 微服务框架
buglist: 修复后打勾
todo:
done, 思路参考了go net/rpc, 利用反射将服务结构体和方法注册到容器
问题描述:利用yaml解析出的数据是空值。
原因: 结构体对应字段必须为可导出类型
利用插件中心将所有插件统一管理吧,分散的话有些乱遭遭。。
v1版: 插件统一管理,所有组件,能插件化就插件化,方便未来拓展
v1插件开发的规范:
插件定义时:
1. 同种类型的插件要实现同一个接口; // 解决取出时的类型断言,这样统一起来就容易使用啦;
2. 插件在实现接口时,附带两个变量,插件类型+插件名;
插件使用时:
3. 使用类型定义了的接口来断言; // 插件中心为了通用使用了 interface{}, 使用公共的就统一啦;
package main
import (
"fmt"
"goom1/plugin"
)
type LogInterface interface {
PrintA(string)
}
type LogPlugin struct {
}
func (l LogPlugin) PrintA(msg string){
fmt.Println(msg)
}
func main(){
// 注册时, 同种类型的注册的插件实现统一的接口
log := LogPlugin{}
plugin.Plugins.Register("log", "mylog", log)
// 调用时 断言使用接口
plugin.Plugins.Get("log", "mylog").(LogInterface).PrintA("123")
}
目前片面的理解是 :
server 去注册服务
client 去注册中心发现服务
已实现了基于redis的
目前有点迷,先设计一个迷的版本,未来发现问题再修正吧,rpc和grpc的源码看迷糊了。
**网络模型v1 **:
pool 设计v1:
v1 先只考虑最大连接数,不考虑闲置问题
pool设计要点:
- 惰性初始化,需要时再建立连接
- 控制连接数量上限
- 取/ 放操作
- 连接失效需要检测,可以定时任务,也可用时检测。
问题1: 像rpc 这种一般会一个连接长期使用,所以建立连接池比较有必要。
对于客户端我理解,每次访问某个服务时,直接取池子里之前已经建立好的连接,即可。
那服务端呢?需不需要建立连接池?rpc 服务端需要主动给客户端推送消息吗?如果不需要的话,那处理完的连接,直接忽略吗?继续再监听端口?旧的连接会被accept 监听到吗?
问题2**:c s 之间如何互相检测是否关闭
如果客户端异常关闭, 服务端读取数据失败会返回 EOF err
如果服务器关闭,客户端如何检测??????????????????
解答: 服务端通过 read 返回 EOF 来判断 对方掉线
客户端通过 write 心跳包来判断对方掉线
已实现
V1.0 版本
暂时规划:
入口调用 message, 传入要发送的请求,包括请求服务名,服务地址,传入参数,返回参数,。。。
message 调用 codec 进行编码。。。
然后再调用 底层发送出去。。。
1go语言处理TCP拆包/粘包
2tcp粘包拆包的完全解法,有点麻烦
3tcp解包时设置长度&不符合的丢弃????
计划两部走:
v1 版本: 粘包是完整包时,都拆开;有非完整包的,部分丢弃
v2 版本: 解决非完整包的问题。。
用到知识点: 可变参数列表, 函数体做参数,
WithXXXXX 配置新参数的原理是,通过返回一个函数,该函数可以修改传输参数的默认值。。
具体实现见 connPool
已解决。
gob 编解码时,接口类型需要注册后使用,body 时接口类型,额外加了注册
v1 版本先不实现了吧
已解决。
统一修改了message 结构体,固定了body 的类型为 map[string] interface{ }
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.