在Phoenix app:Genserver中提取微服务

nav*_*een 2 elixir phoenix-framework

我正在阅读这篇文章,关于如何从现有的凤凰应用程序中提取微服务.作者重构了一个凤凰app控制器并将其中一个方法移动到Genserver,之后他将Genserver移动到一个单独的应用程序并在主项目中添加了一个依赖项.

但是我在这里有点困惑,因为GenServer只允许你有两个服务器回调(即句柄调用和句柄转换).但是,如果我想要一个功能作为微服务移出,我们最终会创建与该服务中涉及的端点一样多的Genserver,因为单个genserver将允许一个/两个方法调用.genserver是提取服务的理想方法吗?

Cod*_*oll 7

GenServer主要有3个回调:handle_cast,handle_call,和handle_info.这些函数中的每一个都可以有多个子句,每个子句都实现一个特定的功能.

举例来说,假设我有一个UserService作为GenServer实施,5个操作模块:create,show,index,update,和delete.让我们进一步假设我将实现delete为异步操作(使用handle_cast),其余为同步操作(使用handle_call).

def handle_call({:create, user_data}, _from, state) do
  new_user = User.create(user_data) // (However you create a user)
  {:reply, new_user, state}
end

def handle_call(:index, _from, state) do
  users = User.all
  {:reply, users, state}
end

def handle_call({:update, user_changes}, _from, state) do
  updated_user = User.update(user_changes)
  {:reply, updated_user, state}
end

def handle_call({:show, user_id}, _from, state) do
  user = User.get(user_id)
  {:reply, user, state}
end

def handle_cast({:delete, user_id}, state) do
  User.delete(user_id)
  {:no_reply, state)
end
Run Code Online (Sandbox Code Playgroud)

客户端模块可以调用user = GenServer.call(pid, {:show, user_id})以使用该show子句.主要的内容是,即使只定义了一些"函数",您也可以根据需要定义该函数的多个子句,并且模式匹配将调度到正确的子句.