
学习网址https://www.bilibili.com/video/BV1ns411c7jV/?vd_source461545ff50a35eaeaa8218ecdc5f7152时长4小时17分钟从分布式系统的基本概念出发由浅入深记录了RPC原理Dubbo基本使用Dubbo高可用场景以及Dubbo原理涉及了分布式系统中服务注册、服务发现、负载均衡、灰度发布、集群容错、服务降级等核心概念的讲解及演示。1.概念-分布式系统定义什么是分布式系统《分布式系统原理与范型》定义“分布式系统是若干独立计算机的集合这些计算机对于用户来说就像单个相关系统”分布式系统distributed system是建立在网络之上的软件系统。随着互联网的发展网站应用的规模不断扩大常规的垂直应用架构已无法应对分布式服务架构以及流动计算架构势在必行亟需一个治理系统确保架构有条不紊的演进。Apache Dubbo 是一款高性能、开源的 分布式服务框架最初由阿里巴巴于 2008 年开发并开源后于 2017 年成为 Apache 顶级项目。它专注于解决微服务架构中的 通信与服务治理 问题提供了一套完整的 RPC远程过程调用解决方案支持多语言、高扩展性和云原生适配广泛应用于企业级大规模微服务实践核心功能与特性高性能 RPC 通信Dubbo 支持多种通信协议如 HTTP/2、TCP、gRPC并通过长连接、NIO 异步通信和二进制数据压缩优化性能。例如阿里巴巴内部曾实现单机每日近 1 亿次调用。服务发现与注册通过注册中心如 Nacos、Zookeeper动态管理服务地址支持 Kubernetes 原生集成。流量管控提供负载均衡随机、轮询等、路由规则灰度发布、同区域优先、容错机制重试、降级等。动态配置运行时调整超时时间、权重等策略无需重启服务。2.概念-应用的架构演变单一应用架构当网站流量很小时只需一个应用将所有功能都部署在一起以减少部署节点和成本。此时用于简化增删改查工作量的数据访问框架(ORM)是关键。适用于小型网站小型管理系统将所有功能都部署到一个功能里简单易用。缺点1、性能扩展比较难需要对整个应用重新打包重新部署2、协同开发问题3、不利于升级维护垂直应用架构当访问量逐渐增大单一应用增加机器带来的加速度越来越小将应用拆成互不相干的几个应用以提升效率。此时用于加速前端页面开发的Web框架(MVC)是关键。通过切分业务来实现各个模块独立部署降低了维护和部署的难度团队各司其职更易管理性能扩展也更方便更有针对性。缺点1、公用模块无法重复利用开发性的浪费2、界面业务逻辑的实现分离3、应用不可能完全独立大量的应用之间需要交互分布式服务架构当垂直应用越来越多应用之间交互不可避免将核心业务抽取出来作为独立的服务逐渐形成稳定的服务中心使前端应用能更快速的响应多变的市场需求。此时用于提高业务复用及整合的分布式服务框架(RPC)是关键。RPC远程过程调用流动计算架构当服务越来越多容量的评估小服务资源的浪费等问题逐渐显现此时需增加一个调度中心基于访问压力实时管理集群容量提高集群利用率。此时用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。3.概念-RPC简介什么叫RPCRPC【Remote Procedure Call】是指远程过程调用是一种进程间通信方式他是一种技术的思想而不是规范。它允许程序调用另一个地址空间通常是共享网络的另一台机器上的过程或函数而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数本质上编写的调用代码基本相同。RPC基本原理RPC两个核心模块通讯序列化。影响性能的因素1.RPC框架能否快速的在服务器之间建立起链接2.序列化与反序列化机制速度快不快4.概念-简介Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架它提供了三大核心能力面向接口的远程方法调用智能容错和负载均衡以及服务自动注册和发现。官网http://dubbo.apache.org/5.Dubbo 与 Spring Cloud 对比简单来说Dubbo 是一款“高性能的 RPC 远程调用框架”核心聚焦服务间通信而 Spring Cloud 是一套“完整的微服务生态体系”覆盖微服务全生命周期。两者都用于微服务但定位、设计理念和生态完全不同。1.核心区别对比维度DubboSpring Cloud核心定位高性能 RPC 框架主打服务调用微服务一站式解决方案生态核心协议基于 Dubbo 协议TCP 私有协议基于 HTTP 协议RESTful功能覆盖核心服务注册/发现、RPC 调用、负载均衡其他功能需整合第三方全覆盖注册/配置中心、熔断、网关、链路追踪、分布式配置等生态依赖轻量可搭配 ZK/Nacos/etcd 等强依赖 Spring 生态Spring Boot组件多且统一性能高TCP 长连接二进制传输稍弱HTTP 短连接文本传输易用性早期配置复杂新版本3.x已简化开箱即用约定大于配置学习成本低适用场景高性能内网服务调用、单体拆微服务、Dubbo 老项目迭代互联网分布式系统、跨语言/跨平台调用、完整微服务体系建设2.通俗理解可以把微服务架构想象成一个“公司”Dubbo像公司里的“快递员”——只负责把一个部门的东西服务请求高效送到另一个部门速度快、效率高但不管其他事比如考勤、财务、行政。Spring Cloud像公司的“全套行政体系”——不仅有快递员服务调用还有考勤熔断降级、财务配置中心、前台网关、监控链路追踪等覆盖公司运营全流程。3.实际使用示例极简代码1. Dubbo 核心调用Spring Boot 整合服务提供方// 1. 定义服务接口publicinterfaceUserService{StringgetUserById(Longid);}// 2. 实现接口并暴露服务DubboService// Dubbo 注解暴露服务publicclassUserServiceImplimplementsUserService{OverridepublicStringgetUserById(Longid){return用户id张三;}}服务消费方RestControllerpublicclassOrderController{// Dubbo 注解引用远程服务DubboReferenceprivateUserServiceuserService;GetMapping(/order/{id})publicStringgetOrder(PathVariableLongid){// 直接调用远程服务像调用本地方法StringuserNameuserService.getUserById(id);return订单关联用户userName;}}2. Spring Cloud 核心调用基于 OpenFeign服务提供方RestControllerpublicclassUserController{GetMapping(/user/{id})publicStringgetUserById(PathVariableLongid){return用户id张三;}}服务消费方// 1. 定义 Feign 接口HTTP 声明式调用FeignClient(user-service)// 指向服务名publicinterfaceUserFeignClient{GetMapping(/user/{id})StringgetUserById(PathVariableLongid);}// 2. 调用远程服务RestControllerpublicclassOrderController{AutowiredprivateUserFeignClientuserFeignClient;GetMapping(/order/{id})publicStringgetOrder(PathVariableLongid){// 通过 HTTP 调用远程服务StringuserNameuserFeignClient.getUserById(id);return订单关联用户userName;}}4.选择建议如果你的系统追求极致性能比如电商交易、金融核心系统且主要是内网服务调用 → 选 Dubbo3.x 版本已兼容 Spring Cloud。如果你的系统需要完整的微服务能力熔断、网关、链路追踪等且想快速落地 → 选 Spring Cloud。现在主流方案Dubbo Spring Cloud 混合使用用 Dubbo 做高性能 RPC 调用用 Spring Cloud 组件做熔断、网关等。5.总结核心定位Dubbo 是“专精 RPC 调用”的工具Spring Cloud 是“覆盖微服务全流程”的生态。性能与易用性Dubbo 性能更高Spring Cloud 更易用、功能更全。选型思路看需求——只需要高效服务调用选 Dubbo需要完整微服务体系选 Spring Cloud也可混合使用。5.概念-设计架构基本概念服务提供者Provider暴露服务的服务提供方服务提供者在启动时向注册中心Nacos、zookeeper注册自己提供的服务。注册中心Registry注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者服务消费者Consumer: 调用远程服务的服务消费方服务消费者在启动时向注册中心订阅自己所需的服务服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。监控中心Monitor服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心调用关系说明服务容器负责启动加载运行服务提供者。服务提供者在启动时向注册中心注册自己提供的服务。服务消费者在启动时向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者如果有变更注册中心将基于长连接推送变更数据给消费者。服务消费者从提供者地址列表中基于软负载均衡算法选一台提供者进行调用如果调用失败再选另一台调用。服务消费者和提供者在内存中累计调用次数和调用时间定时每分钟发送一次统计数据到监控中心。6.环境搭建-Zookeeper注册中心windows安装zookeeper1、下载zookeeper网址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/2、解压zookeeper解压运行zkServer.cmd 初次运行会报错没有zoo.cfg配置文件3、修改zoo.cfg配置文件将conf下的zoo_sample.cfg复制一份改名为zoo.cfg即可。注意几个重要位置修改完成后再次启动zookeeper#临时数据存储的目录可写相对路径dataDir./#zookeeper的端口号clientPort21814、使用zkCli.cmd测试ls /列出zookeeper根下保存的所有节点create –e /atguigu 123创建一个atguigu节点值为123get /atguigu获取/atguigu节点的值7.环境搭建-Dubbo管理控制台windows安装dubbo-admin管理控制台dubbo本身并不是一个服务软件。它其实就是一个jar包能够帮你的java程序连接到zookeeper并利用zookeeper消费、提供服务。所以你不用在Linux上启动什么dubbo服务。但是为了让用户更好的管理监控众多的dubbo服务官方提供了一个可视化的监控程序不过这个监控即使不装也不影响使用。1、下载dubbo-adminhttps://github.com/apache/incubator-dubbo-ops2、进入目录修改dubbo-admin配置修改 src\main\resources\application.properties 指定zookeeper地址spring.guest.passwordguestdubbo.registry.addresszookeeper://127.0.0.1:21813、打包dubbo-adminmvn clean package-Dmaven.test.skiptrue4、运行dubbo-adminjava -jar dubbo-admin-0.0.1-SNAPSHOT.jar注意【有可能控制台看着启动了但是网页打不开需要在控制台按下ctrlc即可】默认使用root/root 登陆8.环境搭建-创建提供消费者工程提出需求某个电商系统订单服务需要调用用户服务获取某个用户的所有地址我们现在需要创建两个服务模块进行测试订单服务web模块创建订单等用户服务service模块查询用户地址等测试预期结果订单服务web模块在A服务器用户服务模块在B服务器A可以远程调用B的功能。9.服务提供者配置测试10.服务消费者配置测试