You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by dl...@apache.org on 2019/07/23 17:08:33 UTC

[dubbo-erlang] 06/09: dev reference ref process

This is an automated email from the ASF dual-hosted git repository.

dlive pushed a commit to branch 0.4.0
in repository https://gitbox.apache.org/repos/asf/dubbo-erlang.git

commit e0b122b375aadbf1524789d54360728a7d90c027
Author: DLive <xs...@163.com>
AuthorDate: Sun Jun 23 23:39:36 2019 +0800

    dev reference ref process
---
 config_example/sys.config                 |  1 +
 include/dubbo.hrl                         |  1 +
 src/dubbo_common_fun.erl                  |  7 +--
 src/dubbo_directory.erl                   | 13 +++--
 src/dubbo_loadbalance_random.erl          | 20 ++++++++
 src/dubbo_protocol_registry.erl           |  2 +-
 src/dubbo_provider_consumer_reg_table.erl | 19 +++++--
 src/dubbo_reference_config.erl            | 83 ++++++++++++++++++++++---------
 src/dubboerl.erl                          |  5 +-
 9 files changed, 113 insertions(+), 38 deletions(-)

diff --git a/config_example/sys.config b/config_example/sys.config
index 0ed8a87..07cfaf9 100644
--- a/config_example/sys.config
+++ b/config_example/sys.config
@@ -17,6 +17,7 @@
         ]
     },
     {dubboerl,[
+        {registry,zookeeper},
         {zookeeper_list,[{"127.0.0.1",2181}]},
         {application,<<"testdubboerl">>},
         {registry,true},
diff --git a/include/dubbo.hrl b/include/dubbo.hrl
index f2d4048..282e0da 100644
--- a/include/dubbo.hrl
+++ b/include/dubbo.hrl
@@ -100,6 +100,7 @@
 }).
 
 
+-record(interface_info, {interface, loadbalance}).
 
 -record(interface_list, {interface, pid, connection_info}).
 %%-record(provider_node_list, {host_flag, pid, weight, readonly = false}).
diff --git a/src/dubbo_common_fun.erl b/src/dubbo_common_fun.erl
index 6717fac..5f38fbd 100644
--- a/src/dubbo_common_fun.erl
+++ b/src/dubbo_common_fun.erl
@@ -18,7 +18,7 @@
 
 -include("dubboerl.hrl").
 %% API
--export([local_ip_v4/0, local_ip_v4_str/0, parse_url/1, map_to_url/1]).
+-export([local_ip_v4/0, local_ip_v4_str/0, parse_url/1, url_to_binary/1]).
 
 local_ip_v4() ->
     {ok, Addrs} = inet:getifaddrs(),
@@ -67,7 +67,7 @@ parse_url_parameter([Item | Rest], Parameters) ->
     end.
 
 
-map_to_url(UrlInfo) ->
+url_to_binary(UrlInfo) ->
     ParameterStr =
         case UrlInfo#dubbo_url.parameters of
             undefined ->
@@ -79,10 +79,11 @@ map_to_url(UrlInfo) ->
                 ParameterStr2 = ["?" | ParameterStr1],
                 list_to_binary(ParameterStr2)
         end,
