详细Dubbo 微服务+zookeeper分享,一看就懂(附实例代码)

目录

 一、dubbo 简要概念

二、使用dubbo 准备

三、dubbo 微服务调用搭建

四、 dubbo与springCloud 对比

五、相关附件

源码实例:https://files.cnblogs.com/files/liyanbofly/hualaladubbo.rar?t=1658644883

一、dubbo 简要概念

Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

官网地址:http://dubbo.apache.org/

 

 

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、演示 超时重试

访问:localhost:8083/saveOrder

 查看控制台报错信息

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 相关重试请求

posted @ 2022-07-24 14:36  xiaoBai1001  阅读(755)  评论(0编辑  收藏  举报