github.com/erda-project/erda-infra@v1.0.9/providers/etcd-election/examples/main.go (about) 1 // Copyright (c) 2021 Terminus, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package main 16 17 import ( 18 "context" 19 "os" 20 "time" 21 22 "github.com/erda-project/erda-infra/base/logs" 23 "github.com/erda-project/erda-infra/base/servicehub" 24 _ "github.com/erda-project/erda-infra/providers/etcd" 25 election "github.com/erda-project/erda-infra/providers/etcd-election" 26 ) 27 28 type provider struct { 29 Log logs.Logger 30 Election election.Interface `autowired:"etcd-election"` 31 } 32 33 func (p *provider) Init(ctx servicehub.Context) error { 34 p.Election.OnLeader(p.leaderTask) 35 return nil 36 } 37 38 func (p *provider) leaderTask(ctx context.Context) { 39 defer p.Log.Info("leader task exit") 40 watch := p.Election.Watch(ctx) 41 for { 42 select { 43 case event := <-watch: 44 p.Log.Infof("nodes changed: %v", event) 45 case <-time.After(3 * time.Second): 46 p.Log.Info("leader task doing") 47 case <-ctx.Done(): 48 return 49 } 50 } 51 } 52 53 func (p *provider) Run(ctx context.Context) error { 54 select { 55 case <-time.After(10 * time.Second): 56 p.Log.Info("resign leader") 57 p.Election.ResignLeader() 58 case <-ctx.Done(): 59 } 60 return nil 61 } 62 63 func init() { 64 servicehub.Register("example", &servicehub.Spec{ 65 Services: []string{"example"}, 66 Dependencies: []string{"etcd"}, 67 Description: "example", 68 Creator: func() servicehub.Provider { 69 return &provider{} 70 }, 71 }) 72 } 73 74 func main() { 75 hub := servicehub.New() 76 hub.Run("examples", "", os.Args...) 77 } 78 79 // OUTPUT: 80 // provider etcd config: 81 // INFO[2021-06-23 17:13:26.894] provider etcd initialized 82 // node id: eff22718-a19c-4489-aa1c-b874f79c8b60 83 // INFO[2021-06-23 17:13:26.894] provider etcd-election (depends services: [etcd etcd-client]) initialized 84 // INFO[2021-06-23 17:13:26.894] provider example (depends services: [etcd etcd-election]) initialized 85 // INFO[2021-06-23 17:13:26.895] signals to quit: [hangup interrupt terminated quit] 86 // INFO[2021-06-23 17:13:26.900] provider example running ... 87 // INFO[2021-06-23 17:13:26.902] provider etcd-election running ... 88 // INFO[2021-06-23 17:13:29.124] I am leader ! node is "eff22718-a19c-4489-aa1c-b874f79c8b60" module=etcd-election 89 // INFO[2021-06-23 17:13:32.129] leader task doing module=example 90 // INFO[2021-06-23 17:13:32.802] nodes changed: {delete {74ee6ac7-1703-43c6-bdc8-df90f9984d5b}} module=example 91 // INFO[2021-06-23 17:13:35.807] leader task doing module=example 92 // INFO[2021-06-23 17:13:36.900] resign leader module=example 93 // INFO[2021-06-23 17:13:36.901] leader task exit module=example 94 // INFO[2021-06-23 17:13:36.968] provider example exit 95 // INFO[2021-06-23 17:13:42.798] I am leader ! node is "eff22718-a19c-4489-aa1c-b874f79c8b60" module=etcd-election 96 // INFO[2021-06-23 17:13:45.800] leader task doing module=example 97 // INFO[2021-06-23 17:13:48.802] leader task doing module=example 98 // INFO[2021-06-23 17:13:51.806] leader task doing module=example 99 // INFO[2021-06-23 17:13:54.497] nodes changed: {delete {}} module=example 100 // INFO[2021-06-23 17:13:57.502] leader task doing module=example 101 // INFO[2021-06-23 17:14:00.506] leader task doing module=example 102 // INFO[2021-06-23 17:14:03.510] leader task doing module=example