Dubbo和入门实践
简介微服务架构HTTP RPC的Apache Dubbo是一款高性能的RPC远程过程调用服务开发框架主要用于解决微服务架构下的服务治理与通信问题。例如两台服务器A和BA服务器上部署一个应用B服务器上部署一个应用A服务器上的应用调用B服务器上的应用提供的方法由于两个应用不在同一个内存空间不能直接调用所以需要通过网络表达调用的语义和传达调用的数据。因此不同的应用需要定义、暴露或调用RPC服务这些RPC服务如何定义如何与应用开发框架结合服务调用行为如何控制这就是Dubbo服务开发框架的意义Dubbo在微服务应用开发框架之上抽象了一套RPC服务定义暴露调用与治理的编程范式例如Dubbo Java作为服务开发框架当运行在Spring 体系时就是构建在Spring Boot应用开发框架之上的微服务开发框架并在此之上抽象了一套RPC服务定义暴露调用与治理的编程范式。RPC是一个泛化的概念严格来说一切远程过程调用手段都属于RPC范畴 各种开发语言都有自己的RPC框架java中常用的有RMI, Hessian, Dubbo等Dubbo从设计上不绑定任何一款特定通信协议HTTp/2, REST gRPC, JsonRPC, Thrift, Hessian2等几乎所有主流的通信协议Dubbo框架都可以提供支持。目前最新的Dubbo3架构针对云原生时代进行了全面升级。提供了构建微服务的一站式解决方案。提供了三大核心能力使开发者能够专注于业务逻辑开发面向接口的高性能RPC调用提供基于代理的远程调用能力支持同步异步流式等多种通信模型屏蔽了底层网络通信和序列化细节。智能负载均衡与容灾内置多种负载均衡策略能够智能感知下游节点健康状况支持请求重试、超时处理、流量降级等容错机制提高系统吞吐量。服务自动注册与发现提供Client-Based的服务发现机制服务实例的上下线能够被实时感知支持对接Nacos, Zookeeper, Consul, Kubernetes等多种注册中心Dubbo的工作原理图四个核心组件Provider服务提供者保录服务接口向注册中心注册自己的服务地址Consumer服务消费者从注册中心获取服务提供者地址列表并根据负载均衡算法直接发起RPC调用Registry注册中心作为目录服务负责服务地址的注册与查找并在服务提供者宕机时推送事件通知消费者Monitor监控中心统计各服务的调用次数调用时间等指标用于运维监控除了基础的RPC通信Dubbo还具备强大的微服务治理能力流量管控支持运行期动态下发路由策略实现灰度发布A/B测试同机房优先等复杂流量调度场景高度可扩展性可视化运维Admin控制台提供了Dubbo集群的可视化视图通过Admin可以完成集群的几乎所有管控工作。云原生与多语言支持提供多语言SDK其中Java和Go版本最为成熟。云原生适配原生支持部署在容器和Kubernetes平台引入了Proxyless Mesh架构简化了Service Mesh的落地脚本。不是 Spring 的替代品Dubbo 专注于 RPC 和服务治理它可以无缝集成 Spring/Spring Boot两者是互补关系。不仅仅是 RPC 框架虽然以 RPC 通信为基础但它更是一个包含服务发现、流量调度等丰富治理能力的微服务综合解决方案。不是 gRPC 的替代品Dubbo 支持将 gRPC 作为底层通信协议使用 Dubbo 可以获得统一的编程模型和更低的服务治理接入成本。此外还需要区分Dubbo与gRPC, Spring Cloud, Istio关系。示例在Java中使用Dubbo最主流且推荐的方式是结合SpringBoot进行开发代码低侵入性配置简单直观。Dubbo3 Spring Boot 3 JDK17/21成为主流组合Nacos已基本替代Zookeeper成为国内最常见的注册中心同时兼具配置中心能力。Dubbo3默认采用Tripe协议兼容gRPC性能和跨语言能力更好企业中通常会配合Sentinel, Seata, SkyWalking, Prometheus等完成服务治理。主要包含四个步骤1 定义服务接口首先需要定义一个标准的Java接口作为Dubbo服务在实际工程中这个借口通常会被单独打包例如dubbo-demo-api以便服务提供方和消费方共同依赖。项目结构**dubbo-demo-parent ├── dubbo-demo-api ├── dubbo-demo-provider └── dubbo-demo-consumer**接口定义示例publicinterfaceDemoService{StringsayHello(Stringname);}2 开发服务提供方Provider在当前服务提供方上实现上述服务接口并使用DubboService注解将其暴璐为Dubbo服务。DubboServicepublicclassDemoServiceImplimplementsDemoService{OverridepublicStringsayHello(Stringname){returnHello name, response from provider.;}}企业开发中通常会配置version服务版本group服务分组timeoutRPC超时时间retries失败重试次数loadbalance负载均衡策略cluster集群容错策略例如DubboService(versionv1,timeout5000,retries0,loadbalanceleastactive)同时需要在配置文件中配置应用名称通信协议及注册中心例如dubbo:application:name:dubbo-demo-providerprotocol:name:dubboport:-1registry:address:zookeeper://127.0.0.1:2183使用Nacos作为注册中心dubbo:application:name:dubbo-providerprotocol:name:triport:50051registry:address:nacos://127.0.0.1:8848config-center:address:nacos://127.0.0.1:8848metadata-report:address:nacos://127.0.0.1:8848nacos一个组件即可完成Registry服务注册发现Config Center统一配置管理MetaData服务元数据管理3 开发服务消费方Consumer消费方通过Maven/Gradle引入服务接口依赖并使用DubboReference注解注入远程服务实例ServicepublicclassConsumerService{DubboReference(version1.0.0,groupdefault,timeout3000,checkfalse)privateDemoServicedemoService;publicStringhello(Stringname){returndemoService.sayHello(name);}}这里的常见参数说明check false表明provider未启动时允许consumer启动timeout超时时间version服务版本group服务分组retries重试次数lazy延迟初始化消费方的配置文件中同样需要配置应用名称和注册中心地址以便从注册中心获取服务提供者的地址列表dubbo:application:name:dubbo-consumerregistry:address:nacos://127.0.0.1:8848config-center:address:nacos://127.0.0.1:8848Consumer 不需要配置协议端口。启动后会自动从 Nacos 获取 Provider 列表建立长连接本地缓存服务地址自动负载均衡调用整个 RPC 调用过程对业务代码完全透明。4 启动应用分别启动provider和consumer的spring boot主程序即可Dubbo框架会在底层自动完成服务的注册发现以及RPC通信对业务代码完全透明。Dubbo底层调用流程Consumer │ │ DubboReference ▼ 生成代理对象Proxy │ ▼ Invoker │ ▼ ClusterFailFast / FailOver │ ▼ LoadBalance │ ▼ Directory │ ▼ RegistryNacos │ ▼ Provider