Skip to content

wsx864321/srpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

7b6cee3 · Jul 10, 2024

History

68 Commits
Jan 6, 2023
Jan 15, 2023
Dec 16, 2022
Jan 1, 2023
Jan 1, 2023
Jan 3, 2023
Jan 6, 2023
Jan 1, 2023
Dec 15, 2022
Dec 13, 2022
Jan 1, 2023
Jul 10, 2024
Jul 10, 2024
Jan 1, 2023
Dec 16, 2022
Dec 16, 2022
May 16, 2022
Jan 15, 2023
Jan 1, 2023
Jan 1, 2023

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