1 Star 0 Fork 0

micro-tools/micro

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
main.go 3.10 KB
一键复制 编辑 原始数据 按行查看 历史
545403892 提交于 2023-06-05 23:58 +08:00 . init
package main
import (
"context"
"fmt"
"gitee.com/micro-tools/micro"
"gitee.com/micro-tools/micro/module"
"gitee.com/micro-tools/wf/extend/utils/gmicro/registry"
"gitee.com/micro-tools/wf/extend/utils/gmicro/registry/etcd"
"gitee.com/micro-tools/wf/frame/g"
"gitee.com/micro-tools/wf/os/glog"
"gitee.com/micro-tools/wf/text/gstr"
"gitee.com/micro-tools/wf/util/gconv"
consulapi "github.com/hashicorp/consul/api"
"github.com/mitchellh/consulstructure"
"go.etcd.io/etcd/clientv3"
"reflect"
)
const (
TracingName = "Blocking Query"
TracingURL = "172.16.13.6:6831"
ConsulURL = "127.0.0.1:8500"
EtcdURL = "127.0.0.1:2379"
)
func main() {
go func() {
type Config struct {
Blocking string `json:"blocking,omitempty"`
}
EtcdBlockingQuery(&Config{}, "/corex/", func(value interface{}) {
var val Config
_ = gconv.Struct(value, &val)
glog.Info(val)
})
//ConsulBlockingQuery(&Config{}, func(value interface{}) {
// var val Config
// _ = gconv.Struct(value, &val)
// glog.Info(val)
//})
}()
rs := etcd.NewRegistry(func(options *registry.Options) {
options.Address = []string{EtcdURL}
})
app := micro.Create(
module.Debug(false),
module.Tracing(module.Trace{
Status: true,
Name: TracingName,
URL: TracingURL,
}),
module.Registry(rs), //指定服务发现
)
err := app.Run(New())
if err != nil {
app.Logger().Errorf("%s", err.Error())
}
}
func ConsulBlockingQuery(targetPointer interface{}, prefix string, call func(value interface{})) {
// Create our decoder
updateCh := make(chan interface{})
errCh := make(chan error)
decoder := &consulstructure.Decoder{
Target: targetPointer,
UpdateCh: updateCh,
ErrCh: errCh,
Prefix: prefix,
Consul: &consulapi.Config{Address: ConsulURL},
}
// Run the decoder and wait for changes
go decoder.Run()
for {
select {
case v := <-updateCh:
call(v)
case err := <-errCh:
fmt.Printf("Error: %s\n", err)
}
}
}
func EtcdBlockingQuery(targetPointer interface{}, prefix string, call func(value interface{})) {
raw := GetStructTagName(targetPointer)
if len(raw) == 0 {
return
}
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{EtcdURL},
})
if err != nil {
return
}
var wkey string
var opts []clientv3.OpOption
if prefix != "" {
wkey = prefix
opts = append(opts, clientv3.WithPrefix())
} else {
wkey = ""
opts = append(opts, clientv3.WithPrefix())
}
ctx := context.Background()
for {
select {
case r := <-cli.Watch(ctx, wkey, opts...):
for _, v := range r.Events {
mk := gconv.String(v.Kv.Key)
mk = gstr.Replace(mk, prefix, "")
for _, k := range raw {
if k == mk {
call(g.Map{k: interface{}(v.Kv.Value)})
break
}
}
}
}
}
}
// GetStructTagName 获取struct的field的tag内容
func GetStructTagName(pointer interface{}) []string {
types := reflect.TypeOf(pointer)
numField := types.Elem().NumField()
var tagValues = make([]string, numField)
for i := 0; i < numField; i++ {
tagValue := types.Elem().Field(i).Tag.Get("json")
if tagValue == "" {
continue
}
tagValues[i] = gstr.Split(tagValue, ",")[0]
}
return tagValues
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/micro-tools/micro.git
git@gitee.com:micro-tools/micro.git
micro-tools
micro
micro
v1.0.0

搜索帮助