This commit is contained in:
anlicheng 2026-05-11 22:28:44 +08:00
parent 32dd08da9d
commit e88ad2078f
32 changed files with 72 additions and 38 deletions

View File

@ -1,6 +1,6 @@
# EFKA 当前代码逻辑梳理 # EFKA 当前代码逻辑梳理
> 本文档记录当前阅读代码后对项目逻辑的理解,主要基于 `src/`、`include/`、`config/` 和 protobuf 生成文件。尚未覆盖每个边界条件和全部测试行为。 > 本文档记录当前阅读代码后对项目逻辑的理解,主要基于 `apps/efka/src/`、`apps/efka/include/`、`config/` 和 protobuf 生成文件。尚未覆盖每个边界条件和全部测试行为。
## 1. 项目定位 ## 1. 项目定位
@ -222,7 +222,7 @@ topic 匹配规则:
"/usr/local/code/tmp/dets/service.dets" "/usr/local/code/tmp/dets/service.dets"
``` ```
记录结构在 `include/efka_tables.hrl` 记录结构在 `apps/efka/include/efka_tables.hrl`
- `service_id` - `service_id`
- `container_name` - `container_name`

22
apps/efka/rebar.config Normal file
View File

@ -0,0 +1,22 @@
{erl_opts, [{i, "include"}]}.
{gpb_opts, [
{i, "proto"},
{f, ["service.proto"]},
recursive,
{module_name_suffix, "_pb"},
{o_erl, "src/protobuf"},
{o_hrl, "include"},
include_as_lib,
{strings_as_binaries, true},
type_specs,
report,
verbose
]}.
{provider_hooks, [
{pre, [
{compile, {protobuf, compile}},
{clean, {protobuf, clean}}
]}
]}.

View File

@ -0,0 +1,35 @@
-module(efka_docker_container_builder_tests).
-include_lib("eunit/include/eunit.hrl").
port_bindings_are_rendered_for_docker_create_test() ->
Name = <<"nginx">>,
ContainerDir = "/tmp/efka-nginx/",
Create = #{
<<"config">> => #{
<<"image">> => <<"nginx:latest">>,
<<"exposed_ports">> => [
#{<<"container_port">> => 80, <<"protocol">> => <<"tcp">>},
#{<<"container_port">> => 443, <<"protocol">> => <<"tcp">>}
]
},
<<"host_config">> => #{
<<"port_bindings">> => [
#{<<"host_ip">> => <<>>, <<"host_port">> => 8080, <<"container_port">> => 80, <<"protocol">> => <<"tcp">>},
#{<<"host_ip">> => <<>>, <<"host_port">> => 443, <<"container_port">> => 443, <<"protocol">> => <<"tcp">>}
]
}
},
Options = docker_container_builder:build_options(Name, ContainerDir, Create),
?assertMatch(#{
<<"ExposedPorts">> := #{
<<"80/tcp">> := #{},
<<"443/tcp">> := #{}
},
<<"HostConfig">> := #{
<<"PortBindings">> := #{
<<"80/tcp">> := [#{<<"HostIp">> := <<>>, <<"HostPort">> := <<"8080">>}],
<<"443/tcp">> := [#{<<"HostIp">> := <<>>, <<"HostPort">> := <<"443">>}]
}
}
}, Options).

View File

@ -4,11 +4,11 @@
对应代码: 对应代码:
- command 接收入口:[src/transport/efka_client.erl](/usr/local/code/cloudkit/efka/src/transport/efka_client.erl:177) - command 接收入口:[src/transport/efka_client.erl](/usr/local/code/cloudkit/efka/apps/efka/src/transport/efka_client.erl:177)
- 部署任务管理:[src/docker/docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/src/docker/docker_deploy_manager.erl:36) - 部署任务管理:[src/docker/docker_deploy_manager.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deploy_manager.erl:36)
- 部署执行:[src/docker/docker_deployer.erl](/usr/local/code/cloudkit/efka/src/docker/docker_deployer.erl:39) - 部署执行:[src/docker/docker_deployer.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_deployer.erl:39)
- Docker JSON 构造:[src/docker/docker_container_builder.erl](/usr/local/code/cloudkit/efka/src/docker/docker_container_builder.erl:14) - Docker JSON 构造:[src/docker/docker_container_builder.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_container_builder.erl:14)
- Docker API 调用:[src/docker/docker_commands.erl](/usr/local/code/cloudkit/efka/src/docker/docker_commands.erl:36) - Docker API 调用:[src/docker/docker_commands.erl](/usr/local/code/cloudkit/efka/apps/efka/src/docker/docker_commands.erl:36)
## 1. 协议入口 ## 1. 协议入口

