dubbo与Netty的关系
Netty是個(gè)高性能的Java網(wǎng)絡(luò)傳輸框架,在很多中間件或者分布式框架中幾乎都能看到它的身影。既然Netty這么受歡迎,那到底怎么把netty嵌入到我們的系統(tǒng)中了?筆者在幾年前就接觸了Netty,也開(kāi)發(fā)了個(gè)小項(xiàng)目。一直問(wèn)題困擾自己,Netty使用場(chǎng)景是什么?怎么使用Netty?我們可以從dubbo中找到些答案。dubbo是高性能輕量級(jí)的RPC框架。
netty本質(zhì)的功能負(fù)責(zé)網(wǎng)絡(luò)傳輸,dubbo使用netty作為網(wǎng)絡(luò)傳輸框架。說(shuō)到網(wǎng)絡(luò)傳輸自然離不開(kāi)Socket,Socket是端到端的連接。dubbo是無(wú)中心化,每個(gè)client端都能與server端連接,每個(gè)client端同時(shí)又是server端。
dubbo的client端主要實(shí)現(xiàn)AbstractClient,NettyClient擴(kuò)展繼承了它。一般來(lái)說(shuō)對(duì)于同一個(gè)server端來(lái)說(shuō)(ip和port相同),只有一個(gè)client實(shí)例對(duì)應(yīng),也就是dubbo所說(shuō)的共享連接。從DubboProtocol類實(shí)現(xiàn)可以找到
private ExchangeClient[] getClients(URL url){
//是否共享連接
boolean service_share_connect = false;
int connections = url.getParameter(Constants.CONNECTIONS_KEY, 0);
//如果connections不配置,則共享連接,否則每服務(wù)每連接
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;
}
從代碼可以看出NettyClient實(shí)例并不輕,盡量減少NettyClient實(shí)例,這也是多個(gè)服務(wù)共享連接的原因之一。在設(shè)計(jì)類似NettyClient的時(shí)候,不要忘了實(shí)例化NettyClient的開(kāi)銷。一定不要忘記了緩存或者連接池的使用。大都優(yōu)秀的框架都是運(yùn)用了這兩個(gè)思想。
private static final Logger logger = LoggerFactory.getLogger(AbstractClient.class);
protected static final String CLIENT_THREAD_POOL_NAME =“DubboClientHandler”;
private static final AtomicInteger CLIENT_THREAD_POOL_ID = new AtomicInteger();
private final Lock connectLock = new ReentrantLock();
//重連調(diào)度器
private static final ScheduledThreadPoolExecutor reconnectExecutorService= new ScheduledThreadPoolExecutor(2, new NamedThreadFactory(“DubboClientReconnectTimer”, true));
private volatile ScheduledFuture
總結(jié)
以上是生活随笔為你收集整理的dubbo与Netty的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。