Here is an example of a service that greets people by the given name, and keeps track of how many users it encountered. See usage below.
%% greeter.erl
%% Greets people and counts number of times it did so.
-module(greeter).
-behaviour(gen_server).
%% Export API Functions
-export([start_link/0, greet/1, get_count/0]).
%% Required gen server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-record(state, {count::integer()}).
%% Public API
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, {}, []).
greet(Name) ->
gen_server:cast(?MODULE, {greet, Name}).
get_count() ->
gen_server:call(?MODULE, {get_count}).
%% Private
init({}) ->
{ok, #state{count=0}}.
handle_cast({greet, Name}, #state{count = Count} = State) ->
io:format("Greetings ~s!~n", [Name]),
{noreply, State#state{count = Count + 1}};
handle_cast(Msg, State) ->
error_logger:warning_msg("Bad message: ~p~n", [Msg]),
{noreply, State}.
handle_call({get_count}, _From, State) ->
{reply, {ok, State#state.count}, State};
handle_call(Request, _From, State) ->
error_logger:warning_msg("Bad message: ~p~n", [Request]),
{reply, {error, unknown_call}, State}.
%% Other gen_server callbacks
handle_info(Info, State) ->
error_logger:warning_msg("Bad message: ~p~n", [Info]),
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
Here is a sample usage of this service in the erlang shell:
1> c(greeter).
{ok,greeter}
2> greeter:start_link().
{ok,<0.62.0>}
3> greeter:greet("Andriy").
Greetings Andriy!
ok
4> greeter:greet("Mike").
Greetings Mike!
ok
5> greeter:get_count().
{ok,2}