Class: RubySkynet::Doozer::ServiceRegistry
- Inherits:
-
Object
- Object
- RubySkynet::Doozer::ServiceRegistry
- Includes:
- SemanticLogger::Loggable
- Defined in:
- lib/ruby_skynet/doozer/service_registry.rb
Defined Under Namespace
Classes: ServerInfo
Instance Method Summary collapse
-
#deregister_service(name, version, region, hostname, port) ⇒ Object
Deregister the supplied service from the Registry.
-
#initialize ⇒ ServiceRegistry
constructor
Create a service registry See: RubyDoozer::Registry for the parameters.
-
#on_server_removed(server, &block) ⇒ Object
Invokes registered callbacks when a specific server is shutdown or terminates Not when a server de-registers itself The callback will only be called once and will need to be re-registered after being called if future callbacks are required for that server.
-
#register_service(name, version, region, hostname, port) ⇒ Object
Register the supplied service at this Skynet Server host and Port.
-
#servers_for(name, version = '*', region = RubySkynet.region) ⇒ Object
Returns [Array<String>] a list of servers implementing the requested service.
-
#to_h ⇒ Object
Returns the Service Registry as a Hash.
Constructor Details
#initialize ⇒ ServiceRegistry
Create a service registry See: RubyDoozer::Registry for the parameters
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 18 def initialize # Registry has the following format # Key: [String] 'name/version/region' # Value: [Array<String>] 'host:port', 'host:port' @cache = ThreadSafe::Hash.new # Supply block to load the current keys from the Registry @registry = Doozer::Registry.new(:root => '/services') do |key, value| service_info_changed(key, value) end # Register Callbacks @registry.on_update {|path, value| service_info_changed(path, value) } @registry.on_delete {|path| service_info_changed(path) } # Zookeeper Registry also supports on_create @registry.on_create {|path, value| service_info_changed(path, value) } if @registry.respond_to?(:on_create) end |
Instance Method Details
#deregister_service(name, version, region, hostname, port) ⇒ Object
Deregister the supplied service from the Registry
60 61 62 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 60 def deregister_service(name, version, region, hostname, port) @registry.delete("#{name}/#{version}/#{region}/#{hostname}/#{port}") end |
#on_server_removed(server, &block) ⇒ Object
Invokes registered callbacks when a specific server is shutdown or terminates Not when a server de-registers itself The callback will only be called once and will need to be re-registered after being called if future callbacks are required for that server
87 88 89 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 87 def on_server_removed(server, &block) ((@on_server_removed_callbacks ||= ThreadSafe::Hash.new)[server] ||= ThreadSafe::Array.new) << block end |
#register_service(name, version, region, hostname, port) ⇒ Object
Register the supplied service at this Skynet Server host and Port
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 42 def register_service(name, version, region, hostname, port) @registry["#{name}/#{version}/#{region}/#{hostname}/#{port}"] = { "Config" => { "UUID" => "#{hostname}:#{port}-#{$$}-#{name}-#{version}", "Name" => name, "Version" => version.to_s, "Region" => region, "ServiceAddr" => { "IPAddress" => hostname, "Port" => port, "MaxPort" => port + 999 }, }, "Registered" => true } end |
#servers_for(name, version = '*', region = RubySkynet.region) ⇒ Object
Returns [Array<String>] a list of servers implementing the requested service
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 65 def servers_for(name, version='*', region=RubySkynet.region) if version == '*' # Find the highest version for the named service in this region version = -1 @cache.keys.each do |key| if match = key.match(/#{name}\/(\d+)\/#{region}/) ver = match[1].to_i version = ver if ver > version end end end servers = if server_infos = @cache["#{name}/#{version}/#{region}"] server_infos.first.servers end raise ServiceUnavailable.new("No servers available for service: #{name} with version: #{version} in region: #{region}") unless servers servers end |
#to_h ⇒ Object
Returns the Service Registry as a Hash
37 38 39 |
# File 'lib/ruby_skynet/doozer/service_registry.rb', line 37 def to_h @cache.dup end |