| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package main
- import (
- "errors"
- "flag"
- "fmt"
- etcdclient "github.com/rpcxio/rpcx-etcd/client"
- "log"
- "strings"
- "dashoo.cn/gateway/gin"
- gateway "github.com/rpcxio/rpcx-gateway"
- "github.com/smallnest/rpcx/client"
- )
- var (
- addr = flag.String("addr", ":9981", "http server address")
- registry = flag.String("registry", "peer2peer://127.0.0.1:8972", "registry address")
- basePath = flag.String("basepath", "/dashoo", "basepath for consul")
- failmode = flag.Int("failmode", int(client.Failover), "failMode, Failover in default")
- selectMode = flag.Int("selectmode", int(client.RoundRobin), "selectMode, RoundRobin in default")
- allowKeyNotFound = flag.Bool("key", true, "key, allow key not found")
- )
- type ServiceDiscovery struct {
- BasePath string
- SrvDiscovery client.ServiceDiscovery
- }
- func main() {
- flag.Parse()
- discoverys, err := createServiceDiscovery()
- if err != nil {
- log.Fatal(err)
- }
- httpServer := gin.New(*addr)
- var gws map[string]*gateway.Gateway
- gws = make(map[string]*gateway.Gateway)
- for key, value := range discoverys {
- if strings.HasPrefix(key, "/") {
- key = key[1:]
- }
- srvPath := "/" + key
- gws[srvPath] = gateway.NewGateway(srvPath, httpServer, value, client.FailMode(*failmode), client.SelectMode(*selectMode), client.DefaultOption)
- }
- // 启动服务
- if err := httpServer.Serve(); err != nil {
- log.Fatal(err)
- }
- }
- func createServiceDiscovery() (map[string]client.ServiceDiscovery, error) {
- var serviceDiscoverys map[string]client.ServiceDiscovery
- serviceDiscoverys = make(map[string]client.ServiceDiscovery)
- regAddr := *registry
- i := strings.Index(regAddr, "://")
- if i < 0 {
- return nil, errors.New("错误的 peer2peer registry 或 basepath参数. peer2peer微服务数量和basepath数量不同 ")
- }
- regType := regAddr[:i]
- regAddr = regAddr[i+3:]
- switch regType {
- case "peer2peer": // peer2peer://127.0.0.1:8972
- regAddrs := strings.Split(regAddr, ",")
- basePaths := strings.Split(*basePath, ",")
- if len(regAddrs) != len(basePaths) {
- return nil, errors.New("registry参数格式错误. 正确格式为:[registry_type://address]")
- }
- for index, path := range basePaths {
- discovery, err := client.NewPeer2PeerDiscovery("tcp@"+regAddrs[index], "")
- if err != nil {
- return nil, err
- }
- serviceDiscoverys[path] = discovery
- }
- //serviceDiscoverys["dashoo.biobank.adapter-0.1"] = discovery
- //return serviceDiscoverys, err
- return serviceDiscoverys, nil
- case "consul":
- basePaths := strings.Split(*basePath, ",")
- for _, path := range basePaths {
- discovery, err := client.NewConsulDiscoveryTemplate(path, []string{regAddr}, nil)
- if err != nil {
- return nil, err
- }
- serviceDiscoverys[path] = discovery
- }
- return serviceDiscoverys, nil
- case "etcd":
- basePaths := strings.Split(*basePath, ",")
- for _, path := range basePaths {
- discovery, err := etcdclient.NewEtcdDiscoveryTemplate(path, []string{regAddr}, *allowKeyNotFound, nil)
- if err != nil {
- return nil, err
- }
- serviceDiscoverys[path] = discovery
- }
- return serviceDiscoverys, nil
- case "etcdv3":
- basePaths := strings.Split(*basePath, ",")
- for _, path := range basePaths {
- discovery, err := etcdclient.NewEtcdV3DiscoveryTemplate(path, []string{regAddr}, *allowKeyNotFound, nil)
- if err != nil {
- return nil, err
- }
- serviceDiscoverys[path] = discovery
- }
- return serviceDiscoverys, nil
- default:
- return nil, fmt.Errorf("错误的registry类型 %s. 只支持peer2peer,multiple,consul,etcd,etcdv3", regType)
- }
- }
|