Class: Gruf::Client

Inherits:
SimpleDelegator
  • Object
show all
Includes:
Loggable
Defined in:
lib/gruf/client.rb,
lib/gruf/client/error.rb,
lib/gruf/client/error_factory.rb

Overview

Abstracts out the calling interface for interacting with gRPC clients. Streamlines calling and provides instrumented response objects that also can contain deserialized error messages via serialized objects transported via the service’s trailing metadata.

begin
  client = ::Gruf::Client.new(service: ::Demo::ThingService)
  response = client.call(:GetMyThing, id: 123)
  puts response.message.inspect
rescue Gruf::Client::Error => e
  puts e.error.inspect
end

Utilizes SimpleDelegator to wrap the given service that the client is connecting to, which allows a clean interface to the underlying RPC descriptors and methods.

Direct Known Subclasses

SynchronizedClient

Defined Under Namespace

Modules: Errors Classes: Error, ErrorFactory

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Loggable

#logger

Constructor Details

#initialize(service:, options: {}, client_options: {}) ⇒ Client

Initialize the client and setup the stub

Options Hash (options:):

  • :password (String)

    The password for basic authentication for the service.

  • :hostname (String)

    The hostname of the service. Defaults to linkerd.



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/gruf/client.rb', line 57

def initialize(service:, options: {}, client_options: {})
  @base_klass = service
  @service_klass = "#{base_klass}::Service".constantize
  @opts = options || {}
  @opts[:password] = @opts.fetch(:password, '').to_s
  @opts[:hostname] = @opts.fetch(:hostname, Gruf.default_client_host)
  @opts[:channel_credentials] = @opts.fetch(:channel_credentials, Gruf.default_channel_credentials)
  @error_factory = Gruf::Client::ErrorFactory.new
  client_options[:timeout] = client_options[:timeout].to_i if client_options.key?(:timeout)
  client = "#{service}::Stub".constantize.new(@opts[:hostname], build_ssl_credentials, client_options)
  super(client)
end

Instance Attribute Details

#base_klassClass (readonly)



42
43
44
# File 'lib/gruf/client.rb', line 42

def base_klass
  @base_klass
end

#optsHash (readonly)



46
47
48
# File 'lib/gruf/client.rb', line 46

def opts
  @opts
end

#service_klassClass (readonly)



44
45
46
# File 'lib/gruf/client.rb', line 44

def service_klass
  @service_klass
end

Instance Method Details

#call(request_method, params = {}, metadata = {}, opts = {}, &block) ⇒ Gruf::Response

Call the client’s method with given params

required for the given above call error type that was returned

Raises:

  • (Gruf::Client::Error|GRPC::BadStatus)

    If an error occurs, an exception will be raised according to the



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/gruf/client.rb', line 82

def call(request_method, params = {},  = {}, opts = {}, &block)
  request_method = request_method.to_sym
  req = streaming_request?(request_method) ? params : request_object(request_method, params)
  md = ()
  call_sig = call_signature(request_method)

  unless call_sig
    raise NotImplementedError, "The method #{request_method} has not been implemented in this service."
  end

  resp, operation = execute(call_sig, req, md, opts, &block)

  raise @error_factory.from_exception(resp.result) unless resp.success?

  Gruf::Response.new(operation: operation, message: resp.result, execution_time: resp.time)
end

#timeoutInteger|NilClass

Returns the currently set timeout on the client stub



104
105
106
# File 'lib/gruf/client.rb', line 104

def timeout
  __getobj__.instance_variable_get(:@timeout)
end