Skip to content

Commit 896b3c3

Browse files
author
Chrono Law
committed
load balance module
1 parent 34f3327 commit 896b3c3

File tree

5 files changed

+177
-0
lines changed

5 files changed

+177
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright (c) 2015
2+
// Author: Chrono Law
3+
4+
#include "NdgLoadBalanceInit.hpp"
5+
6+
auto ndg_load_balance_module = NdgLoadBalanceInit::module();
7+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) 2015
2+
// Author: Chrono Law
3+
#ifndef _NDG_LOAD_BALANCE_CONF_HPP
4+
#define _NDG_LOAD_BALANCE_CONF_HPP
5+
6+
#include "NgxAll.hpp"
7+
8+
//NGX_MOD_INSTANCE(NdgLoadBalanceModule, ndg_load_balance_module)
9+
10+
#endif //_NDG_LOAD_BALANCE_CONF_HPP
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright (c) 2015
2+
// Author: Chrono Law
3+
#ifndef _NDG_LOAD_BALANCE_HANDLER_HPP
4+
#define _NDG_LOAD_BALANCE_HANDLER_HPP
5+
6+
#include <boost/random.hpp>
7+
8+
#include "NdgLoadBalanceConf.hpp"
9+
10+
class NdgLoadBalanceCallback final
11+
{
12+
public:
13+
typedef NgxLogDebug log;
14+
typedef NdgLoadBalanceCallback this_type;
15+
typedef boost::rand48 random_type;
16+
public:
17+
// the round robin data must be first
18+
ngx_http_upstream_rr_peer_data_t rrp;
19+
20+
u_char tries = 0;
21+
ngx_event_get_peer_pt get_rr_peer = ngx_http_upstream_get_round_robin_peer;
22+
public:
23+
static ngx_int_t get(ngx_peer_connection_t *pc, void *data)
24+
{
25+
auto& peer_data = *reinterpret_cast<this_type*>(data);
26+
auto& peers = *peer_data.rrp.peers;
27+
28+
if(peer_data.tries++ > 5 || peers.single)
29+
{
30+
return peer_data.get_rr_peer(pc, &peer_data.rrp);
31+
}
32+
33+
static random_type rand(time(0));
34+
35+
auto& peer = peers.peer[rand() % peers.number];
36+
37+
pc->sockaddr = peer.sockaddr;
38+
pc->socklen = peer.socklen;
39+
pc->name = &peer.name;
40+
41+
log(pc->log).print("peer=%V", &peer.name);
42+
43+
pc->cached = false;
44+
pc->connection = nullptr;
45+
46+
return NGX_OK;
47+
}
48+
49+
public:
50+
static void free(ngx_peer_connection_t *pc, void *data, ngx_uint_t state)
51+
{
52+
//auto peer_data = reinterpret_cast<this_type*>(data);
53+
}
54+
};
55+
56+
class NdgLoadBalanceHandler final
57+
{
58+
public:
59+
typedef NdgLoadBalanceHandler this_type;
60+
typedef NdgLoadBalanceCallback callback_type;
61+
typedef NdgLoadBalanceCallback peer_data_type;
62+
63+
//typedef NdgLoadBalanceModule this_module;
64+
typedef NgxLoadBalance<peer_data_type,
65+
&callback_type::get>
66+
//&callback_type::free>
67+
this_load_balance;
68+
public:
69+
static ngx_int_t init(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
70+
try
71+
{
72+
this_load_balance::init(cf, us, &this_type::init_peer);
73+
return NGX_OK;
74+
}
75+
catch(const NgxException& e)
76+
{
77+
return e.code();
78+
}
79+
public:
80+
static ngx_int_t init_peer(ngx_http_request_t *r, ngx_http_upstream_srv_conf_t *us)
81+
{
82+
this_load_balance::init(r, us);
83+
84+
return NGX_OK;
85+
}
86+
};
87+
88+
#endif //_NDG_LOAD_BALANCE_HANDLER_HPP
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Copyright (c) 2015
2+
// Author: Chrono Law
3+
#ifndef _NDG_LOAD_BALANCE_INIT_HPP
4+
#define _NDG_LOAD_BALANCE_INIT_HPP
5+
6+
#include "NdgLoadBalanceConf.hpp"
7+
#include "NdgLoadBalanceHandler.hpp"
8+
9+
class NdgLoadBalanceInit final
10+
{
11+
public:
12+
typedef NdgLoadBalanceHandler handler_type;
13+
typedef NdgLoadBalanceInit this_type;
14+
public:
15+
static ngx_command_t* cmds()
16+
{
17+
static ngx_command_t n[] =
18+
{
19+
NgxCommand(
20+
ngx_string("ndg_load_balance"),
21+
NgxTake(NGX_HTTP_UPS_CONF, 0),
22+
&this_type::set_load_balance
23+
),
24+
25+
NgxCommand()
26+
};
27+
28+
return n;
29+
}
30+
public:
31+
static ngx_http_module_t* ctx()
32+
{
33+
static ngx_http_module_t c =
34+
{
35+
NGX_MODULE_NULL(8)
36+
};
37+
38+
return &c;
39+
}
40+
public:
41+
static const ngx_module_t& module()
42+
{
43+
static ngx_module_t m =
44+
{
45+
NGX_MODULE_V1,
46+
47+
ctx(),
48+
cmds(),
49+
50+
NGX_HTTP_MODULE,
51+
NGX_MODULE_NULL(7),
52+
NGX_MODULE_V1_PADDING
53+
};
54+
55+
return m;
56+
}
57+
private:
58+
static char* set_load_balance(ngx_conf_t* cf, ngx_command_t* cmd, void* conf)
59+
{
60+
NgxHttpUpstreamModule::instance().init(cf, &handler_type::init);
61+
62+
return NGX_CONF_OK;
63+
}
64+
};
65+
66+
#endif //_NDG_LOAD_BALANCE_INIT_HPP

modules/loadbalance/config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#./configure --add-module=$HOME/ngx_cpp_dev/modules/loadbalance
2+
3+
ngx_addon_name=ndg_load_balance_module
4+
5+
HTTP_MODULES="$HTTP_MODULES ndg_load_balance_module"
6+
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ModNdgLoadBalance.cpp"

0 commit comments

Comments
 (0)