func StaticPush(ctx Ctx, addr string, serviceMethod string, arg interface{}, setting ...erpc.MessageSetting) *erpc.Status {
	return staticClient.GetOrSet(addr).Push(serviceMethod, arg, setting...)
}
StaticPush sends a packet by address, but do not receives reply.
Note:
The ctx can be nil;
If the arg is []byte or *[]byte type, it can automatically fill in the body codec name;
If the session is a client role and PeerConfig.RedialTimes>0, it is automatically re-called once after a failure.
package clientele
import (
	"net/url"
	"os"
	"path/filepath"
	"sync"
	"github.com/henrylee2cn/cfgo"
	"github.com/henrylee2cn/erpc/v6"
	"github.com/xiaoenai/tp-micro/v6"
	"github.com/xiaoenai/tp-micro/v6/discovery"
	"github.com/xiaoenai/tp-micro/v6/model/etcd"
)
var dynamicClient *micro.Client
var staticClient *StaticClients
var protoFunc erpc.ProtoFunc
var cliCfg micro.CliConfig
var etcdCfg etcd.EasyConfig
var etcdClient *etcd.Client
var peerName string
var incr int32
var mutex sync.Mutex
func init() {
	cfgo.AllowAppsShare(true)
	cfgo.MustReg("cluster_client", &cliCfg)
	cfgo.MustReg("etcd", &etcdCfg)
	peerName = filepath.Base(os.Args[0])
	protoFunc = erpc.DefaultProtoFunc()
	var err error
	etcdClient, err = etcd.EasyNew(etcdCfg)
	if err != nil {
		erpc.Fatalf("%v", err)
	}
	dynamicClient = micro.NewClient(
		cliCfg,
		discovery.NewLinkerFromEtcd(etcdClient),
	)
	staticClient = &StaticClients{
		clients:   make(map[string]*micro.Client),
		cfg:       cliCfg,
		protoFunc: protoFunc,
	}
}
func GetEtcdClient() *etcd.Client {
	return etcdClient
}
func GetDynamicClient() *micro.Client {
	return dynamicClient
}
func GetStaticClients() *StaticClients {
	return staticClient
}
func GetProtoFunc() erpc.ProtoFunc {
	return protoFunc
}
func SetProtoFunc(_protoFunc erpc.ProtoFunc) {
	protoFunc = _protoFunc
	dynamicClient.SetProtoFunc(protoFunc)
	staticClient.protoFunc = protoFunc
}
func GetEtcdCfg() etcd.EasyConfig {
	return etcdCfg
}
type Ctx interface {
	Seq() int32
	RealIp() string
	Query() url.Values
}
func DynamicCall(ctx Ctx, serviceMethod string, arg interface{}, result interface{}, setting ...erpc.MessageSetting) erpc.CallCmd {
	return dynamicClient.Call(serviceMethod, arg, result, setting...)
}
func DynamicPush(ctx Ctx, serviceMethod string, arg interface{}, setting ...erpc.MessageSetting) *erpc.Status {
	return dynamicClient.Push(serviceMethod, arg, setting...)
}
func StaticCall(ctx Ctx, addr string, serviceMethod string, arg interface{}, result interface{}, setting ...erpc.MessageSetting) erpc.CallCmd {
	return staticClient.GetOrSet(addr).Call(serviceMethod, arg, result, setting...)
}