详细Dubbo 微服务+zookeeper分享,一看就懂(附实例代码)
目录
一、dubbo 简要概念
二、使用dubbo 准备
三、dubbo 微服务调用搭建
四、 dubbo与springCloud 对比
五、相关附件
源码实例:https://files.cnblogs.com/files/liyanbofly/hualaladubbo.rar?t=1658644883
一、dubbo 简要概念
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Container:服务运行容器 dubbo启动服务之容器(Container)_cjrjc的博客-CSDN博客_dubbo的container
Monitor:用来统计服务的调⽤次数和调⽤时间的监控中⼼。Dubbo-monitor简单介绍 - 简书 (jianshu.com)
二、使用dubbo 准备
2.1、Zookeper 按装
将conf下的zoo_sample.cfg复制一份改名为zoo.cfg即可。
注意几个重要位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeper的端口号
修改完成后再次启动zookeeper
2.2、Zookeeper常用指令及问题
./zkServer.sh start 启动zookeeper
./zkCli.sh
./zkServer.sh status (查看状态)
./zkServer.sh stop (关闭)
./zkServer.sh start-foreground (以打印日志方式启动)
2.3 当zookeeper不能启动问题查看 zoo.cfg
tmp/zookeeper/log
tmp/zookeeper/data
两个目录是否存在 如果不存在需要创建
2.4 下载dubbo-admin 并按装用于监控和设置服务提供者、消费者; 需打包按装
下载地址:https://github.com/apache/dubbo-admin/tree/master
修改配置文件:dubbo.registry.address=zookeeper://192.168.88.129:2181 (zookeeper按装服务器地址)
打包并java -jar xxxx.jar按装部署 (-D 设置相关虚拟机参数)
Localhost:7001 访问 用户名:root 密码:root
三、dubbo 微服务调用搭建
1)、概述:Dubbo 实例分为三部分
1.1接口模块 :为提供者服务和消费者服务提供接口定义
1.2提供者服务 :hulaladubbo-customer服务提供实现供消费者供使用
1.3消费者服务:hulaladubbo-order服务,提供订单服务并调用 hulaladubbo-customer服务
2)、搭建例:
pom文件节点说明
1、 Zookeeper :用于注册中心使用 2、 dubbo-spring-boot-starter :dubbo核心功能 3、 curator-recipes:curator-recipes丰富了zookeeper应用场景的使用api封装 、curator-framework、curator-x-discovery 服务与zookeeper注册及其它功能实现 4、spring-cloud-starter-netflix-hystrix : 熔段降级方法 |
3)、dubbo相关特性说明
duboo 超时参数设置 、重试参数 、负载均衡、降级方法
3.1 超时参数设置 、重试参数
@DubboReference(timeout = 1000):设置请求服务超时间,超过时间就会抛异常
@DubboReference(timeout = 1000,retries = 2): 重试次数,不包括第一次请求,如retries = 2,会请求3次
@DubboReference(timeout = 1000,retries = 3):
重试次数设置需考虑 幂等性接口和非幂等接口
3.2 负载均衡
@DubboReference(loadbalance = LoadbalanceRules.ROUND_ROBIN):
loadbalance 负载均衡策略:
1)、Random LoadBalance(随机,按照权重的设置随机概率)-- 默认
2)、RoundRobinLoadBalance(轮询,按照权重设置轮询比率)
3)、LeastActive LoadBalance(最少活跃数,响应快的提供者接受越多请求,响应慢的接受越少请求)
4)、ConsistentHashLoadBalance(一致性Hash,相同参数的请求总是发到同一个服务提供者(相同参数默认是指请求的第一个参数)根据服务提供者ip设置hash环,携带相同的参数总是发送的同一个服务提供者,若服务挂了,则会基于虚拟节点平摊到其他提供者上
3.3熔段降级
1)加 pom节点:spring-cloud-starter-netflix-hystrix
2)启动主类加@EnableHystrix
3)加指定降级方法
@HystrixCommand(fallbackMethod = "failFallBack")
@Override
public ResultVo<String> saveOrder(Orders orders) {
}
failFallBack 方法参数要与作用在saveOrder方法的参数和返回值相同
如:
/**
* 降级方法处理
* @param orders
* @return
*/
public ResultVo<String> failFallBack(Orders orders) {
}
3.4 cluster参数:集群容错)
可选方式 failover/failfast/failsafe/failback/forking
Failover Cluster(默认)
失败自动切换,当出现失败,重试其它服务器 。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
3.5 相关配置也可以在application.yml 文件全局配置如下
# provider:
# timeout: #全局设置超时时间
# retries: #全局设置重试次数
# loadbalance: #全局设置负载均衡侧率
ps:参数优先级
方法级优先,接口级次之,全局配置再次之。
如果级别一样,则消费方优先,提供方次之。
四、 dubbo与springCloud 对比
1)通信方式不同
Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合以Hession序列化完成RPC通信。而SpringCloud是基于Http协议+rest接口调用远程过程的通信,相对来说,Http请求会有更大的报文,占的带宽也会更多。
2、产生背景不同
Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理
Spring Cloud 是微服务产务,SpirngCloud 定位为微服务架构下的一站式解决方案
3、组件不同
五 总结概述
1、使用 zookeeper 做为注册中心
dubbo 定义接口模块
provider:实现接口模块中接口类
cosumer:消费者 利用接口直接注入服务,后直接使用
关键
2、
dubborefrence
timeout:超时时间
retries:重复调用次数
loadbalance:负载均衡 随机(默认)、轮询、加权、hash
2、HystrixCommand 熔段降级处理 相应记录,后结可做补偿方法处理。
演示操作
1、演示 超时重试
查看控制台报错信息
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: Failed to invoke the method getCustomerById in the service com.hualala.api.ICustomerService. Tried 4 times of the providers [192.168.88.1:20884] (1/1) from the registry 192.168.88.129:2181 on the consumer 192.168.88.1 using the dubbo version 3.0.6. Last error is: Invoke remote method timeout. method: getCustomerById, provider: DefaultServiceInstance{serviceName='dubbo-customer3', host='192.168.88.1', port=20884, enabled=true, healthy=true, metadata={dubbo.endpoints=[{"port":20884,"protocol":"dubbo"}], dubbo.metadata-service.url-params={"connections":"1","version":"1.0.0","dubbo":"2.0.2","release":"3.0.6","port":"20884","protocol":"dubbo"}, dubbo.metadata.revision=caa4fc8f190d1f203610a9f4d3e3193d, dubbo.metadata.storage-type=local}},
2、演示order服务调用 customer服务 内部负载均衡
1)启动多个 customer服务,如果报错查看 第二个customer服务 dubboport 是否修改
2)刷新:localhost:8083/saveOrder ,查看custName,端口改变
3、Hystrix 降级方法执行
刷新:localhost:8083/saveOrder,查看返回结果及降级方法结果
执行结果:{"code":555,"msg":"我是降级方法","Data":null,"data":null}
4、cluster:集群容错
1)Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
@DubboReference(timeout = 1000,cluster = "failfast")
2) 查看返回报错信息没有
Tried 4 times 相关重试请求