View File

@ -2,10 +2,10 @@
本文档描述部署在 `efka` 主机上的 service 与 `efka` 之间的 WebSocket 通讯逻辑。当前接入实现位于: 本文档描述部署在 `efka` 主机上的 service 与 `efka` 之间的 WebSocket 通讯逻辑。当前接入实现位于:
- [service_channel.erl](/usr/local/code/cloudkit/efka/src/transport/service_channel.erl) - [service_channel.erl](/usr/local/code/cloudkit/efka/apps/efka/src/transport/service_channel.erl)
- [service.proto](/usr/local/code/cloudkit/efka/proto/service.proto) - [service.proto](/usr/local/code/cloudkit/efka/apps/efka/proto/service.proto)
- [efka_subscription.erl](/usr/local/code/cloudkit/efka/src/efka_subscription.erl) - [efka_subscription.erl](/usr/local/code/cloudkit/efka/apps/efka/src/efka_subscription.erl)
- [efka_service.erl](/usr/local/code/cloudkit/efka/src/micro_service/efka_service.erl) - [efka_service.erl](/usr/local/code/cloudkit/efka/apps/efka/src/micro_service/efka_service.erl)
## 1. 连接入口 ## 1. 连接入口
@ -56,7 +56,7 @@ service 与 `efka` 之间使用 WebSocket binary frame。每个业务 frame 的
## 3. Protobuf 定义 ## 3. Protobuf 定义
协议定义来自 `proto/service.proto` 协议定义来自 `apps/efka/proto/service.proto`
```protobuf ```protobuf
syntax = "proto3"; syntax = "proto3";

View File

@ -1,34 +1,11 @@
{erl_opts, [debug_info, {i, "include"}]}. {erl_opts, [debug_info]}.
{project_app_dirs, ["apps/*"]}.
{plugins, [ {plugins, [
{rebar3_gpb_plugin, ".*", {git, "https://github.com/lrascao/rebar3_gpb_plugin.git", {tag, "2.23.8"}}} {rebar3_gpb_plugin, ".*", {git, "https://github.com/lrascao/rebar3_gpb_plugin.git", {tag, "2.23.8"}}}
]}. ]}.
% ======================
% 核心:强制指定 proto 路径 + 输出到你的 apps/sdlan
% ======================
{gpb_opts, [
{i, "proto"}, % 共享 proto 文件路径
{src_dirs, ["proto"]}, % 源码目录(必须)
{f, ["service.proto"]},
recursive, % 递归查找 proto 文件
{module_name_suffix, "_pb"}, % 生成模块后缀
{o_erl, "src/protobuf"}, % .erl 输出目录
{o_hrl, "include"}, % .hrl 输出目录
include_as_lib, % gpb.hrl 通过 -include_lib("gpb/include/gpb.hrl")
{strings_as_binaries, true}, % proto string → Erlang binary
type_specs, % 生成 type specs
report, % 编译报告
verbose % 打印详细信息
]}.
{provider_hooks, [
{pre, [
{compile, {protobuf, compile}},
{clean, {protobuf, clean}}
]}
]}.
{deps, [ {deps, [
{sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}}, {sync, ".*", {git, "https://github.com/rustyio/sync.git", {branch, "master"}}},
{cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.10.0"}}}, {cowboy, ".*", {git, "https://github.com/ninenines/cowboy.git", {tag, "2.10.0"}}},