gRPC Elixir
The Elixir implementation of gRPC.
WARNING: APIs are unstable now. Be careful to use it in production!
Installation
The package can be installed as:
- Add
grpc
to your list of dependencies inmix.exs
:
```elixir
def deps do
[{:grpc, github: "tony612/grpc-elixir"}]
end
```
- Ensure
grpc
is started before your application:
```elixir
def application do
[applications: [:grpc]]
end
```
Usage
Generate Elixir code from proto file
$ mix do deps.get, compile
$ mix grpc.gen priv/protos/YOUR_SERVICE.proto --out lib/
$ mix grpc.gen.server priv/protos/YOUR_SERVICE.proto --out lib/
Implement functions in the generated server template – remember to return the expected message types –, then run the server and client like this:
iex> GRPC.Server.start(Helloworld.Greeter.Server, 50051)
iex> {:ok, channel} = GRPC.Stub.connect("localhost:50051")
iex> request = Helloworld.HelloRequest.new(name: "grpc-elixir")
iex> channel |> Helloworld.Greeter.Stub.say_hello(request)
Start the server
You can start the gRPC server as a supervised process. First, add GRPC.Server.Supervisor
to your supervision tree.
# In the start function of your Application
def start(_type, _args) do
children = [
# ...
supervisor(GRPC.Server.Supervisor, [{Helloworld.Greeter.Server, 50051}])
]
opts = [strategy: :one_for_one, name: HelloworldApp]
Supervisor.start_link(children, opts)
end
Then run grpc.server:
$ mix grpc.server
or start it when starting your application:
# config.exs
config :grpc, start_server: true
$ iex -S mix
Check examples for all examples
TODO
- Unary RPC
- Server streaming RPC
- Client streaming RPC
- Bidirectional streaming RPC
- Helloworld and RouteGuide examples
- Doc and more tests
- Authentication with TLS
- Improve code generation from protos (#8)
- Improve timeout(now there's simple timeout)
- Errors handling
- Data compression
- Benchmarking
- Logging
Contributing
You contributions are welcome!
Please open issues if you have questions, problems and ideas. You can create pull requests directly if you want to fix little bugs, add small features and so on. But you'd better use issues first if you want to add a big feature or change a lot of code.