Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@ rebar3.crashdump
*~
doc/
rebar3
certs/key.pem
certs/cert.pem
71 changes: 67 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,18 @@ rpc_server/
│ └── include/rpc_server.hrl
├── config/
│ ├── dev_sys.config
│ ├── dev_sys_quic.config
│ ├── dev_vm.config
│ ├── dev_vm_quic.config
│ ├── dev_http.vm.args
│ └── dev_shell.vm.args
│ ├── dev_http_quic.vm.args
│ ├── dev_shell.vm.args
│ └── dev_shell_quic.vm.args
├── certs/
│ ├── generate.sh
│ ├── cert.pem
│ └── key.pem
├── start.sh
└── rebar.config
```

Expand Down Expand Up @@ -60,7 +69,41 @@ rebar3 compile

## Como rodar

### Desenvolvimento (interativo)
O script `start.sh` permite iniciar cada nó com o protocolo de distribuição desejado: **TCP** (padrão Erlang) ou **QUIC** (RFC 9000, via [erlang_quic](https://github.com/benoitc/erlang_quic)).

### Pré-requisitos para QUIC

Gere os certificados TLS (necessários apenas uma vez):

```bash
cd certs && bash generate.sh
```

### Usando o start.sh

```bash
# TCP (padrão)
./start.sh --node http # nó HTTP na porta 8080
./start.sh --node shell # nó Shell
./start.sh --node default # ambos os apps no mesmo nó

# QUIC
./start.sh --node http --protocol quic # nó HTTP com distribuição QUIC (porta dist 4434)
./start.sh --node shell --protocol quic # nó Shell com distribuição QUIC (porta dist 4435)
./start.sh --node default --protocol quic # ambos os apps com QUIC (porta dist 4433)
```

Cada tipo de nó usa uma porta QUIC diferente para evitar conflito no mesmo host:

| Nó | Porta QUIC |
|----|------------|
| default | 4433 |
| http | 4434 |
| shell | 4435 |

> **Importante:** Todos os nós do cluster devem usar o mesmo protocolo. Nós QUIC e TCP não se conectam entre si.

### Desenvolvimento (interativo, sem script)

```bash
rebar3 shell --config config/dev_sys.config
Expand Down Expand Up @@ -99,7 +142,7 @@ rebar3 as shell_node release -n rpc_server_shell

## Configuração

Arquivo principal: `config/dev_sys.config`.
Arquivo principal: `config/dev_sys.config` (TCP) ou `config/dev_sys_quic.config` (QUIC).

Parâmetros relevantes do `rpc_server_http` (padrões):