-    Value = io_lib:format(<<"~s://~s/~s?~s">>,
+    Value = io_lib:format(<<"~s://~s:~p/~s?~s">>,
         [
             UrlInfo#dubbo_url.scheme,
             UrlInfo#dubbo_url.host,
+            UrlInfo#dubbo_url.port,
             UrlInfo#dubbo_url.path,
             ParameterStr
         ]),
diff --git a/src/dubbo_directory.erl b/src/dubbo_directory.erl
index 07a6dff..c667f29 100644
--- a/src/dubbo_directory.erl
+++ b/src/dubbo_directory.erl
@@ -18,6 +18,8 @@
 
 -behaviour(gen_server).
 -include("dubboerl.hrl").
+-include("dubbo.hrl").
+
 -export([subscribe/2,notify/2]).
 %% API
 -export([start_link/0]).
@@ -92,15 +94,15 @@ refresh_invoker(UrlList)->
     case pick_interface(UrlList) of
         {error,Reason}->
             fail;
-        {"empty",Interface}->
+        {"empty",Interface,_}->
             todo_destroy;
-        {_,Interface} ->
+        {_,Interface,LoadBalance} ->
             OldProviderHosts = dubbo_provider_consumer_reg_table:get_interface_provider_node(Interface),
             NewInvokers = refresh_invoker(UrlList,[]),
             NewProviderHosts = [Item#dubbo_invoker.host_flag || Item <- NewInvokers],
             DeleteProverList = OldProviderHosts -- NewProviderHosts,
-            dubbo_provider_consumer_reg_table:clean_invalid_provider(DeleteProverList)
-
+            dubbo_provider_consumer_reg_table:clean_invalid_provider(DeleteProverList),
+            dubbo_provider_consumer_reg_table:update_connection_info(#interface_info{interface = Interface,loadbalance = LoadBalance})
     end.
 %%    OldProviderHosts =
 
@@ -119,7 +121,8 @@ pick_interface([Url | _]) ->
     case dubbo_common_fun:parse_url(Url) of
         {ok,UrlInfo}->
             Interface = maps:get("interface",UrlInfo#dubbo_url.parameters),
-            {UrlInfo#dubbo_url.scheme,Interface};
+            LoadBalance = list_to_atom("dubbo_loadbalance_" ++ maps:get("loadbalance",UrlInfo#dubbo_url.parameters,"random")),
+            {UrlInfo#dubbo_url.scheme,Interface,LoadBalance};
         {error,Reason} ->
             {error,Reason}
     end.
diff --git a/src/dubbo_loadbalance_random.erl b/src/dubbo_loadbalance_random.erl
new file mode 100644
index 0000000..21d4f61
--- /dev/null
+++ b/src/dubbo_loadbalance_random.erl
@@ -0,0 +1,20 @@
+%%------------------------------------------------------------------------------
+%% Licensed to the Apache Software Foundation (ASF) under one or more
+%% contributor license agreements.  See the NOTICE file distributed with
+%% this work for additional information regarding copyright ownership.
+%% The ASF licenses this file to You under the Apache License, Version 2.0
+%% (the "License"); you may not use this file except in compliance with
+%% the License.  You may obtain a copy of the License at
+%%
+%%     http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%------------------------------------------------------------------------------
+-module(dubbo_loadbalance_random).
+
+%% API
+-export([]).
diff --git a/src/dubbo_protocol_registry.erl b/src/dubbo_protocol_registry.erl
index 8277c7e..b2fde17 100644
--- a/src/dubbo_protocol_registry.erl
+++ b/src/dubbo_protocol_registry.erl
@@ -49,5 +49,5 @@ gen_consumer_url(UrlInfo)->
         path = Interface,
         parameters = Parameters2
     },
-    ConsumerUrl = dubbo_common_fun:map_to_url(ConsumerUrlInfo),
+    ConsumerUrl = dubbo_common_fun:url_to_binary(ConsumerUrlInfo),
     ConsumerUrl.
\ No newline at end of file
diff --git a/src/dubbo_provider_consumer_reg_table.erl b/src/dubbo_provider_consumer_reg_table.erl
index d47260d..1c193b8 100644
--- a/src/dubbo_provider_consumer_reg_table.erl
+++ b/src/dubbo_provider_consumer_reg_table.erl
@@ -36,6 +36,9 @@
 -define(SERVER, ?MODULE).
 
 -define(INTERFCE_LIST_TABLE, interface_list).
+
+-define(INTERFAE_INFO_TABLE,dubbo_interface_info).
+
 -define(PROVIDER_NODE_LIST_TABLE, provider_node_list).
 
 -record(state, {}).
@@ -87,16 +90,21 @@ init_ets_table() ->
             ok
     catch
         _Type:Reason ->
-            logger:error("new ets table error ~p", [Reason]),
-            error
+            logger:error("new ets table INTERFCE_LIST_TABLE error ~p", [Reason])
     end,
     try ets:new(?PROVIDER_NODE_LIST_TABLE, [bag, public, named_table, {keypos, 2}]) of
         ?PROVIDER_NODE_LIST_TABLE ->
             ok
     catch
         _Type1:Reason1 ->
-            logger:error("new ets table error ~p", [Reason1]),
-            error
+            logger:error("new ets table  PROVIDER_NODE_LIST_TABLE error ~p", [Reason1])
+    end,
+    try ets:new(?INTERFAE_INFO_TABLE, [public, named_table, {keypos, 2}]) of
+        ?INTERFAE_INFO_TABLE ->
+            ok
+    catch
+        _Type1:Reason1 ->
+            logger:error("new ets table  PROVIDER_NODE_LIST_TABLE error ~p", [Reason1])
     end,
     ok.
 %%--------------------------------------------------------------------
@@ -196,6 +204,9 @@ get_host_connections(Host, Port) ->
     List = ets:lookup(?PROVIDER_NODE_LIST_TABLE, HostFlag),
     List.
 
+update_interface_info(InterfaceInfo)->
+    ets:insert(?INTERFAE_INFO_TABLE,InterfaceInfo).
+
 
 %%%===================================================================
 %%% Internal functions
diff --git a/src/dubbo_reference_config.erl b/src/dubbo_reference_config.erl
index 6c58a50..7ab7f86 100644
--- a/src/dubbo_reference_config.erl
+++ b/src/dubbo_reference_config.erl
@@ -16,24 +16,28 @@
 %%------------------------------------------------------------------------------
 -module(dubbo_reference_config).
 
+-include("dubbo.hrl").
+-include("dubboerl.hrl").
+
 -record(dubbo_interface_info,{}).
 
 %% API
--export([]).
-
-init_reference()->
-    InitConfigMap= #{
+-export([init_reference/1]).
 
-    },
+init_reference(ConsumerInfo)->
+%%    InitConfigMap= #{
+%%
+%%    },
     %% 组装各类需要数据
+    create_proxy(ConsumerInfo),
     ok.
 
 
-create_proxy(InitConfigMap)->
+create_proxy(ConsumerInfo)->
+
 
 
-    InterfaceClassInfo = #{},
-    Para = gen_parameter(),
+    Para = gen_parameter(ConsumerInfo),
     Url = gen_registry_url(Para),
     dubbo_extension:run(protocol_wapper,refer,[Url]),
     ok.
@@ -43,32 +47,65 @@ create_proxy(InitConfigMap)->
 
 gen_registry_url(Para)->
     %%todo 组装para & url
+    {Host,Port} = get_registry_host_port(),
+    UrlInfo = #dubbo_url{
+        scheme = <<"registry">>,
+        host = list_to_binary(Host),
+        port = integer_to_binary(Port),
+        path = <<"org.apache.dubbo.registry.RegistryService">>,
+        parameters = Para
+    },
+    dubbo_common_fun:url_to_binary(UrlInfo).
+%%    Url = "registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=hello-world&dubbo=2.0.2&pid=68901&refer=application%3Dhello-world%26default.check%3Dfalse%26default.lazy%3Dfalse%26default.retries%3D0%26default.sticky%3Dfalse%26default.timeout%3D300000%26dubbo%3D2.0.2%26interface%3Dorg.apache.dubbo.erlang.sample.service.facade.UserOperator%26lazy%3Dfalse%26methods%3DqueryUserInfo%2CqueryUserList%2CgenUserId%2CgetUserInfo%26pid%3D68901%26register.ip%3D127.0.0.1% [...]
+%%    Url.
+
+get_registry_host_port()->
+    %% @todo need adapter other registry
+    RegistryList = application:get_env(dubboerl,zookeeper_list,[{"127.0.0.1",2181}]),
+    [Item|_] = RegistryList,
+    Item.
 
-    Url = "registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=hello-world&dubbo=2.0.2&pid=68901&refer=application%3Dhello-world%26default.check%3Dfalse%26default.lazy%3Dfalse%26default.retries%3D0%26default.sticky%3Dfalse%26default.timeout%3D300000%26dubbo%3D2.0.2%26interface%3Dorg.apache.dubbo.erlang.sample.service.facade.UserOperator%26lazy%3Dfalse%26methods%3DqueryUserInfo%2CqueryUserList%2CgenUserId%2CgetUserInfo%26pid%3D68901%26register.ip%3D127.0.0.1%26 [...]
-    Url.
-gen_parameter()->
+gen_parameter(ConsumerInfo)->
     Para = #{
-        <<"application">> => get_appname(),
+        <<"application">> => get_appname(ConsumerInfo),
         <<"dubbo">> => <<"2.0.2">>,
         <<"pid">> => get_pid(),
-        <<"refer">> => get_refinfo(),
+        <<"refer">> => get_refinfo(ConsumerInfo),
         <<"registry">> => get_registry_type(),
         <<"release">> => <<"2.7.1">>,
-        <<"timestamp">> => <<"1559727842451">>
+        <<"timestamp">> => integer_to_binary(dubbo_time_util:timestamp_ms())
     },
 
     Para.
 
-get_appname()->
-    %%todo
-    <<"hello-world">>.
+get_appname(ConsumerInfo)->
+    ConsumerInfo#consumer_config.application.
 get_pid()->
-    %%todo
-    <<"68901">>.
-get_refinfo()->
-    %%todo
-    <<"application%3Dhello-world%26default.check%3Dfalse%26default.lazy%3Dfalse%26default.retries%3D0%26default.sticky%3Dfalse%26default.timeout%3D300000%26dubbo%3D2.0.2%26interface%3Dorg.apache.dubbo.erlang.sample.service.facade.UserOperator%26lazy%3Dfalse%26methods%3DqueryUserInfo%2CqueryUserList%2CgenUserId%2CgetUserInfo%26pid%3D68901%26register.ip%3D127..0.1%26release%3D2.7.1%26retries%3D0%26side%3Dconsumer%26sticky%3Dfalse%26timestamp%3D1559727789953">>.
+    os:getpid().
+get_refinfo(ConsumerInfo)->
+    KeyValues=[
+        {"application",ConsumerInfo#consumer_config.application},
+        {"default.check",ConsumerInfo#consumer_config.check},
+        {"default.lazy","false"},
+        {"default.retries","0"},
+        {"default.sticky","false"},
+        {"default.timeout","300000"},
+        {"dubbo","2.0.2"},
+        {"interface",ConsumerInfo#consumer_config.interface},
+        {"lazy","false"},
+        {"methods",ConsumerInfo#consumer_config.methods},
+        {"register.ip",ConsumerInfo#consumer_config.application},
+        {"release","2.7.1"},
+        {"pid",get_pid()},
+        {"side","consumer"},
+        {"sticky","false"},
+        {"timestamp",dubbo_time_util:timestamp_ms()}
+    ],
+    KeyValues2 = [io_lib:format("~s=~p", [Key, Value]) || {Key, Value} <= KeyValues],
+    ParameterStr1 = string:join(KeyValues2, "&"),
+    list_to_binary(http_uri:encode(ParameterStr1)).
+%%    <<"application%3Dhello-world%26default.check%3Dfalse%26default.lazy%3Dfalse%26default.retries%3D0%26default.sticky%3Dfalse%26default.timeout%3D300000%26dubbo%3D2.0.2%26interface%3Dorg.apache.dubbo.erlang.sample.service.facade.UserOperator%26lazy%3Dfalse%26methods%3DqueryUserInfo%2CqueryUserList%2CgenUserId%2CgetUserInfo%26pid%3D68901%26register.ip%3D127..0.1%26release%3D2.7.1%26retries%3D0%26side%3Dconsumer%26sticky%3Dfalse%26timestamp%3D1559727789953">>.
 
 get_registry_type()->
     %%todo
-    <<"zookeeper">>.
\ No newline at end of file
+    atom_to_binary(application:get_env(dubboerl,registry,zookeeper)).
\ No newline at end of file
diff --git a/src/dubboerl.erl b/src/dubboerl.erl
index 0a5f5bc..03cc8a0 100644
--- a/src/dubboerl.erl
+++ b/src/dubboerl.erl
@@ -33,8 +33,9 @@ start_consumer() ->
     ApplicationName = application:get_env(dubboerl, application, <<"defaultApplication">>),
     lists:map(fun({Interface, Option}) ->
         ConsumerInfo = dubbo_config_util:gen_consumer(ApplicationName, Interface, Option),
-        dubbo_zookeeper:register_consumer(ConsumerInfo),
-        logger:info("register consumer success ~p", [Interface])
+%%        dubbo_zookeeper:register_consumer(ConsumerInfo),
+        dubbo_reference_config:init_reference(ConsumerInfo),
+        logger:info("consumer refer success ~p", [Interface])
               end, ConsumerList),
     ok.