Dubbo学习笔记(快速入门)
一、分布式基础1.1 软件架构四大演变演变顺序单体 → 垂直 → 分布式 → 微服务解释架构进化本质为了解决流量变大、代码变多、维护困难。1单体架构所有模块一个工程一个jar包全部本地调用优点简单缺点耦合严重、一处崩全崩。通俗解释所有代码写在一个项目里商城、会员、订单全部在一起打包就是一个文件。服务器挂一下网站直接瘫痪。2垂直架构按业务线拆分多个单体项目解决宕机连锁问题但是代码大量重复、无法复用。通俗解释把大项目拆成多个独立小项目比如商城系统、后台管理系统分开部署但是每个项目都要写一遍短信、文件上传工具代码重复。3分布式架构抽公共服务分为web消费层、service提供层第一次出现远程调用RPC原生调用极其麻烦。通俗解释把重复代码单独抽出来做成服务专门给别人调用两个不同项目不在同一台电脑必须网络传输也就是远程调用。4微服务架构粒度极致细化一个功能一个服务服务数量爆炸必须使用服务治理框架Dubbo/SpringCloud。通俗解释拆分到极致用户服务、订单服务、支付服务全部独立服务太多人工管不过来必须用框架治理。1.2 RPC远程调用核心原理1.2.1 什么是RPCRPC远程过程调用跨JVM、跨服务器调用方法像本地调用一样简单。通俗解释你代码看起来是调用本地方法实际上调用的是另一台电脑上的代码屏蔽网络底层。1.2.2 RPC五大核心要素客户端消费者需要调用别人服务的一方。服务端提供者提供接口、被别人调用的一方。序列化Java对象不能直接网络传输必须转成二进制字节。网络传输采用TCP长连接稳定、可靠、适合业务调用。动态代理自动生成代理类不用手写Socket、不用写网络代码。1.2.3 RPC完整调用流程消费者调用代理方法 → 序列化参数 → 网络传输 → 服务端反序列化 → 反射执行业务 → 返回结果序列化 → 消费者反序列化拿到数据。通俗逐句解释①你调用方法②把对象变成字节③通过网络发给服务端④服务端把字节变回对象⑤通过反射执行代码⑥结果再次转字节传回⑦客户端转回对象展示。1.3 Dubbo 是什么高性能 RPC 框架阿里开源用于分布式服务调用核心远程调用像本地调用一样简单解决服务拆分、跨服务通信、服务治理1.4 Dubbo整体架构五大角色Provider提供者暴露服务注册到注册中心。解释写业务代码、对外提供接口的项目。Consumer消费者订阅服务调用远程接口。解释需要使用别人接口、不写业务逻辑的项目。Registry注册中心存放服务地址ZK/Nacos。解释中介、通讯录保存所有服务在哪台服务器。Monitor监控中心统计调用次数、耗时、异常。解释日志统计工具看哪个接口慢、报错多。Container容器Spring容器启动服务。解释Dubbo依托Spring运行本身不是独立服务器。二、Dubbo环境搭建快速入门2.1 注册中心ZooKeeper2.1.1 为什么选用ZK节点临时特性、心跳检测、适合Dubbo服务注册服务下线自动删除节点。通俗解释服务挂了ZK自动检测、自动删掉失效地址不会让消费者调用死掉的服务。2.1.2 ZK存储结构根节点/dubbo → 服务名节点 → 提供者节点、消费者节点、配置节点。通俗解释树形结构类似文件夹清晰保存每一个服务信息、IP、端口。2.2 Dubbo管理控制台dubbo-admin作用可视化查看服务、禁用服务、权重调整、路由配置。解释网页后台不用敲命令肉眼查看服务状态。部署方式war包部署tomcat、jar直接启动。解释新版jar一键启动老版本war包放tomcat。页面功能服务治理、应用管理、流量管控。解释上线灰度、临时禁用坏接口全部在这里操作。2.3 第一个Dubbo入门案例2.3.1 工程拆分规范公共接口工程api存放所有服务接口、实体类。解释专门放模板提供者实现、消费者引用。提供者工程provider实现接口、暴露服务。解释干活的服务。消费者工程consumer引用接口、调用远程服务。解释请求方不实现代码2.3.2 【代码实操】依赖引入pom.xml!-- Dubbo核心依赖 -- dependency groupIdcom.alibaba/groupId artifactIddubbo/artifactId version2.6.2/version /dependency !-- Zookeeper连接依赖 -- dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.4.10/version /dependency dependency groupIdcom.github.sgroschupf/groupId artifactIdzkclient/artifactId version0.1/version /dependency2.3.3 【代码实操】公共API接口类/** * 公共服务接口api工程 * 提供者实现、消费者引用 */ public interface UserService { String sayHello(String name); }2.3.4 【代码实操】提供者实现类XML配置业务实现类public class UserServiceImpl implements UserService { Override public String sayHello(String name) { return Dubbo调用成功name; } }提供者dubbo-provider.xml配置?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://dubbo.apache.org/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd !-- 1.当前服务应用名称 -- dubbo:application namedubbo-provider/ !-- 2.注册中心地址ZK默认端口2181 -- dubbo:registry addresszookeeper://127.0.0.1:2181/ !-- 3.通信协议及端口 默认20880 -- dubbo:protocol namedubbo port20880/ !-- 4.暴露服务接口 -- dubbo:service interfacecom.lwl.service.UserService refuserService/ !-- 5.注入实现类 -- bean iduserService classcom.lwl.service.impl.UserServiceImpl/ /beans2.3.5 【代码实操】消费者XML配置调用测试消费者dubbo-consumer.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:dubbohttp://dubbo.apache.org/schema/dubbo xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd !-- 应用名称 -- dubbo:application namedubbo-consumer/ !-- 注册中心 -- dubbo:registry addresszookeeper://127.0.0.1:2181/ !-- 引用远程服务 生成代理对象 -- dubbo:reference iduserService interfacecom.lwl.service.UserService/ /beans测试启动类public class ConsumerTest { public static void main(String[] args) { ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext(dubbo-consumer.xml); UserService userService context.getBean(UserService.class); // 像本地方法一样调用远程服务 String result userService.sayHello(Dubbo快速入门学习); System.out.println(result); } }三、Dubbo高级配置大全3.1 SpringBoot整合Dubbo三种方式XML配置方式老式写法企业遗留项目多。解释早期Spring写法现在新项目不用。注解方式主流DubboService、DubboReference。解释最简单、现在企业通用。JavaConfig配置类纯代码无xml。解释大型框架底层使用。3.1.1 【代码实操】SpringBoot注解版① 提供者 application.yml 配置# 服务名称 dubbo: application: name: dubbo-boot-provider # 注册中心 registry: address: zookeeper://127.0.0.1:2181 # 通信协议 protocol: name: dubbo port: 20880 # 扫描注解包 scan: base-packages: com.lwl.service # 关闭日志冗余打印 logging: level: root: info② 消费者 application.yml 配置dubbo: application: name: dubbo-boot-consumer registry: address: zookeeper://127.0.0.1:2181 # 开发环境关闭启动检查 consumer: check: false server: port: 8080③ 提供者启动类服务实现// 提供者实现类 暴露服务 DubboService // 新版注解 暴露服务 public class UserServiceImpl implements UserService { Override public String sayHello(String name) { return SpringBootDubbo注解调用成功; } } // 启动类 EnableDubbo SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class,args); } }④ 消费者引用RestController public class UserController { // 引用远程服务 DubboReference private UserService userService; GetMapping(/hello) public String hello(){ return userService.sayHello(注解方式); } }3.2 dubbo.properties全局配置统一配置公共属性超时、重试、注册中心。解释把重复配置抽出来不用每个类写一遍。属性加载优先级从高到低①启动命令(-D) ②xml/注解配置 ③dubbo.properties。3.2.1 【代码实操】dubbo.properties全局配置文件# 应用名称 dubbo.application.namedubbo-demo # 注册中心 dubbo.registry.addresszookeeper://127.0.0.1:2181 # 全局超时 dubbo.provider.timeout3000 # 全局重试次数 dubbo.provider.retries13.3 启动检查check默认true消费者启动必须检测服务是否存在不存在启动报错。解释生产环境必须保证服务齐全。开发环境常用checkfalse避免服务未启动导致报错。解释开发时服务没写完不用卡死启动。3.3.1 【代码实操】关闭启动检查① XML写法dubbo:reference iduserService interfacecom.lwl.service.UserService checkfalse/② .properties 写法# 消费者关闭启动检查全局默认 dubbo.consumer.checkfalse3.4 超时配置timeout默认1000ms超时直接抛出异常。解释一秒没返回直接判定失败。消费者超时优先级高于提供者。解释调用方说了算防止服务端卡死。业务耗时较长必须手动加大超时时间。解释报表、导出、大数据查询必须调大时间。3.4.1 【代码实操】超时配置XML properties 双版本① XML写法消费者局部配置、优先级最高!-- 消费者设置超时5秒 -- dubbo:reference iduserService timeout5000② dubbo.properties 写法# 消费者全局超时时间 单位ms dubbo.consumer.timeout5000 # 提供者全局超时消费者没配置才生效 dubbo.provider.timeout3000优先级1、精确优先方法级优先接口级次之全局配置再次之2、消费者设置优先如果级别一样则消费方优先提供方次之3.5 重试次数retries默认重试2次加上第一次一共3次请求。解释失败自动换服务器再试。幂等接口可以重试查询、删除。解释查多少次、删多少次结果都一样不会出错。非幂等禁止重试下单、扣款防止重复下单。解释扣款重试会扣多遍钱绝对禁止。3.5.1 【代码实操】关闭重试XML properties 双版本① XML写法单个接口禁用重试dubbo:reference idpayService retries0/② dubbo.properties 全局写法统一全局重试次数# 全局重试次数 0关闭重试 dubbo.consumer.retries2 # 提供者重试配置 dubbo.provider.retries23.6 多版本version用于灰度发布、平滑升级。解释新版本怕bug先少量人测试。老版本服务不升级新版本并行运行逐步切流。解释新旧服务共存不会一次性全量更新。消费者指定版本调用互不干扰。解释A用户调用旧版、B用户调用新版。3.6.1 【代码实操】版本控制XML properties 双版本① XML写法提供者dubbo:service interfacecom.lwl.service.UserService refuserService version1.0.0/消费者指定版本dubbo:reference interfacecom.lwl.service.UserService iduserService version1.0.0/② .properties 配置# 提供者全局版本号 dubbo.provider.version1.0.0 # 消费者引用默认版本 dubbo.consumer.version1.0.0灰度发布优先XML单独指定版本properties用来统一默认版本。3.7 本地存根stub客户端前置增强在调用远程方法之前执行。解释还没发网络请求先在本地执行代码。用途参数校验、本地缓存、日志打印、权限判断。解释简单判断不用浪费网络请求。不侵入业务代码增强扩展性。解释不用改业务代码就能加功能。3.7.1 【代码实操】本地存根编写① 本地存根 Java代码public class UserServiceStub implements UserService { // 注入远程代理对象 private UserService userService; public UserServiceStub(UserService userService){ this.userService userService; } Override public String sayHello(String name) { // 本地前置校验 if(name null){ return 参数不能为空; } // 正常远程调用 return userService.sayHello(name); } }②XML配置消费者配置绑定存根类!-- stub绑定本地存根类客户端优先执行存根代码 -- dubbo:reference iduserService interfacecom.lwl.service.UserService stubcom.lwl.stub.UserServiceStub/总结1、存根必须放在消费者端提供者不需要2、必须写有参构造Dubbo自动注入远程代理3、执行顺序本地存根 → 远程调用。3.8 SpringBoot与dubbo整合的三种方式1导入dubbo-starter在application.properties配置属性使用Service【暴露服务】使用Reference【引用服务】2保留dubbo xml配置文件; 导入dubbo-starter使用ImportResource导入dubbo的配置文件即可3使用注解API的方式 将每一个组件手动创建到容器中让dubbo来扫描其他的组件 //EnableDubbo //开启基于注解的dubbo功能package com.lwl.config; import com.lwl.service.UserService; import com.lwl.service.impl.UserServiceImpl; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * P19 API编码配置方式 */ Configuration public class MyDubboConfig { /** * 1.应用配置 */ Bean public ApplicationConfig applicationConfig(){ ApplicationConfig applicationConfig new ApplicationConfig(); applicationConfig.setName(dubbo-api-provider); return applicationConfig; } /** * 2.注册中心配置 */ Bean public RegistryConfig registryConfig(){ RegistryConfig registryConfig new RegistryConfig(); registryConfig.setAddress(zookeeper://127.0.0.1:2181); return registryConfig; } /** * 3.手动暴露服务 */ Bean public ServiceConfigUserService serviceConfig(UserService userService){ ServiceConfigUserService serviceConfig new ServiceConfig(); // 设置接口 serviceConfig.setInterface(UserService.class); // 设置实现类 serviceConfig.setRef(userService); // 设置版本 serviceConfig.setVersion(1.0.0); // 方法级配置 ListMethodConfig methods new ArrayListMethodConfig(); MethodConfig method new MethodConfig(); method.setName(sayHello); method.setTimeout(10000); method.setRetries(0); methods.add(method); serviceConfig.setMethods(methods); return serviceConfig; } }四、Dubbo高可用机制4.1 ZK宕机故障转移注册中心宕机消费者本地缓存服务列表不影响正常调用。通俗解释消费者把服务地址存在本地内存ZK崩了照样干活。ZK恢复后自动重新同步服务。解释重启ZK后自动更新最新服务列表。直连模式开发调试直接指定提供者IP绕过注册中心。解释开发阶段不用启动ZK直接写死IP调试。4.1.1 【代码实操】直连模式!-- 绕过ZK 直连指定服务地址 -- dubbo:reference iduserService interfacecom.lwl.service.UserService urldubbo://127.0.0.1:20880/Reference(url127.0.0.1:20880) UserService userService;4.2 四大负载均衡策略4.2.1 Random随机默认随机挑选节点简单高效生产默认。解释压力分配均匀、不会集中压在一台服务器。4.2.2 RoundRobin轮询依次轮流调用适合性能一致服务器。解释1号、2号、3号轮流请求服务器配置一样时使用。4.2.3 LeastActive最少活跃优先调用耗时低、并发少的节点自动避开慢节点。解释哪台服务器轻松就去哪台自动规避卡顿机器。4.2.4 ConsistentHash一致性哈希相同参数永远访问同一节点会话保持、缓存命中高。解释同一个用户永远访问同一台服务缓存不会失效。4.2.5 【代码实操】修改负载均衡策略!-- 改为轮询负载均衡 -- dubbo:reference iduserService interfacecom.lwl.service.UserService loadbalanceroundrobin/Reference(loadbalanceroundrobin) UserService userService;4.3 服务降级Mock失败降级调用失败触发本地mock返回兜底数据。解释服务崩了返回写死的默认数据页面不报错。强制降级直接禁用远程服务全部走本地mock。解释高峰期直接关掉非核心服务保住主业务。场景流量洪峰、服务宕机、非核心业务降级保主流程。通俗解释双十一限流把公告、积分关掉保住下单付款。4.4 集群容错模式4.4.1 Failover失败重试默认失败自动换节点重试适合幂等查询接口。解释查数据失败换一台重试最常用、默认模式。4.4.2 Failfast快速失败只调用一次失败直接报错适合下单扣款非幂等接口。解释支付不能重试失败直接抛异常。4.4.3 Failsafe安全失败失败不报错、返回空用于日志、统计无关紧要接口。解释错了也不影响主业务不用报错。4.4.4 Failback失败通知失败后台异步重试用于消息推送、通知类业务。解释发短信失败后台慢慢重试不用用户等待。4.4.5 Forking并行调用同时调用多个节点取最快返回高可用、耗资源。解释同时请求3台服务器谁快用谁适合金融高可靠业务。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2630999.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!