为什么不选择使用Java原生的NIO而选择netty?
1、使用jdk自带的nio的类库和api繁杂,使用麻烦。你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
2、netty底层IO模型随意切换,这些都只需要做很小的改动
3、netty自带拆包和解包,异常检测等机制让你从繁琐的nio细节中解脱出来,让你只需要关心业务
4、netty解决了jdk空轮询的bug
5、netty底层对线程。Selector做了很多细节优化,精心设计的reactor线程做到非常高效的并发处理
6、自带各种协议栈
7、社区活跃
8、稳定、健壮、已经历广泛使用和验证
消费者请求调用链
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 请求处理流程
1、消费者启动时,通过spring容器加载dubbo META-INF下spring.handler文件去获取dubbo的命名空间处理工具类DubboNamespaceHandler,该类中注册了dubbo各种命名空间的解析方式DubboBeanDefinitionParser,然后通过DubboBeanDefinitionParser将配置解析处理注入到spring容器中。dubbo会为消费者中的每个service生成一个代理实现类,每个代理类都会关联一个InvocationHandler,代理上每个方法的执行都会被分发到其关联的InvocationHandler的invoke方法上。
2、消费者从容器中获取到service实例,调用方法的时候,代理调用InvokerInvocationHandler的invoke方法,默认使用failOver策略,在FailOverClusterInvoker的doInvoke方法中获取server服务的list,然后通过dubbo默认的随机负载均衡策略随机获取一台服务实例地址,并访问。调用会走过一系列的调用链,然后进入到DubboInvoker的doInvoke方法中,该方法中获取到ExchangeClient的实现类ReferenceCountExchangeClient并调用其request方法,最后进入到HeaderExchangeChannel的request方法,HeaderExchangeChannel的request方法将请求包装成一个request,发送到NettyChannel中,由NettyChannel将请求发送到服务器
dubbo和spring cloud
1、协议上,dubbo使用rpc协议,服务调用者严格依赖于服务提供方提供的service接口,要求在开发的过程中严格的进行版本管理;spring cloud使用restful的http协议,服务提供方和消费方不存在直接的依赖关系,相对来说更加灵活
2、宏观来说,dubbo专注于服务治理,并且在服务治理、灰度发布、流量分发这方面做的比 Spring Cloud 还好;spring cloud则提供了一站式的微服务解决方案,考虑到了服务治理的方方面面
3、社区活跃度上,spring cloud更新更加频繁,社区也更活跃
4、背景上,spring cloud依托于spring,spring专注于企业级开源框架的研发;dubbo是alibaba的服务化治理的核心框架,中文文档完善,但alibaba是一个商业公司,仍然以服务自身业务为主