dubbo导致mysql连接数太多_Dubbo 连接数控制

本文主要探讨了Dubbo中客户端和服务端的连接控制。客户端通过connections参数限制ExchangeClient数量,若未配置则默认共享连接。服务端通过accepts参数限制接受的连接数,超出将关闭新连接。此外,解释了当多个引用配置不同connections时,如何决定总的Client连接数。
摘要由CSDN通过智能技术生成

客户端连接控制

限制客户端服务使用连接不能超过 10 个。

如果 和 都配了 connections, 优先。

配置参数为connections。

public class DubboProtocol extends AbstractProtocol {

private ExchangeClient[] getClients(URL url) {

// whether to share connection

boolean service_share_connect = false;

// String CONNECTIONS_KEY = "connections";

int connections = url.getParameter(Constants.CONNECTIONS_KEY, 0);

// if not configured, connection is shared, otherwise, one connection for one service

if (connections == 0) {

service_share_connect = true;

connections = 1;

}

// 如果设置了最大连接数,就不走共享连接,直接创建指定个数的连接。

ExchangeClient[] clients = new ExchangeClient[connections];

for (int i = 0; i < clients.length; i++) {

if (service_share_connect) {

clients[i] = getSharedClient(url);

} else {

clients[i] = initClient(url);

}

}

return clients;

}

private ExchangeClient initClient(URL url) {

// client type setting.

String str = url.getParameter(Constants.CLIENT_KEY, url.getParameter(Constants.SERVER_KEY, Constants.DEFAULT_REMOTING_CLIENT));

url = url.addParameter(Constants.CODEC_KEY, DubboCodec.NAME);

// enable heartbeat by default

url = url.addParameterIfAbsent(Constants.HEARTBEAT_KEY, String.valueOf(Constants.DEFAULT_HEARTBEAT));

// BIO is not allowed since it has severe performance issue.

if (str != null && str.length() > 0 && !ExtensionLoader.getExtensionLoader(Transporter.class).hasExtension(str)) {

throw new RpcException("Unsupported client type: " + str + "," +

" supported client type is " + StringUtils.join(ExtensionLoader.getExtensionLoader(Transporter.class).getSupportedExtensions(), " "));

}

ExchangeClient client;

try {

// connection should be lazy

if (url.getParameter(Constants.LAZY_CONNECT_KEY, false)) {

client = new LazyConnectExchangeClient(url, requestHandler);

} else {

client = Exchangers.connect(url, requestHandler);

}

} catch (RemotingException e) {

throw new RpcException("Fail to create remoting client for service(" + url + "): " + e.getMessage(), e);

}

return client;

}

}

客户端的连接数控制是通过创建ExchangeClient的过程中进行控制。

如果设置了connections的变量,那么就只创建指定数量的的ExchangeClient对象。

服务端连接控制

限制服务器端接受的连接不能超过 10 个。

配置参数为accepts。

public class NettyServer extends AbstractServer implements Server {

private Map channels; //

private ServerBootstrap bootstrap;

private io.netty.channel.Channel channel;

private EventLoopGroup bossGroup;

private EventLoopGroup workerGroup;

public NettyServer(URL url, ChannelHandler handler) throws RemotingException {

super(url, ChannelHandlers.wrap(handler, ExecutorUtil.setThreadName(url, SERVER_THREAD_POOL_NAME)));

}

}

public abstract class AbstractServer extends AbstractEndpoint implements Server {

protected static final String SERVER_THREAD_POOL_NAME = "DubboServerHandler";

private static final Logger logger = LoggerFactory.getLogger(AbstractServer.class);

ExecutorService executor;

private InetSocketAddress localAddress;

private InetSocketAddress bindAddress;

// 服务端连接控制

private int accepts;

private int idleTimeout = 600; //600 seconds

public void connected(Channel ch) throws RemotingException {

// If the server has entered the shutdown process, reject any new connection

if (this.isClosing() || this.isClosed()) {

logger.warn("Close new channel " + ch + ", cause: server is closing or has been closed. For example, receive a new connect request while in shutdown process.");

ch.close();

return;

}

Collection channels = getChannels();

// 超过服务端连接控制,直接关闭连接。

if (accepts > 0 && channels.size() > accepts) {

logger.error("Close channel " + ch + ", cause: The server " + ch.getLocalAddress() + " connections greater than max config " + accepts);

ch.close();

return;

}

super.connected(ch);

}

}

服务端的连接控制数通过NettyServer的connected()方法在处理连接事件的时候进行判断。

如果连接数的数量超过了accepts的值那么就抛出异常并关闭连接数。

连接数说明

客户端没有配置connections,使用共享连接,以 ip+port 确定一个连接。

客户端配置了connections,客户端配置了两个引用(两个reference)且一个配置了connections=“2”,另一个没有配置connections,则没有配置connects的引用使用共享连接产生一个Client连接,配置connections=“2”使用独立连接,且连接数为2,则产生两个Client连接,所以一共产生三个Client连接。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值