Expand All @@ -111,7 +154,27 @@ Parâmetros relevantes do `rpc_server_http` (padrões):
]}
```

Nomes de nós e cookie (releases e dev):
### Configuração QUIC

O `dev_sys_quic.config` inclui a seção de distribuição QUIC:

```erlang
{quic, [
{dist, [
{cert_file, "/path/to/cert.pem"},
{key_file, "/path/to/key.pem"},
{verify, verify_none},
{discovery_module, quic_discovery_static},
{nodes, [
{'rpc_server@127.0.0.1', {"127.0.0.1", 4433}},
{'rpc_server_http@127.0.0.1', {"127.0.0.1", 4434}},
{'rpc_server_shell@127.0.0.1', {"127.0.0.1", 4435}}
]}
]}
]}
```

### Nomes de nós e cookie

- Nó único: `config/dev_vm.config` (ex.: `-name rpc_server@127.0.0.1`, cookie `service_discovery_cookie`).
- HTTP: `config/dev_http.vm.args` (ex.: `-name rpc_server_http@127.0.0.1`).
Expand Down
20 changes: 20 additions & 0 deletions certs/generate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/bash

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"

if [ -f cert.pem ] && [ -f key.pem ]; then
echo "Certificates already exist. Remove cert.pem and key.pem to regenerate."
exit 0
fi

echo "Generating self-signed certificate for QUIC distribution..."
openssl req -x509 -newkey rsa:2048 \
-keyout key.pem -out cert.pem \
-days 365 -nodes -subj '/CN=localhost'

echo "Done. Files created:"
echo " $SCRIPT_DIR/cert.pem"
echo " $SCRIPT_DIR/key.pem"
15 changes: 15 additions & 0 deletions config/dev_http_quic.vm.args
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-name rpc_server_http@127.0.0.1
-setcookie service_discovery_cookie
-env ERL_MAX_PORTS 4096
-env ERL_CRASH_DUMP ./log/erl_crash_http.dump

-kernel logger_level info

## QUIC distribution
-proto_dist quic
-epmd_module quic_epmd
-start_epmd false
-quic_dist_port 4434

+zdbbl 32768
+K true
15 changes: 15 additions & 0 deletions config/dev_shell_quic.vm.args
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
-name rpc_server_shell@127.0.0.1
-setcookie service_discovery_cookie
-env ERL_MAX_PORTS 4096
-env ERL_CRASH_DUMP ./log/erl_crash_shell.dump

-kernel logger_level info

## QUIC distribution
-proto_dist quic
-epmd_module quic_epmd
-start_epmd false
-quic_dist_port 4435

+zdbbl 32768
+K true
66 changes: 66 additions & 0 deletions config/dev_sys_quic.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
[
{quic, [
{dist, [
{cert_file, "rpc_server/certs/cert.pem"},
{key_file, "rpc_server/certs/key.pem"},
{verify, verify_none},
{discovery_module, quic_discovery_static},
{nodes, [
{'rpc_server@127.0.0.1', {"127.0.0.1", 4433}},
{'rpc_server_http@127.0.0.1', {"127.0.0.1", 4434}},
{'rpc_server_shell@127.0.0.1', {"127.0.0.1", 4435}}
]}
]}
]},

{kernel, [
{sync_nodes_optional, ['rpc_server_http@127.0.0.1','rpc_server_shell@127.0.0.1']},
{sync_nodes_timeout, 30000},
{logger_level, info},
{logger, [
{handler, default, logger_std_h,
#{level => info,
formatter => {logger_formatter, #{single_line => true}}}},
{handler, error_logger, logger_std_h,
#{level => info,
formatter => {logger_formatter, #{single_line => true}}}}
]}
]},

{lager, [
{handlers, [
{lager_console_backend, [{level, info}]},
{lager_file_backend, [
{file, "log/rpc_server.log"},
{level, info},
{size, 10485760},
{date, "$D0"},
{count, 5}
]}
]}
]},

{rpc_server_http, [
{tcp_port, 8080},
{num_acceptors, 100},
{max_connections, 10000},
{tcp_listen_options, [
binary,
{packet, raw},
{reuseaddr, true},
{active, true},
{backlog, 128}
]},
{tcp_connection_options, [
binary,
{packet, raw},
{active, false},
{keepalive, true},
{send_timeout, 5000},
{send_timeout_close, true},
{exit_on_close, true}
]}
]},

{rpc_server_shell, []}
].
20 changes: 20 additions & 0 deletions config/dev_vm_quic.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-name rpc_server@127.0.0.1

-setcookie service_discovery_cookie

+S 1

+C multi_time_warp

+sbwt none

+A30

## QUIC distribution
-proto_dist quic
-epmd_module quic_epmd
-start_epmd false
-quic_dist_port 4433

+zdbbl 32768
+K true
9 changes: 6 additions & 3 deletions rebar.config
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{erl_opts, [debug_info]}.
{deps, [
{lager, "3.9.2"} % Dependência do Lager(https://github.com/erlang-lager/lager) para logging estruturado
{lager, "3.9.2"}, % Dependência do Lager(https://github.com/erlang-lager/lager) para logging estruturado
{quic, "0.11.0"}
]}.

{apps_dirs, ["apps"]}.
Expand All @@ -11,6 +12,8 @@
stdlib,
sasl,
crypto,
ssl,
quic,
lager,
runtime_tools, observer, wx,
rpc_server_http,
Expand Down Expand Up @@ -71,7 +74,7 @@
{http_node, [
{relx, [
{release, {rpc_server_http, "0.1.0"},
[kernel, stdlib, sasl, crypto, lager, runtime_tools, observer, wx, rpc_server_http]},
[kernel, stdlib, sasl, crypto, ssl, quic, lager, runtime_tools, observer, wx, rpc_server_http]},
{sys_config, "./config/dev_sys.config"},
{vm_args, "./config/dev_http.vm.args"},
{dev_mode, true},
Expand All @@ -82,7 +85,7 @@
{shell_node, [
{relx, [
{release, {rpc_server_shell, "0.1.0"},
[kernel, stdlib, sasl, crypto, lager, runtime_tools, observer, wx, rpc_server_shell]},
[kernel, stdlib, sasl, crypto, ssl, quic, lager, runtime_tools, observer, wx, rpc_server_shell]},
{sys_config, "./config/dev_sys.config"},
{vm_args, "./config/dev_shell.vm.args"},
{dev_mode, true},
Expand Down
Loading
Loading