Skip to content

Commit

Permalink
support subset
Browse files Browse the repository at this point in the history
defooli committed Aug 10, 2021

Verified

This commit was signed with the committer’s verified signature.
edolstra Eelco Dolstra
1 parent b8e8819 commit 136878e
Showing 15 changed files with 4,286 additions and 1,711 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -12,5 +12,6 @@ require (
github.com/opentracing/opentracing-go v1.1.0
github.com/openzipkin-contrib/zipkin-go-opentracing v0.3.5
github.com/openzipkin/zipkin-go v0.2.2
github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b // indirect
github.com/stretchr/testify v1.6.1
)
10 changes: 8 additions & 2 deletions tars/endpointmanager.go
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@ import (
"github.com/TarsCloud/TarsGo/tars/protocol/res/endpointf"
"github.com/TarsCloud/TarsGo/tars/protocol/res/queryf"
"github.com/TarsCloud/TarsGo/tars/util/consistenthash"
"github.com/TarsCloud/TarsGo/tars/util/current"
"github.com/TarsCloud/TarsGo/tars/util/endpoint"
"github.com/TarsCloud/TarsGo/tars/util/gtime"
)
@@ -278,7 +279,9 @@ func (e *tarsEndpointManager) addAliveEp(ep endpoint.Endpoint) {
// SelectAdapterProxy returns the selected adapter.
func (e *tarsEndpointManager) SelectAdapterProxy(msg *Message) (*AdapterProxy, bool) {
e.epLock.Lock()
eps := e.activeEp[:]
// support subset
eps := subsetEndpointFilter(msg.Req.SServantName,
msg.Req.Status[current.STATUS_ROUTE_KEY], e.activeEp[:])
e.epLock.Unlock()

if e.directproxy && len(eps) == 0 {
@@ -296,7 +299,10 @@ func (e *tarsEndpointManager) SelectAdapterProxy(msg *Message) (*AdapterProxy, b
}
var adp *AdapterProxy
if msg.isHash && msg.hashType == ConsistentHash {
if epi, ok := e.activeEpHashMap.FindUint32(uint32(msg.hashCode)); ok {
// support subset
activeEpHashMap := subsetHashEpFilter(msg.Req.SServantName,
msg.Req.Status[current.STATUS_ROUTE_KEY], e.activeEpHashMap)
if epi, ok := activeEpHashMap.FindUint32(uint32(msg.hashCode)); ok {
ep := epi.(endpoint.Endpoint)
if v, ok := e.epList.Load(ep.Key); ok {
adp = v.(*AdapterProxy)
11 changes: 11 additions & 0 deletions tars/protocol/res/EndpointF.tars
Original file line number Diff line number Diff line change
@@ -36,6 +36,17 @@ module endpointf
13 optional int authType;
};
key[EndpointF, host, port, timeout, istcp, grid, qos, weight, weightType, authType];

/**
* Subset配置
*/
struct SubsetConf{
0 require bool enable; // 是否启用subset
1 require string ruleType; // 类型,有按比例(ratio)和按路由key(key)两种
2 require string ruteData; // 规则内容,{"v1": 20, "v2": 80}
};
};




2 changes: 1 addition & 1 deletion tars/protocol/res/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
all:
tars2go -add-servant=false -tarsPath github.com/TarsCloud/TarsGo/tars *.tars
#override file
sed -i 's|"endpointf"|"github.com/TarsCloud/TarsGo/tars/protocol/res/endpointf"|g' queryf/QueryF_IF.go
sed -i 's|"endpointf"|"github.com/TarsCloud/TarsGo/tars/protocol/res/endpointf"|g' queryf/QueryF.tars.go
7 changes: 7 additions & 0 deletions tars/protocol/res/QueryF.tars
Original file line number Diff line number Diff line change
@@ -79,6 +79,13 @@ module queryf
*/
int findObjectByIdInSameSet(string id, string setId, out vector<endpointf::EndpointF> activeEp, out vector<endpointf::EndpointF> inactiveEp);

/** 获取subset信息
*
* @param id 对象名称
* @param conf Subset配置信息
* @return: 0-成功 others-失败
*/
int findSubsetConfigById(string id, out endpointf::SubsetConf conf);
};

};
145 changes: 136 additions & 9 deletions tars/protocol/res/endpointf/EndpointF.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
//Package endpointf comment
// This file war generated by tars2go 1.1
// Package endpointf comment
// This file was generated by tars2go 1.1.4
// Generated from EndpointF.tars
package endpointf

import (
"fmt"

"github.com/TarsCloud/TarsGo/tars/protocol/codec"
)

//EndpointF strcut implement
// Reference imports to suppress errors if they are not otherwise used.
var _ = fmt.Errorf
var _ = codec.FromInt8

// EndpointF struct implement
type EndpointF struct {
Host string `json:"host"`
Port int32 `json:"port"`
@@ -25,7 +30,7 @@ type EndpointF struct {
AuthType int32 `json:"authType"`
}

func (st *EndpointF) resetDefault() {
func (st *EndpointF) ResetDefault() {
}

//ReadFrom reads from _is and put into struct.
@@ -34,7 +39,7 @@ func (st *EndpointF) ReadFrom(_is *codec.Reader) error {
var length int32
var have bool
var ty byte
st.resetDefault()
st.ResetDefault()

err = _is.Read_string(&st.Host, 0, true)
if err != nil {
@@ -101,6 +106,7 @@ func (st *EndpointF) ReadFrom(_is *codec.Reader) error {
return err
}

_ = err
_ = length
_ = have
_ = ty
@@ -111,7 +117,7 @@ func (st *EndpointF) ReadFrom(_is *codec.Reader) error {
func (st *EndpointF) ReadBlock(_is *codec.Reader, tag byte, require bool) error {
var err error
var have bool
st.resetDefault()
st.ResetDefault()

err, have = _is.SkipTo(codec.STRUCT_BEGIN, tag, require)
if err != nil {
@@ -122,10 +128,12 @@ func (st *EndpointF) ReadBlock(_is *codec.Reader, tag byte, require bool) error
return fmt.Errorf("require EndpointF, but not exist. tag %d", tag)
}
return nil

}

st.ReadFrom(_is)
err = st.ReadFrom(_is)
if err != nil {
return err
}

err = _is.SkipToStructEnd()
if err != nil {
@@ -204,6 +212,8 @@ func (st *EndpointF) WriteTo(_os *codec.Buffer) error {
return err
}

_ = err

return nil
}

@@ -215,7 +225,124 @@ func (st *EndpointF) WriteBlock(_os *codec.Buffer, tag byte) error {
return err
}

st.WriteTo(_os)
err = st.WriteTo(_os)
if err != nil {
return err
}

err = _os.WriteHead(codec.STRUCT_END, 0)
if err != nil {
return err
}
return nil
}

// SubsetConf struct implement
type SubsetConf struct {
Enable bool `json:"enable"`
RuleType string `json:"ruleType"`
RuteData string `json:"ruteData"`
}

func (st *SubsetConf) ResetDefault() {
}

//ReadFrom reads from _is and put into struct.
func (st *SubsetConf) ReadFrom(_is *codec.Reader) error {
var err error
var length int32
var have bool
var ty byte
st.ResetDefault()

err = _is.Read_bool(&st.Enable, 0, true)
if err != nil {
return err
}

err = _is.Read_string(&st.RuleType, 1, true)
if err != nil {
return err
}

err = _is.Read_string(&st.RuteData, 2, true)
if err != nil {
return err
}

_ = err
_ = length
_ = have
_ = ty
return nil
}

//ReadBlock reads struct from the given tag , require or optional.
func (st *SubsetConf) ReadBlock(_is *codec.Reader, tag byte, require bool) error {
var err error
var have bool
st.ResetDefault()

err, have = _is.SkipTo(codec.STRUCT_BEGIN, tag, require)
if err != nil {
return err
}
if !have {
if require {
return fmt.Errorf("require SubsetConf, but not exist. tag %d", tag)
}
return nil
}

err = st.ReadFrom(_is)
if err != nil {
return err
}

err = _is.SkipToStructEnd()
if err != nil {
return err
}
_ = have
return nil
}

//WriteTo encode struct to buffer
func (st *SubsetConf) WriteTo(_os *codec.Buffer) error {
var err error

err = _os.Write_bool(st.Enable, 0)
if err != nil {
return err
}

err = _os.Write_string(st.RuleType, 1)
if err != nil {
return err
}

err = _os.Write_string(st.RuteData, 2)
if err != nil {
return err
}

_ = err

return nil
}

//WriteBlock encode struct
func (st *SubsetConf) WriteBlock(_os *codec.Buffer, tag byte) error {
var err error
err = _os.WriteHead(codec.STRUCT_BEGIN, tag)
if err != nil {
return err
}

err = st.WriteTo(_os)
if err != nil {
return err
}

err = _os.WriteHead(codec.STRUCT_END, 0)
if err != nil {
Loading

0 comments on commit 136878e

Please sign in to comment.