mirror of
				https://github.com/go-micro/go-micro.git
				synced 2025-10-30 23:27:41 +02:00 
			
		
		
		
	* PoC: memory registry using maps instead of slice madness * Updated proto and handlers. Fixed tests across codebase. * Implemented ttl pruning for memory registry * Added extensive memory registry tests * Squased a bunch of bugs * Proto indent; memory.Registry.String() returns "memory" * Write a test to prove memory registry TTLs are busted Signed-off-by: Erik Hollensbe <github@hollensbe.org> * Additional memory testing and fixups: * DefaultTTL removed * When TTL == 0, it is automatically removed from expiry conditions * Additional improvements to new tests Signed-off-by: Erik Hollensbe <github@hollensbe.org>
This commit is contained in:
		
				
					committed by
					
						 Asim Aslam
						Asim Aslam
					
				
			
			
				
	
			
			
			
						parent
						
							97c1300f53
						
					
				
				
					commit
					4107733453
				
			| @@ -7,15 +7,13 @@ import ( | ||||
|  | ||||
| 	glog "github.com/go-log/log" | ||||
| 	"github.com/google/uuid" | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| 	"github.com/micro/go-micro/registry/memory" | ||||
| 	"github.com/micro/go-micro/util/log" | ||||
| ) | ||||
|  | ||||
| func newTestRegistry() *memory.Registry { | ||||
| 	r := memory.NewRegistry() | ||||
| 	m := r.(*memory.Registry) | ||||
| 	m.Services = testData | ||||
| 	return m | ||||
| func newTestRegistry() registry.Registry { | ||||
| 	return memory.NewRegistry(memory.Services(testData)) | ||||
| } | ||||
|  | ||||
| func sub(be *testing.B, c int) { | ||||
|   | ||||
| @@ -12,10 +12,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| func newTestRegistry() registry.Registry { | ||||
| 	r := memory.NewRegistry() | ||||
| 	reg := r.(*memory.Registry) | ||||
| 	reg.Services = testData | ||||
| 	return reg | ||||
| 	return memory.NewRegistry(memory.Services(testData)) | ||||
| } | ||||
|  | ||||
| func TestCallAddress(t *testing.T) { | ||||
|   | ||||
| @@ -9,9 +9,7 @@ import ( | ||||
| func TestRegistrySelector(t *testing.T) { | ||||
| 	counts := map[string]int{} | ||||
|  | ||||
| 	r := memory.NewRegistry() | ||||
| 	rg := r.(*memory.Registry) | ||||
| 	rg.Services = testData | ||||
| 	r := memory.NewRegistry(memory.Services(testData)) | ||||
| 	cache := NewSelector(Registry(r)) | ||||
|  | ||||
| 	next, err := cache.Select("foo") | ||||
|   | ||||
| @@ -13,8 +13,7 @@ func TestFunction(t *testing.T) { | ||||
| 	var wg sync.WaitGroup | ||||
| 	wg.Add(1) | ||||
|  | ||||
| 	r := memory.NewRegistry() | ||||
| 	r.(*memory.Registry).Services = testData | ||||
| 	r := memory.NewRegistry(memory.Services(testData)) | ||||
|  | ||||
| 	// create service | ||||
| 	fn := NewFunction( | ||||
|   | ||||
							
								
								
									
										6
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.mod
									
									
									
									
									
								
							| @@ -8,7 +8,6 @@ require ( | ||||
| 	github.com/bitly/go-simplejson v0.5.0 | ||||
| 	github.com/bwmarrin/discordgo v0.20.1 | ||||
| 	github.com/coreos/etcd v3.3.17+incompatible | ||||
| 	github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect | ||||
| 	github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c | ||||
| 	github.com/fsnotify/fsnotify v1.4.7 | ||||
| 	github.com/fsouza/go-dockerclient v1.6.0 | ||||
| @@ -16,7 +15,6 @@ require ( | ||||
| 	github.com/go-acme/lego/v3 v3.1.0 | ||||
| 	github.com/go-log/log v0.1.0 | ||||
| 	github.com/go-playground/locales v0.13.0 // indirect | ||||
| 	github.com/go-playground/universal-translator v0.16.0 // indirect | ||||
| 	github.com/golang/protobuf v1.3.2 | ||||
| 	github.com/google/uuid v1.1.1 | ||||
| 	github.com/gorilla/handlers v1.4.2 | ||||
| @@ -32,13 +30,13 @@ require ( | ||||
| 	github.com/mholt/certmagic v0.8.3 | ||||
| 	github.com/micro/cli v0.2.0 | ||||
| 	github.com/micro/mdns v0.3.0 | ||||
| 	github.com/miekg/dns v1.1.15 | ||||
| 	github.com/micro/protoc-gen-micro v1.0.0 // indirect | ||||
| 	github.com/miekg/dns v1.1.22 | ||||
| 	github.com/mitchellh/hashstructure v1.0.0 | ||||
| 	github.com/nats-io/nats.go v1.9.1 | ||||
| 	github.com/nlopes/slack v0.6.0 | ||||
| 	github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c | ||||
| 	github.com/pkg/errors v0.8.1 | ||||
| 	github.com/technoweenie/multipartstreamer v1.0.1 // indirect | ||||
| 	go.uber.org/zap v1.12.0 // indirect | ||||
| 	golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a | ||||
| 	golang.org/x/net v0.0.0-20191109021931-daa7c04131f5 | ||||
|   | ||||
							
								
								
									
										55
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								go.sum
									
									
									
									
									
								
							| @@ -18,7 +18,9 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L | ||||
| github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= | ||||
| github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= | ||||
| github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= | ||||
| github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= | ||||
| github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8= | ||||
| github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= | ||||
| github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= | ||||
| @@ -43,6 +45,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r | ||||
| github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= | ||||
| github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= | ||||
| github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= | ||||
| github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= | ||||
| github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= | ||||
| github.com/bwmarrin/discordgo v0.20.1 h1:Ihh3/mVoRwy3otmaoPDUioILBJq4fdWkpsi83oj2Lmk= | ||||
| github.com/bwmarrin/discordgo v0.20.1/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= | ||||
| github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= | ||||
| @@ -59,16 +63,20 @@ github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on | ||||
| github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/containerd v1.3.0 h1:xjvXQWABwS2uiv3TWgQt5Uth60Gu86LTGZXMJkjc7rY= | ||||
| github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= | ||||
| github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8= | ||||
| github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= | ||||
| github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= | ||||
| github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= | ||||
| github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= | ||||
| github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= | ||||
| github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= | ||||
| github.com/coreos/etcd v3.3.17+incompatible h1:f/Z3EoDSx1yjaIjLQGo1diYUlQYSBrrAQ5vP8NjwXwo= | ||||
| github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= | ||||
| github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok= | ||||
| @@ -83,6 +91,7 @@ github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s9 | ||||
| github.com/dnsimple/dnsimple-go v0.30.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= | ||||
| github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= | ||||
| github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= | ||||
| github.com/docker/docker v1.4.2-0.20190710153559-aa8249ae1b8b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23 h1:oqgGT9O61YAYvI41EBsLePOr+LE6roB0xY4gpkZuFSE= | ||||
| github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= | ||||
| github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= | ||||
| @@ -103,6 +112,7 @@ github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c h1:pBgVXWDXj | ||||
| github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c/go.mod h1:pFdJbAhRf7rh6YYMUdIQGyzne6zYL1tCUW8QV2B3UfY= | ||||
| github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/fsouza/go-dockerclient v1.4.4/go.mod h1:PrwszSL5fbmsESocROrOGq/NULMXRw+bajY0ltzD6MA= | ||||
| github.com/fsouza/go-dockerclient v1.6.0 h1:f7j+AX94143JL1H3TiqSMkM4EcLDI0De1qD4GGn3Hig= | ||||
| github.com/fsouza/go-dockerclient v1.6.0/go.mod h1:YWwtNPuL4XTX1SKJQk86cWPmmqwx+4np9qfPbb+znGc= | ||||
| github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= | ||||
| @@ -119,11 +129,13 @@ github.com/go-log/log v0.1.0 h1:wudGTNsiGzrD5ZjgIkVZ517ugi2XRe9Q/xRCzwEO4/U= | ||||
| github.com/go-log/log v0.1.0/go.mod h1:4mBwpdRMFLiuXZDCwU2lKQFsoSCo72j3HqBK9d81N2M= | ||||
| github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= | ||||
| github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= | ||||
| github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= | ||||
| github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= | ||||
| github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= | ||||
| github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= | ||||
| github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= | ||||
| github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= | ||||
| github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= | ||||
| github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= | ||||
| github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| @@ -132,6 +144,7 @@ github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= | ||||
| github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= | ||||
| github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/groupcache v0.0.0-20191002201903-404acd9df4cc/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= | ||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| @@ -164,6 +177,8 @@ github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA | ||||
| github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= | ||||
| github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= | ||||
| github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= | ||||
| github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= | ||||
| github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| @@ -175,12 +190,14 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= | ||||
| github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | ||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= | ||||
| github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd/go.mod h1:3LVOLeyx9XVvwPgrt2be44XgSqndprz1G18rSk8KD84= | ||||
| github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= | ||||
| github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= | ||||
| github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= | ||||
| github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= | ||||
| github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= | ||||
| github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= | ||||
| github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= | ||||
| github.com/joncalhoun/qson v0.0.0-20170526102502-8a9cab3a62b1 h1:lnrOS18wZBYrzdDmnUeg1OVk+kQ3rxG8mZWU89DpMIA= | ||||
| github.com/joncalhoun/qson v0.0.0-20170526102502-8a9cab3a62b1/go.mod h1:DFXrEwSRX0p/aSvxE21319menCBFeQO0jXpRj7LEZUA= | ||||
| github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| @@ -209,17 +226,20 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= | ||||
| github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= | ||||
| github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= | ||||
| github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= | ||||
| github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= | ||||
| github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= | ||||
| github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA= | ||||
| github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= | ||||
| github.com/lucas-clemente/quic-go v0.12.1/go.mod h1:UXJJPE4RfFef/xPO5wQm0tITK8gNfqwTxjbE7s3Vb8s= | ||||
| github.com/lucas-clemente/quic-go v0.13.1 h1:CxtJTXQIh2aboCPk0M6vf530XOov6DZjVBiSE3nSj8s= | ||||
| github.com/lucas-clemente/quic-go v0.13.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= | ||||
| github.com/marten-seemann/chacha20 v0.2.0 h1:f40vqzzx+3GdOmzQoItkLX5WLvHgPgyYqFFIO5Gh4hQ= | ||||
| github.com/marten-seemann/chacha20 v0.2.0/go.mod h1:HSdjFau7GzYRj+ahFNwsO3ouVJr1HFkWoEwNDb4TMtE= | ||||
| github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= | ||||
| github.com/marten-seemann/qtls v0.3.2/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= | ||||
| github.com/marten-seemann/qtls v0.4.1 h1:YlT8QP3WCCvvok7MGEZkMldXbyqgr8oFg5/n8Gtbkks= | ||||
| github.com/marten-seemann/qtls v0.4.1/go.mod h1:pxVXcHHw1pNIt8Qo0pwSYQEoZ8yYOOPXTCZLQQunvRc= | ||||
| github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| @@ -227,15 +247,21 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp | ||||
| github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | ||||
| github.com/mholt/certmagic v0.7.5/go.mod h1:91uJzK5K8IWtYQqTi5R2tsxV1pCde+wdGfaRaOZi6aQ= | ||||
| github.com/mholt/certmagic v0.8.3 h1:JOUiX9IAZbbgyjNP2GY6v/6lorH+9GkZsc7ktMpGCSo= | ||||
| github.com/mholt/certmagic v0.8.3/go.mod h1:91uJzK5K8IWtYQqTi5R2tsxV1pCde+wdGfaRaOZi6aQ= | ||||
| github.com/micro/cli v0.2.0 h1:ut3rV5JWqZjsXIa2MvGF+qMUP8DAUTvHX9Br5gO4afA= | ||||
| github.com/micro/cli v0.2.0/go.mod h1:jRT9gmfVKWSS6pkKcXQ8YhUyj6bzwxK8Fp5b0Y7qNnk= | ||||
| github.com/micro/go-micro v1.16.0/go.mod h1:A0F58bHLh2m0LAI9QyhvmbN8c1cxhAZo3cM6s+iDsrM= | ||||
| github.com/micro/mdns v0.3.0 h1:bYycYe+98AXR3s8Nq5qvt6C573uFTDPIYzJemWON0QE= | ||||
| github.com/micro/mdns v0.3.0/go.mod h1:KJ0dW7KmicXU2BV++qkLlmHYcVv7/hHnbtguSWt9Aoc= | ||||
| github.com/micro/protoc-gen-micro v1.0.0 h1:qKh5S3I1RfenhIs5mqDFJLwRlRDlgin7XWiUKZbpwLM= | ||||
| github.com/micro/protoc-gen-micro v1.0.0/go.mod h1:C8ij4DJhapBmypcT00AXdb0cZ675/3PqUO02buWWqbE= | ||||
| github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= | ||||
| github.com/miekg/dns v1.1.15 h1:CSSIDtllwGLMoA6zjdKnaE6Tx6eVUxQ29LUgGetiDCI= | ||||
| github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= | ||||
| github.com/miekg/dns v1.1.22 h1:Jm64b3bO9kP43ddLjL2EY3Io6bmy1qGb9Xxz6TqS6rc= | ||||
| github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= | ||||
| github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= | ||||
| github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= | ||||
| github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= | ||||
| @@ -254,8 +280,11 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW | ||||
| github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8= | ||||
| github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= | ||||
| github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= | ||||
| github.com/nats-io/nats-server/v2 v2.1.0/go.mod h1:r5y0WgCag0dTj/qiHkHrXAcKQ/f5GMOZaEGdoxxnJ4I= | ||||
| github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= | ||||
| github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= | ||||
| github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= | ||||
| github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= | ||||
| github.com/nats-io/nkeys v0.1.0 h1:qMd4+pRHgdr1nAClu+2h/2a5F2TmKcCzjCDazVgRoX4= | ||||
| github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= | ||||
| github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= | ||||
| @@ -280,6 +309,7 @@ github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJ | ||||
| github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= | ||||
| github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= | ||||
| github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||
| github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= | ||||
| github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= | ||||
| github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= | ||||
| @@ -324,6 +354,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd | ||||
| github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= | ||||
| github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | ||||
| github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= | ||||
| github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| @@ -336,6 +367,7 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG | ||||
| github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= | ||||
| github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= | ||||
| github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= | ||||
| github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= | ||||
| github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= | ||||
| github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= | ||||
| github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= | ||||
| @@ -347,32 +379,42 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 | ||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | ||||
| github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= | ||||
| github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= | ||||
| github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= | ||||
| go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | ||||
| go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= | ||||
| go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= | ||||
| go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= | ||||
| go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= | ||||
| go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= | ||||
| go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= | ||||
| go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| go.uber.org/zap v1.12.0 h1:dySoUQPFBGj6xwjmBzageVL8jGi8uxc6bEmJQjA06bw= | ||||
| go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= | ||||
| golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= | ||||
| golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a h1:R/qVym5WAxsZWQqZCwDY/8sdVKV1m1WgU4/S5IRQAzc= | ||||
| golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| @@ -400,7 +442,9 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn | ||||
| golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191011234655-491137f69257/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20191109021931-daa7c04131f5 h1:bHNaocaoJxYBo5cw41UyTMLjYlb8wPY7+WFrnklbHOM= | ||||
| golang.org/x/net v0.0.0-20191109021931-daa7c04131f5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| @@ -423,17 +467,23 @@ golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5h | ||||
| golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4 h1:Hynbrlo6LbYI3H1IqXpkVDOcX/3HiPdhVEuyj5a59RM= | ||||
| golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | ||||
| @@ -454,6 +504,7 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= | ||||
| golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| @@ -471,12 +522,14 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn | ||||
| google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||
| google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= | ||||
| google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= | ||||
| google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= | ||||
| google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= | ||||
| google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| @@ -484,6 +537,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= | ||||
| gopkg.in/go-playground/validator.v9 v9.30.0 h1:Wk0Z37oBmKj9/n+tPyBHZmeL19LaCoK3Qq48VwYENss= | ||||
| gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= | ||||
| gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= | ||||
| @@ -516,3 +570,4 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= | ||||
| sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package memory | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| @@ -14,23 +13,29 @@ import ( | ||||
|  | ||||
| var ( | ||||
| 	sendEventTime = 10 * time.Millisecond | ||||
| 	ttlPruneTime  = 1 * time.Minute | ||||
| 	DefaultTTL    = 1 * time.Minute | ||||
| 	ttlPruneTime  = time.Second | ||||
| ) | ||||
|  | ||||
| // node tracks node registration timestamp and TTL | ||||
| type node struct { | ||||
| 	lastSeen time.Time | ||||
| 	ttl      time.Duration | ||||
| 	*registry.Node | ||||
| 	TTL      time.Duration | ||||
| 	LastSeen time.Time | ||||
| } | ||||
|  | ||||
| type record struct { | ||||
| 	Name      string | ||||
| 	Version   string | ||||
| 	Metadata  map[string]string | ||||
| 	Nodes     map[string]*node | ||||
| 	Endpoints []*registry.Endpoint | ||||
| } | ||||
|  | ||||
| type Registry struct { | ||||
| 	options registry.Options | ||||
|  | ||||
| 	sync.RWMutex | ||||
| 	Services map[string][]*registry.Service | ||||
| 	nodes    map[string]*node | ||||
| 	Watchers map[string]*Watcher | ||||
| 	records  map[string]map[string]*record | ||||
| 	watchers map[string]*Watcher | ||||
| } | ||||
|  | ||||
| func NewRegistry(opts ...registry.Option) registry.Registry { | ||||
| @@ -42,16 +47,15 @@ func NewRegistry(opts ...registry.Option) registry.Registry { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	services := getServices(options.Context) | ||||
| 	if services == nil { | ||||
| 		services = make(map[string][]*registry.Service) | ||||
| 	records := getServiceRecords(options.Context) | ||||
| 	if records == nil { | ||||
| 		records = make(map[string]map[string]*record) | ||||
| 	} | ||||
|  | ||||
| 	reg := &Registry{ | ||||
| 		options:  options, | ||||
| 		Services: services, | ||||
| 		nodes:    make(map[string]*node), | ||||
| 		Watchers: make(map[string]*Watcher), | ||||
| 		records:  records, | ||||
| 		watchers: make(map[string]*Watcher), | ||||
| 	} | ||||
|  | ||||
| 	go reg.ttlPrune() | ||||
| @@ -59,11 +63,6 @@ func NewRegistry(opts ...registry.Option) registry.Registry { | ||||
| 	return reg | ||||
| } | ||||
|  | ||||
| // nodeTrackId returns a string we use to track a node of a given service | ||||
| func nodeTrackId(svcName, svcVersion, nodeId string) string { | ||||
| 	return svcName + "+" + svcVersion + "+" + nodeId | ||||
| } | ||||
|  | ||||
| func (m *Registry) ttlPrune() { | ||||
| 	prune := time.NewTicker(ttlPruneTime) | ||||
| 	defer prune.Stop() | ||||
| @@ -72,49 +71,26 @@ func (m *Registry) ttlPrune() { | ||||
| 		select { | ||||
| 		case <-prune.C: | ||||
| 			m.Lock() | ||||
| 			for nodeTrackId, node := range m.nodes { | ||||
| 				// if the TTL has been set and we exceed the hresholdset by it we stop tracking the node | ||||
| 				if node.ttl.Seconds() != 0.0 && time.Since(node.lastSeen) > node.ttl { | ||||
| 					// split nodeTrackID into service Name, Version and Node Id | ||||
| 					trackIdSplit := strings.Split(nodeTrackId, "+") | ||||
| 					svcName, svcVersion, nodeId := trackIdSplit[0], trackIdSplit[1], trackIdSplit[2] | ||||
| 					log.Debugf("[memory] Registry TTL expired for service %s, node %s", svcName, nodeId) | ||||
| 					// we need to find a node that expired and delete it from service nodes | ||||
| 					if _, ok := m.Services[svcName]; ok { | ||||
| 						for _, service := range m.Services[svcName] { | ||||
| 							if service.Version != svcVersion { | ||||
| 								continue | ||||
| 							} | ||||
| 							// find expired service node and delete it | ||||
| 							var nodes []*registry.Node | ||||
| 							for _, n := range service.Nodes { | ||||
| 								var del bool | ||||
| 								if n.Id == nodeId { | ||||
| 									del = true | ||||
| 								} | ||||
| 								if !del { | ||||
| 									nodes = append(nodes, n) | ||||
| 								} | ||||
| 							} | ||||
| 							service.Nodes = nodes | ||||
| 			for name, records := range m.records { | ||||
| 				for version, record := range records { | ||||
| 					for id, n := range record.Nodes { | ||||
| 						if n.TTL != 0 && time.Since(n.LastSeen) > n.TTL { | ||||
| 							log.Debugf("Registry TTL expired for node %s of service %s", n.Id, name) | ||||
| 							delete(m.records[name][version].Nodes, id) | ||||
| 						} | ||||
| 					} | ||||
| 					// stop tracking the node | ||||
| 					delete(m.nodes, nodeTrackId) | ||||
| 				} | ||||
| 			} | ||||
| 			m.Unlock() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (m *Registry) sendEvent(r *registry.Result) { | ||||
| 	watchers := make([]*Watcher, 0, len(m.Watchers)) | ||||
| 	watchers := make([]*Watcher, 0, len(m.watchers)) | ||||
|  | ||||
| 	m.RLock() | ||||
| 	for _, w := range m.Watchers { | ||||
| 	for _, w := range m.watchers { | ||||
| 		watchers = append(watchers, w) | ||||
| 	} | ||||
| 	m.RUnlock() | ||||
| @@ -123,7 +99,7 @@ func (m *Registry) sendEvent(r *registry.Result) { | ||||
| 		select { | ||||
| 		case <-w.exit: | ||||
| 			m.Lock() | ||||
| 			delete(m.Watchers, w.id) | ||||
| 			delete(m.watchers, w.id) | ||||
| 			m.Unlock() | ||||
| 		default: | ||||
| 			select { | ||||
| @@ -141,11 +117,24 @@ func (m *Registry) Init(opts ...registry.Option) error { | ||||
|  | ||||
| 	// add services | ||||
| 	m.Lock() | ||||
| 	for k, v := range getServices(m.options.Context) { | ||||
| 		s := m.Services[k] | ||||
| 		m.Services[k] = registry.Merge(s, v) | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	records := getServiceRecords(m.options.Context) | ||||
| 	for name, record := range records { | ||||
| 		// add a whole new service including all of its versions | ||||
| 		if _, ok := m.records[name]; !ok { | ||||
| 			m.records[name] = record | ||||
| 			continue | ||||
| 		} | ||||
| 		// add the versions of the service we dont track yet | ||||
| 		for version, r := range record { | ||||
| 			if _, ok := m.records[name][version]; !ok { | ||||
| 				m.records[name][version] = r | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	m.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -153,104 +142,61 @@ func (m *Registry) Options() registry.Options { | ||||
| 	return m.options | ||||
| } | ||||
|  | ||||
| func (m *Registry) GetService(name string) ([]*registry.Service, error) { | ||||
| 	m.RLock() | ||||
| 	service, ok := m.Services[name] | ||||
| 	m.RUnlock() | ||||
| 	if !ok { | ||||
| 		return nil, registry.ErrNotFound | ||||
| 	} | ||||
|  | ||||
| 	return service, nil | ||||
| } | ||||
|  | ||||
| func (m *Registry) ListServices() ([]*registry.Service, error) { | ||||
| 	var services []*registry.Service | ||||
| 	m.RLock() | ||||
| 	for _, service := range m.Services { | ||||
| 		services = append(services, service...) | ||||
| 	} | ||||
| 	m.RUnlock() | ||||
| 	return services, nil | ||||
| } | ||||
|  | ||||
| func (m *Registry) Register(s *registry.Service, opts ...registry.RegisterOption) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	log.Debugf("[memory] Registry registering service: %s", s.Name) | ||||
|  | ||||
| 	var options registry.RegisterOptions | ||||
| 	for _, o := range opts { | ||||
| 		o(&options) | ||||
| 	} | ||||
|  | ||||
| 	if service, ok := m.Services[s.Name]; !ok { | ||||
| 		m.Services[s.Name] = []*registry.Service{s} | ||||
| 		// add all nodes into nodes map to track their TTL | ||||
| 		for _, n := range s.Nodes { | ||||
| 			log.Debugf("[memory] Registry tracking new service: %s, node %s", s.Name, n.Id) | ||||
| 			m.nodes[nodeTrackId(s.Name, s.Version, n.Id)] = &node{ | ||||
| 				lastSeen: time.Now(), | ||||
| 				ttl:      options.TTL, | ||||
| 			} | ||||
| 		} | ||||
| 	r := serviceToRecord(s, options.TTL) | ||||
|  | ||||
| 	if _, ok := m.records[s.Name]; !ok { | ||||
| 		m.records[s.Name] = make(map[string]*record) | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := m.records[s.Name][s.Version]; !ok { | ||||
| 		m.records[s.Name][s.Version] = r | ||||
| 		log.Debugf("Registry added new service: %s, version: %s", s.Name, s.Version) | ||||
| 		go m.sendEvent(®istry.Result{Action: "update", Service: s}) | ||||
| 		return nil | ||||
| 	} else { | ||||
| 		// svcCount keeps the count of all versions of particular service | ||||
| 		//svcCount := len(service) | ||||
| 		// svcNodes maintains a list of node Ids per particular service version | ||||
| 		svcNodes := make(map[string]map[string][]string) | ||||
| 		// collect all service ids for all service versions | ||||
| 		for _, s := range service { | ||||
| 			if _, ok := svcNodes[s.Name]; !ok { | ||||
| 				svcNodes[s.Name] = make(map[string][]string) | ||||
| 			} | ||||
| 			if _, ok := svcNodes[s.Name][s.Version]; !ok { | ||||
| 				for _, n := range s.Nodes { | ||||
| 					svcNodes[s.Name][s.Version] = append(svcNodes[s.Name][s.Version], n.Id) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		// if merged count and original service counts changed we know we are adding a new version of the service | ||||
| 		merged := registry.Merge(service, []*registry.Service{s}) | ||||
| 		// if the node count of any service [version] changed we know we are adding a new node to the service | ||||
| 		for _, s := range merged { | ||||
| 			// we know that if the node counts have changed we need to track new nodes | ||||
| 			if len(s.Nodes) != len(svcNodes[s.Name][s.Version]) { | ||||
| 				for _, n := range s.Nodes { | ||||
| 					var found bool | ||||
| 					for _, id := range svcNodes[s.Name][s.Version] { | ||||
| 						if n.Id == id { | ||||
| 							found = true | ||||
| 							break | ||||
| 						} | ||||
| 					} | ||||
| 					if !found { | ||||
| 						log.Debugf("[memory] Registry tracking new node: %s for service %s", n.Id, s.Name) | ||||
| 						m.nodes[nodeTrackId(s.Name, s.Version, n.Id)] = &node{ | ||||
| 							lastSeen: time.Now(), | ||||
| 							ttl:      options.TTL, | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				m.Services[s.Name] = merged | ||||
| 				go m.sendEvent(®istry.Result{Action: "update", Service: s}) | ||||
| 				return nil | ||||
| 			} | ||||
| 			// refresh the timestamp and TTL of the service node | ||||
| 			for _, n := range s.Nodes { | ||||
| 				trackId := nodeTrackId(s.Name, s.Version, n.Id) | ||||
| 				log.Debugf("[memory] Registry refreshing TTL for node %s for service %s", n.Id, s.Name) | ||||
| 				if trackedNode, ok := m.nodes[trackId]; ok { | ||||
| 					trackedNode.lastSeen = time.Now() | ||||
| 					trackedNode.ttl = options.TTL | ||||
| 	} | ||||
|  | ||||
| 	addedNodes := false | ||||
| 	for _, n := range s.Nodes { | ||||
| 		if _, ok := m.records[s.Name][s.Version].Nodes[n.Id]; !ok { | ||||
| 			addedNodes = true | ||||
| 			metadata := make(map[string]string) | ||||
| 			for k, v := range n.Metadata { | ||||
| 				metadata[k] = v | ||||
| 				m.records[s.Name][s.Version].Nodes[n.Id] = &node{ | ||||
| 					Node: ®istry.Node{ | ||||
| 						Id:       n.Id, | ||||
| 						Address:  n.Address, | ||||
| 						Metadata: metadata, | ||||
| 					}, | ||||
| 					TTL:      options.TTL, | ||||
| 					LastSeen: time.Now(), | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if addedNodes { | ||||
| 		log.Debugf("Registry added new node to service: %s, version: %s", s.Name, s.Version) | ||||
| 		go m.sendEvent(®istry.Result{Action: "update", Service: s}) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// refresh TTL and timestamp | ||||
| 	for _, n := range s.Nodes { | ||||
| 		log.Debugf("Updated registration for service: %s, version: %s", s.Name, s.Version) | ||||
| 		m.records[s.Name][s.Version].Nodes[n.Id].TTL = options.TTL | ||||
| 		m.records[s.Name][s.Version].Nodes[n.Id].LastSeen = time.Now() | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -258,57 +204,62 @@ func (m *Registry) Deregister(s *registry.Service) error { | ||||
| 	m.Lock() | ||||
| 	defer m.Unlock() | ||||
|  | ||||
| 	log.Debugf("[memory] Registry deregistering service: %s", s.Name) | ||||
|  | ||||
| 	if service, ok := m.Services[s.Name]; ok { | ||||
| 		// svcNodes collects the list of all node Ids for each service version | ||||
| 		svcNodes := make(map[string]map[string][]string) | ||||
| 		// collect all service node ids for all service versions | ||||
| 		for _, svc := range service { | ||||
| 			if _, ok := svcNodes[svc.Name]; !ok { | ||||
| 				svcNodes[svc.Name] = make(map[string][]string) | ||||
| 			} | ||||
| 			if _, ok := svcNodes[svc.Name][svc.Version]; !ok { | ||||
| 				for _, n := range svc.Nodes { | ||||
| 					svcNodes[svc.Name][svc.Version] = append(svcNodes[svc.Name][svc.Version], n.Id) | ||||
| 	if _, ok := m.records[s.Name]; ok { | ||||
| 		if _, ok := m.records[s.Name][s.Version]; ok { | ||||
| 			for _, n := range s.Nodes { | ||||
| 				if _, ok := m.records[s.Name][s.Version].Nodes[n.Id]; ok { | ||||
| 					log.Debugf("Registry removed node from service: %s, version: %s", s.Name, s.Version) | ||||
| 					delete(m.records[s.Name][s.Version].Nodes, n.Id) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		// if there are no more services we know we have either removed all nodes or there were no nodes | ||||
| 		if updatedService := registry.Remove(service, []*registry.Service{s}); len(updatedService) == 0 { | ||||
| 			for _, id := range svcNodes[s.Name][s.Version] { | ||||
| 				log.Debugf("[memory] Registry stopped tracking node %s for service %s", id, s.Name) | ||||
| 				delete(m.nodes, nodeTrackId(s.Name, s.Version, id)) | ||||
| 				go m.sendEvent(®istry.Result{Action: "delete", Service: s}) | ||||
| 			} | ||||
| 			log.Debugf("[memory] Registry deleting service %s: no service nodes", s.Name) | ||||
| 			delete(m.Services, s.Name) | ||||
| 			return nil | ||||
| 		} else { | ||||
| 			// find out which nodes have been removed | ||||
| 			for _, id := range svcNodes[s.Name][s.Version] { | ||||
| 				for _, svc := range updatedService { | ||||
| 					var found bool | ||||
| 					for _, n := range svc.Nodes { | ||||
| 						if id == n.Id { | ||||
| 							found = true | ||||
| 							break | ||||
| 						} | ||||
| 					} | ||||
| 					if !found { | ||||
| 						log.Debugf("[memory] Registry stopped tracking node %s for service %s", id, s.Name) | ||||
| 						delete(m.nodes, nodeTrackId(s.Name, s.Version, id)) | ||||
| 						go m.sendEvent(®istry.Result{Action: "delete", Service: s}) | ||||
| 					} | ||||
| 				} | ||||
| 				m.Services[s.Name] = updatedService | ||||
| 			if len(m.records[s.Name][s.Version].Nodes) == 0 { | ||||
| 				delete(m.records[s.Name], s.Version) | ||||
| 				log.Debugf("Registry removed service: %s, version: %s", s.Name, s.Version) | ||||
| 			} | ||||
| 		} | ||||
| 		if len(m.records[s.Name]) == 0 { | ||||
| 			delete(m.records, s.Name) | ||||
| 			log.Debugf("Registry removed service: %s", s.Name) | ||||
| 		} | ||||
| 		go m.sendEvent(®istry.Result{Action: "delete", Service: s}) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Registry) GetService(name string) ([]*registry.Service, error) { | ||||
| 	m.RLock() | ||||
| 	defer m.RUnlock() | ||||
|  | ||||
| 	records, ok := m.records[name] | ||||
| 	if !ok { | ||||
| 		return nil, registry.ErrNotFound | ||||
| 	} | ||||
|  | ||||
| 	services := make([]*registry.Service, len(m.records[name])) | ||||
| 	i := 0 | ||||
| 	for _, record := range records { | ||||
| 		services[i] = recordToService(record) | ||||
| 		i++ | ||||
| 	} | ||||
|  | ||||
| 	return services, nil | ||||
| } | ||||
|  | ||||
| func (m *Registry) ListServices() ([]*registry.Service, error) { | ||||
| 	m.RLock() | ||||
| 	defer m.RUnlock() | ||||
|  | ||||
| 	var services []*registry.Service | ||||
| 	for _, records := range m.records { | ||||
| 		for _, record := range records { | ||||
| 			services = append(services, recordToService(record)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return services, nil | ||||
| } | ||||
|  | ||||
| func (m *Registry) Watch(opts ...registry.WatchOption) (registry.Watcher, error) { | ||||
| 	var wo registry.WatchOptions | ||||
| 	for _, o := range opts { | ||||
| @@ -323,8 +274,9 @@ func (m *Registry) Watch(opts ...registry.WatchOption) (registry.Watcher, error) | ||||
| 	} | ||||
|  | ||||
| 	m.Lock() | ||||
| 	m.Watchers[w.id] = w | ||||
| 	m.watchers[w.id] = w | ||||
| 	m.Unlock() | ||||
|  | ||||
| 	return w, nil | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,9 @@ | ||||
| package memory | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| ) | ||||
| @@ -102,10 +104,20 @@ func TestMemoryRegistry(t *testing.T) { | ||||
|  | ||||
| 	// register data | ||||
| 	for _, v := range testData { | ||||
| 		serviceCount := 0 | ||||
| 		for _, service := range v { | ||||
| 			if err := m.Register(service); err != nil { | ||||
| 				t.Errorf("Unexpected register error: %v", err) | ||||
| 			} | ||||
| 			serviceCount++ | ||||
| 			// after the service has been registered we should be able to query it | ||||
| 			services, err := m.GetService(service.Name) | ||||
| 			if err != nil { | ||||
| 				t.Errorf("Unexpected error getting service %s: %v", service.Name, err) | ||||
| 			} | ||||
| 			if len(services) != serviceCount { | ||||
| 				t.Errorf("Expected %d services for %s, got %d", serviceCount, service.Name, len(services)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -114,6 +126,22 @@ func TestMemoryRegistry(t *testing.T) { | ||||
| 		fn(k, v) | ||||
| 	} | ||||
|  | ||||
| 	services, err := m.ListServices() | ||||
| 	if err != nil { | ||||
| 		t.Errorf("Unexpected error when listing services: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	totalServiceCount := 0 | ||||
| 	for _, testSvc := range testData { | ||||
| 		for range testSvc { | ||||
| 			totalServiceCount++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(services) != totalServiceCount { | ||||
| 		t.Errorf("Expected total service count: %d, got: %d", totalServiceCount, len(services)) | ||||
| 	} | ||||
|  | ||||
| 	// deregister | ||||
| 	for _, v := range testData { | ||||
| 		for _, service := range v { | ||||
| @@ -122,4 +150,94 @@ func TestMemoryRegistry(t *testing.T) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// after all the service nodes have been deregistered we should not get any results | ||||
| 	for _, v := range testData { | ||||
| 		for _, service := range v { | ||||
| 			services, err := m.GetService(service.Name) | ||||
| 			if err != registry.ErrNotFound { | ||||
| 				t.Errorf("Expected error: %v, got: %v", registry.ErrNotFound, err) | ||||
| 			} | ||||
| 			if len(services) != 0 { | ||||
| 				t.Errorf("Expected %d services for %s, got %d", 0, service.Name, len(services)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMemoryRegistryTTL(t *testing.T) { | ||||
| 	m := NewRegistry() | ||||
|  | ||||
| 	for _, v := range testData { | ||||
| 		for _, service := range v { | ||||
| 			if err := m.Register(service, registry.RegisterTTL(time.Millisecond)); err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	time.Sleep(ttlPruneTime * 2) | ||||
|  | ||||
| 	for name := range testData { | ||||
| 		svcs, err := m.GetService(name) | ||||
| 		if err != nil { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
|  | ||||
| 		for _, svc := range svcs { | ||||
| 			if len(svc.Nodes) > 0 { | ||||
| 				t.Fatalf("Service %q still has nodes registered", name) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMemoryRegistryTTLConcurrent(t *testing.T) { | ||||
| 	concurrency := 1000 | ||||
| 	waitTime := ttlPruneTime * 2 | ||||
| 	m := NewRegistry() | ||||
|  | ||||
| 	for _, v := range testData { | ||||
| 		for _, service := range v { | ||||
| 			if err := m.Register(service, registry.RegisterTTL(waitTime)); err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	t.Logf("test will wait %v, then check TTL timeouts", waitTime) | ||||
|  | ||||
| 	errChan := make(chan error, concurrency) | ||||
| 	syncChan := make(chan struct{}) | ||||
|  | ||||
| 	for i := 0; i < concurrency; i++ { | ||||
| 		go func() { | ||||
| 			<-syncChan | ||||
| 			for name := range testData { | ||||
| 				svcs, err := m.GetService(name) | ||||
| 				if err != nil { | ||||
| 					errChan <- err | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				for _, svc := range svcs { | ||||
| 					if len(svc.Nodes) > 0 { | ||||
| 						errChan <- fmt.Errorf("Service %q still has nodes registered", name) | ||||
| 						return | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			errChan <- nil | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	time.Sleep(waitTime) | ||||
| 	close(syncChan) | ||||
|  | ||||
| 	for i := 0; i < concurrency; i++ { | ||||
| 		if err := <-errChan; err != nil { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -8,12 +8,25 @@ import ( | ||||
|  | ||||
| type servicesKey struct{} | ||||
|  | ||||
| func getServices(ctx context.Context) map[string][]*registry.Service { | ||||
| 	s, ok := ctx.Value(servicesKey{}).(map[string][]*registry.Service) | ||||
| func getServiceRecords(ctx context.Context) map[string]map[string]*record { | ||||
| 	memServices, ok := ctx.Value(servicesKey{}).(map[string][]*registry.Service) | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return s | ||||
|  | ||||
| 	services := make(map[string]map[string]*record) | ||||
|  | ||||
| 	for name, svc := range memServices { | ||||
| 		if _, ok := services[name]; !ok { | ||||
| 			services[name] = make(map[string]*record) | ||||
| 		} | ||||
| 		// go through every version of the service | ||||
| 		for _, s := range svc { | ||||
| 			services[s.Name][s.Version] = serviceToRecord(s, 0) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return services | ||||
| } | ||||
|  | ||||
| // Services is an option that preloads service data | ||||
|   | ||||
							
								
								
									
										87
									
								
								registry/memory/util.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								registry/memory/util.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| package memory | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| ) | ||||
|  | ||||
| func serviceToRecord(s *registry.Service, ttl time.Duration) *record { | ||||
| 	metadata := make(map[string]string) | ||||
| 	for k, v := range s.Metadata { | ||||
| 		metadata[k] = v | ||||
| 	} | ||||
|  | ||||
| 	nodes := make(map[string]*node) | ||||
| 	for _, n := range s.Nodes { | ||||
| 		nodes[n.Id] = &node{ | ||||
| 			Node:     n, | ||||
| 			TTL:      ttl, | ||||
| 			LastSeen: time.Now(), | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	endpoints := make([]*registry.Endpoint, len(s.Endpoints)) | ||||
| 	for i, e := range s.Endpoints { | ||||
| 		endpoints[i] = e | ||||
| 	} | ||||
|  | ||||
| 	return &record{ | ||||
| 		Name:      s.Name, | ||||
| 		Version:   s.Version, | ||||
| 		Metadata:  metadata, | ||||
| 		Nodes:     nodes, | ||||
| 		Endpoints: endpoints, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func recordToService(r *record) *registry.Service { | ||||
| 	metadata := make(map[string]string) | ||||
| 	for k, v := range r.Metadata { | ||||
| 		metadata[k] = v | ||||
| 	} | ||||
|  | ||||
| 	endpoints := make([]*registry.Endpoint, len(r.Endpoints)) | ||||
| 	for i, e := range r.Endpoints { | ||||
| 		request := new(registry.Value) | ||||
| 		request = e.Request | ||||
| 		response := new(registry.Value) | ||||
| 		response = e.Response | ||||
|  | ||||
| 		metadata := make(map[string]string) | ||||
| 		for k, v := range e.Metadata { | ||||
| 			metadata[k] = v | ||||
| 		} | ||||
|  | ||||
| 		endpoints[i] = ®istry.Endpoint{ | ||||
| 			Name:     e.Name, | ||||
| 			Request:  request, | ||||
| 			Response: response, | ||||
| 			Metadata: metadata, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	nodes := make([]*registry.Node, len(r.Nodes)) | ||||
| 	i := 0 | ||||
| 	for _, n := range r.Nodes { | ||||
| 		metadata := make(map[string]string) | ||||
| 		for k, v := range n.Metadata { | ||||
| 			metadata[k] = v | ||||
| 		} | ||||
|  | ||||
| 		nodes[i] = ®istry.Node{ | ||||
| 			Id:       n.Id, | ||||
| 			Address:  n.Address, | ||||
| 			Metadata: metadata, | ||||
| 		} | ||||
| 		i++ | ||||
| 	} | ||||
|  | ||||
| 	return ®istry.Service{ | ||||
| 		Name:      r.Name, | ||||
| 		Version:   r.Version, | ||||
| 		Metadata:  metadata, | ||||
| 		Endpoints: endpoints, | ||||
| 		Nodes:     nodes, | ||||
| 	} | ||||
| } | ||||
| @@ -1,13 +1,11 @@ | ||||
| // Code generated by protoc-gen-go. DO NOT EDIT. | ||||
| // source: micro/go-micro/registry/service/proto/registry.proto | ||||
| // source: go-micro/registry/service/proto/registry.proto | ||||
|  | ||||
| package go_micro_registry | ||||
|  | ||||
| import ( | ||||
| 	context "context" | ||||
| 	fmt "fmt" | ||||
| 	proto "github.com/golang/protobuf/proto" | ||||
| 	grpc "google.golang.org/grpc" | ||||
| 	math "math" | ||||
| ) | ||||
|  | ||||
| @@ -48,7 +46,7 @@ func (x EventType) String() string { | ||||
| } | ||||
|  | ||||
| func (EventType) EnumDescriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{0} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{0} | ||||
| } | ||||
|  | ||||
| // Service represents a go-micro service | ||||
| @@ -68,7 +66,7 @@ func (m *Service) Reset()         { *m = Service{} } | ||||
| func (m *Service) String() string { return proto.CompactTextString(m) } | ||||
| func (*Service) ProtoMessage()    {} | ||||
| func (*Service) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{0} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{0} | ||||
| } | ||||
|  | ||||
| func (m *Service) XXX_Unmarshal(b []byte) error { | ||||
| @@ -146,7 +144,7 @@ func (m *Node) Reset()         { *m = Node{} } | ||||
| func (m *Node) String() string { return proto.CompactTextString(m) } | ||||
| func (*Node) ProtoMessage()    {} | ||||
| func (*Node) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{1} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{1} | ||||
| } | ||||
|  | ||||
| func (m *Node) XXX_Unmarshal(b []byte) error { | ||||
| @@ -210,7 +208,7 @@ func (m *Endpoint) Reset()         { *m = Endpoint{} } | ||||
| func (m *Endpoint) String() string { return proto.CompactTextString(m) } | ||||
| func (*Endpoint) ProtoMessage()    {} | ||||
| func (*Endpoint) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{2} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{2} | ||||
| } | ||||
|  | ||||
| func (m *Endpoint) XXX_Unmarshal(b []byte) error { | ||||
| @@ -273,7 +271,7 @@ func (m *Value) Reset()         { *m = Value{} } | ||||
| func (m *Value) String() string { return proto.CompactTextString(m) } | ||||
| func (*Value) ProtoMessage()    {} | ||||
| func (*Value) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{3} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{3} | ||||
| } | ||||
|  | ||||
| func (m *Value) XXX_Unmarshal(b []byte) error { | ||||
| @@ -327,7 +325,7 @@ func (m *Options) Reset()         { *m = Options{} } | ||||
| func (m *Options) String() string { return proto.CompactTextString(m) } | ||||
| func (*Options) ProtoMessage()    {} | ||||
| func (*Options) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{4} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{4} | ||||
| } | ||||
|  | ||||
| func (m *Options) XXX_Unmarshal(b []byte) error { | ||||
| @@ -369,7 +367,7 @@ func (m *Result) Reset()         { *m = Result{} } | ||||
| func (m *Result) String() string { return proto.CompactTextString(m) } | ||||
| func (*Result) ProtoMessage()    {} | ||||
| func (*Result) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{5} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{5} | ||||
| } | ||||
|  | ||||
| func (m *Result) XXX_Unmarshal(b []byte) error { | ||||
| @@ -421,7 +419,7 @@ func (m *EmptyResponse) Reset()         { *m = EmptyResponse{} } | ||||
| func (m *EmptyResponse) String() string { return proto.CompactTextString(m) } | ||||
| func (*EmptyResponse) ProtoMessage()    {} | ||||
| func (*EmptyResponse) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{6} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{6} | ||||
| } | ||||
|  | ||||
| func (m *EmptyResponse) XXX_Unmarshal(b []byte) error { | ||||
| @@ -453,7 +451,7 @@ func (m *GetRequest) Reset()         { *m = GetRequest{} } | ||||
| func (m *GetRequest) String() string { return proto.CompactTextString(m) } | ||||
| func (*GetRequest) ProtoMessage()    {} | ||||
| func (*GetRequest) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{7} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{7} | ||||
| } | ||||
|  | ||||
| func (m *GetRequest) XXX_Unmarshal(b []byte) error { | ||||
| @@ -492,7 +490,7 @@ func (m *GetResponse) Reset()         { *m = GetResponse{} } | ||||
| func (m *GetResponse) String() string { return proto.CompactTextString(m) } | ||||
| func (*GetResponse) ProtoMessage()    {} | ||||
| func (*GetResponse) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{8} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{8} | ||||
| } | ||||
|  | ||||
| func (m *GetResponse) XXX_Unmarshal(b []byte) error { | ||||
| @@ -530,7 +528,7 @@ func (m *ListRequest) Reset()         { *m = ListRequest{} } | ||||
| func (m *ListRequest) String() string { return proto.CompactTextString(m) } | ||||
| func (*ListRequest) ProtoMessage()    {} | ||||
| func (*ListRequest) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{9} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{9} | ||||
| } | ||||
|  | ||||
| func (m *ListRequest) XXX_Unmarshal(b []byte) error { | ||||
| @@ -562,7 +560,7 @@ func (m *ListResponse) Reset()         { *m = ListResponse{} } | ||||
| func (m *ListResponse) String() string { return proto.CompactTextString(m) } | ||||
| func (*ListResponse) ProtoMessage()    {} | ||||
| func (*ListResponse) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{10} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{10} | ||||
| } | ||||
|  | ||||
| func (m *ListResponse) XXX_Unmarshal(b []byte) error { | ||||
| @@ -602,7 +600,7 @@ func (m *WatchRequest) Reset()         { *m = WatchRequest{} } | ||||
| func (m *WatchRequest) String() string { return proto.CompactTextString(m) } | ||||
| func (*WatchRequest) ProtoMessage()    {} | ||||
| func (*WatchRequest) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{11} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{11} | ||||
| } | ||||
|  | ||||
| func (m *WatchRequest) XXX_Unmarshal(b []byte) error { | ||||
| @@ -649,7 +647,7 @@ func (m *Event) Reset()         { *m = Event{} } | ||||
| func (m *Event) String() string { return proto.CompactTextString(m) } | ||||
| func (*Event) ProtoMessage()    {} | ||||
| func (*Event) Descriptor() ([]byte, []int) { | ||||
| 	return fileDescriptor_2f73432195c6499a, []int{12} | ||||
| 	return fileDescriptor_0e39fd3e4b9b6e63, []int{12} | ||||
| } | ||||
|  | ||||
| func (m *Event) XXX_Unmarshal(b []byte) error { | ||||
| @@ -719,284 +717,52 @@ func init() { | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("micro/go-micro/registry/service/proto/registry.proto", fileDescriptor_2f73432195c6499a) | ||||
| 	proto.RegisterFile("go-micro/registry/service/proto/registry.proto", fileDescriptor_0e39fd3e4b9b6e63) | ||||
| } | ||||
|  | ||||
| var fileDescriptor_2f73432195c6499a = []byte{ | ||||
| 	// 681 bytes of a gzipped FileDescriptorProto | ||||
| var fileDescriptor_0e39fd3e4b9b6e63 = []byte{ | ||||
| 	// 679 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xdd, 0x6e, 0xd3, 0x4c, | ||||
| 	0x10, 0x8d, 0xed, 0xfc, 0x4e, 0xda, 0x7e, 0xfd, 0x46, 0x08, 0x8c, 0x5b, 0x20, 0xb2, 0x04, 0x0a, | ||||
| 	0x48, 0x4d, 0xaa, 0x50, 0x21, 0x7e, 0xae, 0x10, 0x0d, 0x95, 0x50, 0x0b, 0x62, 0xf9, 0xbb, 0x36, | ||||
| 	0x48, 0x75, 0xaa, 0x50, 0x21, 0x7e, 0xae, 0x10, 0x0d, 0x95, 0x50, 0x0b, 0x62, 0xf9, 0xbb, 0x36, | ||||
| 	0xf1, 0xa8, 0x58, 0x24, 0xb6, 0xd9, 0xdd, 0x46, 0xca, 0x3b, 0x20, 0xf1, 0x04, 0xbc, 0x0d, 0x4f, | ||||
| 	0xc1, 0xd3, 0xa0, 0x5d, 0xaf, 0x93, 0x54, 0xdd, 0x04, 0xa4, 0xc2, 0xdd, 0xcc, 0xee, 0x39, 0xb3, | ||||
| 	0xb3, 0x67, 0xce, 0xda, 0x70, 0x30, 0x49, 0x46, 0x3c, 0xeb, 0x9f, 0x66, 0x7b, 0x45, 0xc0, 0xe9, | ||||
| 	0x34, 0x11, 0x92, 0xcf, 0xfa, 0x82, 0xf8, 0x34, 0x19, 0x51, 0x3f, 0xe7, 0x99, 0x5c, 0x2c, 0xf7, | ||||
| 	0x74, 0x8a, 0xff, 0x9f, 0x66, 0x3d, 0x8d, 0xef, 0x95, 0x1b, 0xe1, 0x4f, 0x17, 0x1a, 0x6f, 0x0a, | ||||
| 	0x0e, 0x22, 0x54, 0xd3, 0x68, 0x42, 0xbe, 0xd3, 0x71, 0xba, 0x2d, 0xa6, 0x63, 0xf4, 0xa1, 0x31, | ||||
| 	0x25, 0x2e, 0x92, 0x2c, 0xf5, 0x5d, 0xbd, 0x5c, 0xa6, 0x78, 0x08, 0xcd, 0x09, 0xc9, 0x28, 0x8e, | ||||
| 	0x64, 0xe4, 0x7b, 0x1d, 0xaf, 0xdb, 0x1e, 0x74, 0x7b, 0x17, 0xea, 0xf7, 0x4c, 0xed, 0xde, 0x89, | ||||
| 	0x81, 0x0e, 0x53, 0xc9, 0x67, 0x6c, 0xce, 0xc4, 0x47, 0xd0, 0xa2, 0x34, 0xce, 0xb3, 0x24, 0x95, | ||||
| 	0xc2, 0xaf, 0xea, 0x32, 0x3b, 0x96, 0x32, 0x43, 0x83, 0x61, 0x0b, 0x34, 0xee, 0x41, 0x2d, 0xcd, | ||||
| 	0x62, 0x12, 0x7e, 0x4d, 0xd3, 0xae, 0x59, 0x68, 0x2f, 0xb3, 0x98, 0x58, 0x81, 0xc2, 0x03, 0x68, | ||||
| 	0x64, 0xb9, 0x4c, 0xb2, 0x54, 0xf8, 0xf5, 0x8e, 0xd3, 0x6d, 0x0f, 0x02, 0x0b, 0xe1, 0x55, 0x81, | ||||
| 	0x60, 0x25, 0x34, 0x78, 0x02, 0x9b, 0xe7, 0x5a, 0xc7, 0x6d, 0xf0, 0x3e, 0xd3, 0xcc, 0x68, 0xa4, | ||||
| 	0x42, 0xbc, 0x02, 0xb5, 0x69, 0x34, 0x3e, 0x23, 0x23, 0x50, 0x91, 0x3c, 0x76, 0x1f, 0x3a, 0xe1, | ||||
| 	0x0f, 0x07, 0xaa, 0xaa, 0x05, 0xdc, 0x02, 0x37, 0x89, 0x0d, 0xc7, 0x4d, 0x62, 0xa5, 0x6a, 0x14, | ||||
| 	0xc7, 0x9c, 0x84, 0x28, 0x55, 0x35, 0xa9, 0x9a, 0x41, 0x9e, 0x71, 0xe9, 0x7b, 0x1d, 0xa7, 0xeb, | ||||
| 	0x31, 0x1d, 0xe3, 0xd3, 0x25, 0xa5, 0x0b, 0x89, 0x6e, 0xaf, 0xb8, 0xeb, 0x2a, 0x99, 0x2f, 0x77, | ||||
| 	0x8d, 0xaf, 0x2e, 0x34, 0xcb, 0x01, 0x58, 0x4d, 0x32, 0x80, 0x06, 0xa7, 0x2f, 0x67, 0x24, 0xa4, | ||||
| 	0x26, 0xb7, 0x07, 0xbe, 0xa5, 0xbf, 0xf7, 0xaa, 0x1e, 0x2b, 0x81, 0x78, 0x00, 0x4d, 0x4e, 0x22, | ||||
| 	0xcf, 0x52, 0x41, 0xfa, 0xb2, 0xeb, 0x48, 0x73, 0x24, 0x0e, 0x2f, 0x48, 0x71, 0x77, 0x8d, 0x5b, | ||||
| 	0xfe, 0x8d, 0x1c, 0x11, 0xd4, 0x74, 0x5b, 0x56, 0x29, 0x10, 0xaa, 0x72, 0x96, 0x97, 0x2c, 0x1d, | ||||
| 	0xe3, 0x3e, 0xd4, 0x35, 0x5b, 0x98, 0x77, 0xb2, 0xfa, 0xa2, 0x06, 0x17, 0xee, 0x40, 0xc3, 0x38, | ||||
| 	0x51, 0x75, 0x26, 0xe5, 0x58, 0x9f, 0xe1, 0x31, 0x15, 0x86, 0x12, 0xea, 0x8c, 0xc4, 0xd9, 0x58, | ||||
| 	0xe2, 0x55, 0xa8, 0x47, 0x23, 0x05, 0x33, 0x2d, 0x98, 0x4c, 0x59, 0xdd, 0x7c, 0x07, 0xcc, 0x3c, | ||||
| 	0x82, 0xd5, 0x2f, 0x93, 0x95, 0x50, 0xdc, 0x85, 0x96, 0x4c, 0x26, 0x24, 0x64, 0x34, 0xc9, 0x8d, | ||||
| 	0xff, 0x16, 0x0b, 0xe1, 0x7f, 0xb0, 0x39, 0x9c, 0xe4, 0x72, 0xc6, 0xcc, 0x28, 0xc2, 0x3b, 0x00, | ||||
| 	0x47, 0x24, 0x99, 0x19, 0xa7, 0xbf, 0x38, 0xb2, 0xe8, 0xa5, 0x4c, 0xc3, 0x21, 0xb4, 0x35, 0xce, | ||||
| 	0x4c, 0xf0, 0x01, 0x34, 0xcd, 0x8e, 0xf0, 0x1d, 0x2d, 0xc7, 0xba, 0xe6, 0xe6, 0xd8, 0x70, 0x13, | ||||
| 	0xda, 0xc7, 0x89, 0x28, 0xcf, 0x0b, 0x9f, 0xc3, 0x46, 0x91, 0x5e, 0xb2, 0x6c, 0x17, 0x36, 0x3e, | ||||
| 	0x44, 0x72, 0xf4, 0xe9, 0xf7, 0xf7, 0xf8, 0xee, 0x40, 0x6d, 0x38, 0xa5, 0x54, 0x5e, 0x78, 0xcd, | ||||
| 	0xfb, 0x4b, 0x33, 0xdf, 0x1a, 0xec, 0xda, 0x0c, 0xa9, 0x78, 0x6f, 0x67, 0x39, 0x19, 0x47, 0xac, | ||||
| 	0x95, 0x7a, 0x79, 0x7c, 0xd5, 0x3f, 0x1e, 0xdf, 0xbd, 0x3e, 0xb4, 0xe6, 0xc7, 0x20, 0x40, 0xfd, | ||||
| 	0x19, 0xa7, 0x48, 0xd2, 0x76, 0x45, 0xc5, 0x87, 0x34, 0x26, 0x49, 0xdb, 0x8e, 0x8a, 0xdf, 0xe5, | ||||
| 	0xb1, 0x5a, 0x77, 0x07, 0xdf, 0x3c, 0x68, 0x32, 0x53, 0x0e, 0x4f, 0xf4, 0x34, 0xcb, 0x3f, 0xc1, | ||||
| 	0x0d, 0xcb, 0x81, 0x8b, 0x61, 0x07, 0x37, 0x57, 0x6d, 0x1b, 0x6b, 0x54, 0xf0, 0x45, 0x59, 0x9a, | ||||
| 	0x38, 0xae, 0xe9, 0x3e, 0xe8, 0xd8, 0xc4, 0x3a, 0x67, 0xb3, 0x0a, 0x1e, 0x03, 0x1c, 0x12, 0xff, | ||||
| 	0x5b, 0xd5, 0x5e, 0x17, 0xc6, 0x31, 0x14, 0x81, 0xb6, 0xbb, 0x2c, 0x19, 0x2d, 0xb8, 0xb5, 0x72, | ||||
| 	0x7f, 0x5e, 0xf2, 0x08, 0x6a, 0xda, 0x43, 0x68, 0xc3, 0x2e, 0xbb, 0x2b, 0xb8, 0x6e, 0x01, 0x14, | ||||
| 	0x6f, 0x39, 0xac, 0xec, 0x3b, 0x1f, 0xeb, 0xfa, 0x37, 0x7d, 0xff, 0x57, 0x00, 0x00, 0x00, 0xff, | ||||
| 	0xff, 0x69, 0x33, 0x08, 0xdb, 0xde, 0x07, 0x00, 0x00, | ||||
| } | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ context.Context | ||||
| var _ grpc.ClientConn | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the grpc package it is being compiled against. | ||||
| const _ = grpc.SupportPackageIsVersion4 | ||||
|  | ||||
| // RegistryClient is the client API for Registry service. | ||||
| // | ||||
| // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. | ||||
| type RegistryClient interface { | ||||
| 	GetService(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) | ||||
| 	Register(ctx context.Context, in *Service, opts ...grpc.CallOption) (*EmptyResponse, error) | ||||
| 	Deregister(ctx context.Context, in *Service, opts ...grpc.CallOption) (*EmptyResponse, error) | ||||
| 	ListServices(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) | ||||
| 	Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (Registry_WatchClient, error) | ||||
| } | ||||
|  | ||||
| type registryClient struct { | ||||
| 	cc *grpc.ClientConn | ||||
| } | ||||
|  | ||||
| func NewRegistryClient(cc *grpc.ClientConn) RegistryClient { | ||||
| 	return ®istryClient{cc} | ||||
| } | ||||
|  | ||||
| func (c *registryClient) GetService(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) { | ||||
| 	out := new(GetResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/go.micro.registry.Registry/GetService", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *registryClient) Register(ctx context.Context, in *Service, opts ...grpc.CallOption) (*EmptyResponse, error) { | ||||
| 	out := new(EmptyResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/go.micro.registry.Registry/Register", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *registryClient) Deregister(ctx context.Context, in *Service, opts ...grpc.CallOption) (*EmptyResponse, error) { | ||||
| 	out := new(EmptyResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/go.micro.registry.Registry/Deregister", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *registryClient) ListServices(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) { | ||||
| 	out := new(ListResponse) | ||||
| 	err := c.cc.Invoke(ctx, "/go.micro.registry.Registry/ListServices", in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (c *registryClient) Watch(ctx context.Context, in *WatchRequest, opts ...grpc.CallOption) (Registry_WatchClient, error) { | ||||
| 	stream, err := c.cc.NewStream(ctx, &_Registry_serviceDesc.Streams[0], "/go.micro.registry.Registry/Watch", opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	x := ®istryWatchClient{stream} | ||||
| 	if err := x.ClientStream.SendMsg(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if err := x.ClientStream.CloseSend(); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return x, nil | ||||
| } | ||||
|  | ||||
| type Registry_WatchClient interface { | ||||
| 	Recv() (*Result, error) | ||||
| 	grpc.ClientStream | ||||
| } | ||||
|  | ||||
| type registryWatchClient struct { | ||||
| 	grpc.ClientStream | ||||
| } | ||||
|  | ||||
| func (x *registryWatchClient) Recv() (*Result, error) { | ||||
| 	m := new(Result) | ||||
| 	if err := x.ClientStream.RecvMsg(m); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return m, nil | ||||
| } | ||||
|  | ||||
| // RegistryServer is the server API for Registry service. | ||||
| type RegistryServer interface { | ||||
| 	GetService(context.Context, *GetRequest) (*GetResponse, error) | ||||
| 	Register(context.Context, *Service) (*EmptyResponse, error) | ||||
| 	Deregister(context.Context, *Service) (*EmptyResponse, error) | ||||
| 	ListServices(context.Context, *ListRequest) (*ListResponse, error) | ||||
| 	Watch(*WatchRequest, Registry_WatchServer) error | ||||
| } | ||||
|  | ||||
| func RegisterRegistryServer(s *grpc.Server, srv RegistryServer) { | ||||
| 	s.RegisterService(&_Registry_serviceDesc, srv) | ||||
| } | ||||
|  | ||||
| func _Registry_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(RegistryServer).GetService(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/go.micro.registry.Registry/GetService", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(RegistryServer).GetService(ctx, req.(*GetRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _Registry_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(Service) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(RegistryServer).Register(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/go.micro.registry.Registry/Register", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(RegistryServer).Register(ctx, req.(*Service)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _Registry_Deregister_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(Service) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(RegistryServer).Deregister(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/go.micro.registry.Registry/Deregister", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(RegistryServer).Deregister(ctx, req.(*Service)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _Registry_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(ListRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(RegistryServer).ListServices(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: "/go.micro.registry.Registry/ListServices", | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(RegistryServer).ListServices(ctx, req.(*ListRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
|  | ||||
| func _Registry_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { | ||||
| 	m := new(WatchRequest) | ||||
| 	if err := stream.RecvMsg(m); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return srv.(RegistryServer).Watch(m, ®istryWatchServer{stream}) | ||||
| } | ||||
|  | ||||
| type Registry_WatchServer interface { | ||||
| 	Send(*Result) error | ||||
| 	grpc.ServerStream | ||||
| } | ||||
|  | ||||
| type registryWatchServer struct { | ||||
| 	grpc.ServerStream | ||||
| } | ||||
|  | ||||
| func (x *registryWatchServer) Send(m *Result) error { | ||||
| 	return x.ServerStream.SendMsg(m) | ||||
| } | ||||
|  | ||||
| var _Registry_serviceDesc = grpc.ServiceDesc{ | ||||
| 	ServiceName: "go.micro.registry.Registry", | ||||
| 	HandlerType: (*RegistryServer)(nil), | ||||
| 	Methods: []grpc.MethodDesc{ | ||||
| 		{ | ||||
| 			MethodName: "GetService", | ||||
| 			Handler:    _Registry_GetService_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "Register", | ||||
| 			Handler:    _Registry_Register_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "Deregister", | ||||
| 			Handler:    _Registry_Deregister_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "ListServices", | ||||
| 			Handler:    _Registry_ListServices_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams: []grpc.StreamDesc{ | ||||
| 		{ | ||||
| 			StreamName:    "Watch", | ||||
| 			Handler:       _Registry_Watch_Handler, | ||||
| 			ServerStreams: true, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Metadata: "micro/go-micro/registry/service/proto/registry.proto", | ||||
| 	0xc1, 0xd3, 0xa0, 0x5d, 0xaf, 0x93, 0x54, 0xb5, 0x03, 0x52, 0xe1, 0x6e, 0x66, 0xf7, 0x9c, 0xd9, | ||||
| 	0xd9, 0x33, 0x67, 0x6d, 0x08, 0x4e, 0xd3, 0xbd, 0x69, 0x3c, 0xe6, 0xe9, 0x80, 0xd3, 0x69, 0x2c, | ||||
| 	0x24, 0x9f, 0x0f, 0x04, 0xf1, 0x59, 0x3c, 0xa6, 0x41, 0xc6, 0x53, 0xb9, 0x5c, 0x0e, 0x74, 0x8a, | ||||
| 	0xff, 0x9f, 0xa6, 0x81, 0xc6, 0x07, 0xc5, 0x86, 0xff, 0xd3, 0x86, 0xd6, 0x9b, 0x9c, 0x83, 0x08, | ||||
| 	0xf5, 0x24, 0x9c, 0x92, 0x6b, 0xf5, 0xac, 0x7e, 0x87, 0xe9, 0x18, 0x5d, 0x68, 0xcd, 0x88, 0x8b, | ||||
| 	0x38, 0x4d, 0x5c, 0x5b, 0x2f, 0x17, 0x29, 0x1e, 0x42, 0x7b, 0x4a, 0x32, 0x8c, 0x42, 0x19, 0xba, | ||||
| 	0x4e, 0xcf, 0xe9, 0x77, 0x87, 0xfd, 0xe0, 0x42, 0xfd, 0xc0, 0xd4, 0x0e, 0x4e, 0x0c, 0x74, 0x94, | ||||
| 	0x48, 0x3e, 0x67, 0x0b, 0x26, 0x3e, 0x82, 0x0e, 0x25, 0x51, 0x96, 0xc6, 0x89, 0x14, 0x6e, 0x5d, | ||||
| 	0x97, 0xd9, 0x29, 0x29, 0x33, 0x32, 0x18, 0xb6, 0x44, 0xe3, 0x1e, 0x34, 0x92, 0x34, 0x22, 0xe1, | ||||
| 	0x36, 0x34, 0xed, 0x5a, 0x09, 0xed, 0x65, 0x1a, 0x11, 0xcb, 0x51, 0x78, 0x00, 0xad, 0x34, 0x93, | ||||
| 	0x71, 0x9a, 0x08, 0xb7, 0xd9, 0xb3, 0xfa, 0xdd, 0xa1, 0x57, 0x42, 0x78, 0x95, 0x23, 0x58, 0x01, | ||||
| 	0xf5, 0x9e, 0xc0, 0xe6, 0xb9, 0xd6, 0x71, 0x1b, 0x9c, 0xcf, 0x34, 0x37, 0x1a, 0xa9, 0x10, 0xaf, | ||||
| 	0x40, 0x63, 0x16, 0x4e, 0xce, 0xc8, 0x08, 0x94, 0x27, 0x8f, 0xed, 0x87, 0x96, 0xff, 0xc3, 0x82, | ||||
| 	0xba, 0x6a, 0x01, 0xb7, 0xc0, 0x8e, 0x23, 0xc3, 0xb1, 0xe3, 0x48, 0xa9, 0x1a, 0x46, 0x11, 0x27, | ||||
| 	0x21, 0x0a, 0x55, 0x4d, 0xaa, 0x66, 0x90, 0xa5, 0x5c, 0xba, 0x4e, 0xcf, 0xea, 0x3b, 0x4c, 0xc7, | ||||
| 	0xf8, 0x74, 0x45, 0xe9, 0x5c, 0xa2, 0xdb, 0x15, 0x77, 0xad, 0x92, 0xf9, 0x72, 0xd7, 0xf8, 0x6a, | ||||
| 	0x43, 0xbb, 0x18, 0x40, 0xa9, 0x49, 0x86, 0xd0, 0xe2, 0xf4, 0xe5, 0x8c, 0x84, 0xd4, 0xe4, 0xee, | ||||
| 	0xd0, 0x2d, 0xe9, 0xef, 0xbd, 0xaa, 0xc7, 0x0a, 0x20, 0x1e, 0x40, 0x9b, 0x93, 0xc8, 0xd2, 0x44, | ||||
| 	0x90, 0xbe, 0xec, 0x3a, 0xd2, 0x02, 0x89, 0xa3, 0x0b, 0x52, 0xdc, 0x5d, 0xe3, 0x96, 0x7f, 0x23, | ||||
| 	0x47, 0x08, 0x0d, 0xdd, 0x56, 0xa9, 0x14, 0x08, 0x75, 0x39, 0xcf, 0x0a, 0x96, 0x8e, 0x71, 0x1f, | ||||
| 	0x9a, 0x9a, 0x2d, 0xcc, 0x3b, 0xa9, 0xbe, 0xa8, 0xc1, 0xf9, 0x3b, 0xd0, 0x32, 0x4e, 0x54, 0x9d, | ||||
| 	0x49, 0x39, 0xd1, 0x67, 0x38, 0x4c, 0x85, 0xbe, 0x84, 0x26, 0x23, 0x71, 0x36, 0x91, 0x78, 0x15, | ||||
| 	0x9a, 0xe1, 0x58, 0xc1, 0x4c, 0x0b, 0x26, 0x53, 0x56, 0x37, 0xdf, 0x01, 0x33, 0x0f, 0xaf, 0xfa, | ||||
| 	0x65, 0xb2, 0x02, 0x8a, 0xbb, 0xd0, 0x91, 0xf1, 0x94, 0x84, 0x0c, 0xa7, 0x99, 0xf1, 0xdf, 0x72, | ||||
| 	0xc1, 0xff, 0x0f, 0x36, 0x47, 0xd3, 0x4c, 0xce, 0x99, 0x19, 0x85, 0x7f, 0x07, 0xe0, 0x88, 0x24, | ||||
| 	0x33, 0xe3, 0x74, 0x97, 0x47, 0xe6, 0xbd, 0x14, 0xa9, 0x3f, 0x82, 0xae, 0xc6, 0x99, 0x09, 0x3e, | ||||
| 	0x80, 0xb6, 0xd9, 0x11, 0xae, 0xa5, 0xe5, 0x58, 0xd7, 0xdc, 0x02, 0xeb, 0x6f, 0x42, 0xf7, 0x38, | ||||
| 	0x16, 0xc5, 0x79, 0xfe, 0x73, 0xd8, 0xc8, 0xd3, 0x4b, 0x96, 0xed, 0xc3, 0xc6, 0x87, 0x50, 0x8e, | ||||
| 	0x3f, 0xfd, 0xfe, 0x1e, 0xdf, 0x2d, 0x68, 0x8c, 0x66, 0x94, 0xc8, 0x0b, 0xaf, 0x79, 0x7f, 0x65, | ||||
| 	0xe6, 0x5b, 0xc3, 0xdd, 0x32, 0x43, 0x2a, 0xde, 0xdb, 0x79, 0x46, 0xc6, 0x11, 0x6b, 0xa5, 0x5e, | ||||
| 	0x1d, 0x5f, 0xfd, 0x8f, 0xc7, 0x77, 0x6f, 0x00, 0x9d, 0xc5, 0x31, 0x08, 0xd0, 0x7c, 0xc6, 0x29, | ||||
| 	0x94, 0xb4, 0x5d, 0x53, 0xf1, 0x21, 0x4d, 0x48, 0xd2, 0xb6, 0xa5, 0xe2, 0x77, 0x59, 0xa4, 0xd6, | ||||
| 	0xed, 0xe1, 0x37, 0x07, 0xda, 0xcc, 0x94, 0xc3, 0x13, 0x3d, 0xcd, 0xe2, 0x4f, 0x70, 0xa3, 0xe4, | ||||
| 	0xc0, 0xe5, 0xb0, 0xbd, 0x9b, 0x55, 0xdb, 0xc6, 0x1a, 0x35, 0x7c, 0x51, 0x94, 0x26, 0x8e, 0x6b, | ||||
| 	0xba, 0xf7, 0x7a, 0x65, 0x62, 0x9d, 0xb3, 0x59, 0x0d, 0x8f, 0x01, 0x0e, 0x89, 0xff, 0xad, 0x6a, | ||||
| 	0xaf, 0x73, 0xe3, 0x18, 0x8a, 0xc0, 0xb2, 0xbb, 0xac, 0x18, 0xcd, 0xbb, 0x55, 0xb9, 0xbf, 0x28, | ||||
| 	0x79, 0x04, 0x0d, 0xed, 0x21, 0x2c, 0xc3, 0xae, 0xba, 0xcb, 0xbb, 0x5e, 0x02, 0xc8, 0xdf, 0xb2, | ||||
| 	0x5f, 0xdb, 0xb7, 0x3e, 0x36, 0xf5, 0x6f, 0xfa, 0xfe, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, | ||||
| 	0x3e, 0x92, 0x97, 0xd8, 0x07, 0x00, 0x00, | ||||
| } | ||||
|   | ||||
| @@ -29,8 +29,7 @@ func testService(ctx context.Context, wg *sync.WaitGroup, name string) Service { | ||||
| 	// add self | ||||
| 	wg.Add(1) | ||||
|  | ||||
| 	r := memory.NewRegistry() | ||||
| 	r.(*memory.Registry).Services = testData | ||||
| 	r := memory.NewRegistry(memory.Services(testData)) | ||||
|  | ||||
| 	// create service | ||||
| 	return NewService( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user