Skip to content

wsx864321/srpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

67 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

srpc

srpc只是一个玩具级的RPC框架,未经线上实际检验,请大家不要轻易使用(有问题概不负责哦), but,srpc是一个学习RPC框架的“好轮子”(王婆卖瓜自卖自夸,hhh),因为它足够简单,麻雀虽小五脏俱全。

服务注册&服务发现(etcd、zk、nacos、consul)

服务发现&服务注册在微服务框架中起着承上启下的作用,是微服务框架中十分重要的一环, 如果在微服务体系当中没有服务发现&服务注册,那么就像汽车没有方向盘,无法掌控前进的方向。

在实现服务发现和服务注册当中我们通常会选择以下组件来实现

  • ETCD
  • ZK
  • nacos
  • consul

因为srpc框架是Go语言实现的轮子,所以我们暂且先选择ETCD(Go语言实现)来实现服务发发现,虽然我个人认为ETCD并不是 实现服务发现&服务注册最优的组件(AP组件可能会好点),如果有人想实现其它组件可以提PR。推荐一篇 各组件对比的文章https://mp.weixin.qq.com/s/MGmbAz41zJGXwyPrmEeRBw

传输协议(http、http2、tcp、quic)

  • http
  • http2
  • tcp
  • quic
  • udp

数据序列化(json、pb、msgpack)

  • json
  • pb
  • msgpack

数据压缩

服务治理

数据可观测性(logging、metric、trace)

  • logging
  • metric
  • trace

熔断

  • 熔断

限流(滑动窗口、漏斗、令牌桶)

  • 滑动窗口
  • 漏斗
  • 令牌桶

负载均衡

  • rr
  • wrr
  • p2c
  • random

重试

  • Failfast
  • Failover
  • Failtry
  • Failbackup

超时控制

  • 级联超时控制

服务端

客户端

使用

server

server.go

package main

import (
	"context"
	"errors"
	"fmt"
	
	"github.com/wsx864321/srpc/discov/etcd"
	"github.com/wsx864321/srpc/server"
)


type HelloWorld struct {
}

type HelloWorldReq struct {
	Name string `json:"name"`
}

type HelloWorldResp struct {
	Msg string `json:"msg"`
}

func (h *HelloWorld) SayHello(ctx context.Context, req *HelloWorldReq) (*HelloWorldResp, error) {
	return &HelloWorldResp{
		Msg: fmt.Sprintf("%s say hello", req.Name),
	}, nil
}

func main() {
    s := server.NewServer(server.WithDiscovery(etcd.NewETCDRegister(etcd.WithEndpoints([]string{"127.0.0.1:2371"}))))
    s.RegisterService("helloworld", &HelloWorld{})
    s.Start()
}

client.go

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/wsx864321/srpc/client"
	"github.com/wsx864321/srpc/discov/etcd"
)

type HelloWorldReq struct {
	Name string `json:"name"`
}

type HelloWorldResp struct {
	Msg string `json:"msg"`
}

func main() {
	req := &HelloWorldReq{
		Name: "wsx",
	}
	var resp HelloWorldResp
	ctx, _ := context.WithTimeout(context.TODO(), 2*time.Second)
	cli := client.NewClient(client.WithServiceName("helloworld"), client.WithDiscovery(etcd.NewETCDRegister(etcd.WithEndpoints([]string{"127.0.0.1:2371"}))))
	err := cli.Call(ctx, "SayHello", req, &resp)
	fmt.Println(resp, err)
}

TODOLIST

  • 实现客户端异步请求方式
  • 实现基于proto的插件来生成客户端和服务端的脚手架
  • 实现Unix Domain Socket的通信方式
  • 实现P2C的负载均衡方式
  • 实现长连接subset子集划分
  • 实现《The Tail at Scale》论文上优化长尾耗时的一些方法??
  • 优化现有代码风格,增强健壮性
  • .........

END

如在使用过程当中有任何疑问和问题都可以提issue,如对本框架有任何建议也请老板们不吝赐教

About

Go实现的rpc框架

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages