爲何不選擇使用Java原生的NIO而選擇netty?
一、使用jdk自帶的nio的類庫和api繁雜,使用麻煩。你須要熟練掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
二、netty底層IO模型隨意切換,這些都只須要作很小的改動
三、netty自帶拆包和解包,異常檢測等機制讓你從繁瑣的nio細節中解脫出來,讓你只須要關心業務
四、netty解決了jdk空輪詢的bug
五、netty底層對線程。Selector作了不少細節優化,精心設計的reactor線程作到很是高效的併發處理
六、自帶各類協議棧
七、社區活躍
八、穩定、健壯、已經歷普遍使用和驗證
消費者請求調用鏈
InvokerInvocationHandler#invoke
->MockClusterInvoker#invoke
->AbstructClusterInvoker#invoke
->FailOverClusterInvoker#doInvoke
->InvokerWrapper#invoke
->ProtocolFilterWrapper#invoke
->ConsumerContextFilter#invoke
->ProtocolFilterWrapper#invoke
->FutureFilter#invoke
->ProtocolFilterWrapper.Invoker#invoke
->MonitorFilter#invoke
->ProtocolFilterWrapper.Invoker#invoke
->CacheFilter.invoke
->ListenerInvokerWrapper#invoke
->AbstractInvoker#invoke
->DubboInvoker.doInvoke
->ReferenceCountExchangeClient#request
->HeaderExchangeClient#request
->HeaderExchangeChannel#request
->AbstractPeer#send
->AbstractClient#send
->NettyChannel#send
dubbo 請求處理流程
一、消費者啓動時,經過spring容器加載dubbo META-INF下spring.handler文件去獲取dubbo的命名空間處理工具類DubboNamespaceHandler,該類中註冊了dubbo各類命名空間的解析方式DubboBeanDefinitionParser,而後經過DubboBeanDefinitionParser將配置解析處理注入到spring容器中。dubbo會爲消費者中的每一個service生成一個代理實現類,每一個代理類都會關聯一個InvocationHandler,代理上每一個方法的執行都會被分發到其關聯的InvocationHandler的invoke方法上。
二、消費者從容器中獲取到service實例,調用方法的時候,代理調用InvokerInvocationHandler的invoke方法,默認使用failOver策略,在FailOverClusterInvoker的doInvoke方法中獲取server服務的list,而後經過dubbo默認的隨機負載均衡策略隨機獲取一臺服務實例地址,並訪問。調用會走過一系列的調用鏈,而後進入到DubboInvoker的doInvoke方法中,該方法中獲取到ExchangeClient的實現類ReferenceCountExchangeClient並調用其request方法,最後進入到HeaderExchangeChannel的request方法,HeaderExchangeChannel的request方法將請求包裝成一個request,發送到NettyChannel中,由NettyChannel將請求發送到服務器
dubbo和spring cloud
一、協議上,dubbo使用rpc協議,服務調用者嚴格依賴於服務提供方提供的service接口,要求在開發的過程當中嚴格的進行版本管理;spring cloud使用restful的http協議,服務提供方和消費方不存在直接的依賴關係,相對來講更加靈活
二、宏觀來講,dubbo專一於服務治理,而且在服務治理、灰度發佈、流量分發這方面作的比 Spring Cloud 還好;spring cloud則提供了一站式的微服務解決方案,考慮到了服務治理的方方面面
三、社區活躍度上,spring cloud更新更加頻繁,社區也更活躍
四、背景上,spring cloud依託於spring,spring專一於企業級開源框架的研發;dubbo是alibaba的服務化治理的核心框架,中文文檔完善,但alibaba是一個商業公司,仍然以服務自身業務爲主