Dubbo用法示例

1.version版本控制

        比如我们现在有两个服务提供者,他们分别对这个接口的实现方式不一样,那么消费者通过代理对象到底调用哪个实现呢,这就可以通过version版本控制来实现,@Reference注解的version和@Service注解的version需要配对,如下:

//服务提供者1
@Service(version = "special")
public class SiteServiceImpl implements SiteService {

    @Override
    public String test(String s) {
        return "王佳和"+s;
    }
}

//服务提供者2
@Service(version = "default")
public class SiteServiceImpl1 implements SiteService {

    @Override
    public String test(String s) {
        return "王佳和1"+s;
    }
}
//消费者
@RestController
@RequestMapping("/site")
public class SiteController {

    @Reference(version = "default")
    SiteService siteService;

    @GetMapping("/test")
    public  String test(@RequestParam(value = "name") String name){
        return siteService.test(name);
    }
}

2.protocol协议用法

        我们不一定非得用dubbo协议,可以在yml中定义多个protocal对象,每一个protocal再定义一个id,然后每一个服务提供者可以声明protocal属性,指定这个服务提供者使用的是什么协议。

dubbo:
  application:
    name: site-service-provider
  registry:
    address: zookeeper://192.168.197.200:2181
  protocols:
    protocol1.id: pro1
    protocol1.name: dubbo
    protocol1.port: 20881
    protocol1.host: 0.0.0.0

    protocol2.id: pro2
    protocol2.name: dubbo
    protocol2.port: 20882
    protocol2.host: 0.0.0.0
    
    protocol3.id: pro3
    protocol3.name: dubbo
    protocol3.port: 20883
    protocol3.host: 0.0.0.0
#  protocol:
#    name: dubbo
#    port: 20882.
//在暴露服务时指明要使用的协议
@Service(version = "special",protocol = "protocol1")
public class SiteServiceImpl implements SiteService {

    @Override
    public String test(String s) {
        return "王佳和"+s;
    }

        如果配置了多个协议,但是@Service注解中没有设置protocol属性,那么每一个协议都会起作用,会为此服务提供者创建多个服务入口,这样的话多个服务提供者可能每一个服务都有多个入口,这些入口间端口使用不会冲突的,可以理解为每一个服务都会被分配一个ip地址,服务之间都是隔离的,意思就是192.168.145.1:20221和192.168.145.2:20221不冲突。

3.使用URL指定服务提供者

        针对一个服务提供者有多个协议这种情况,消费者到底调用哪一个呢?可以使用URL来指定服务提供者。

4.服务超时

        服务超时timeout可以在消费者@Reference上面配置,也可以在服务提供者@Service上面进行配置。

        如果只在服务提供者上面配置超时时间的话,比如配置2秒,整体调用过程需要3秒,如果超时了,会记录错误日志,消费者方会超时报错,但是提供方依旧会向下执行,并且会重试调用两次。

        如果在消费者和服务提供者上面都配置了超时时间,比如消费者配置超时时间5秒,服务提供者配置超时时间2秒,整体调用过程需要3秒,调用过程时间超过了消费者上配置的时间后,消费者方才会超时报错,服务提供者上的超时时间只做日志记录用。

 @Reference(version = "version1",timeout = 5000) //消费者上配置
 @Service(version = "version1",protocol = "protocol1",timeout = 2000) //服务提供者上配置

5.集群容错

  • failover(默认):当出现失败时,会进行重试,默认重试两次,并且可以使用分布式锁来解决幂等问题。

  • failfast:当出现失败时,立即报错,不进行重试。

  • failsafe:失败不报错,记入日志。

  • failback:失败就失败,开启定时任务,定时重发。

  • forking:并行访问多个服务器,获取某一个结果即视为成功。

6.服务降级MOCK的使用

消费者通过mock参数可以实现服务降级,降级分为两种:

  • mock = force:return 返回数据,表示消费方对该服务的方法调用都直接返回对应的返回数据根本不发起远程调用,用来屏蔽不重要的服务。

  • mock=fail:return 返回数据,表示消费方对该服务的方法调用失败或超时后,再返回对应的返回数据,不抛出异常,用来容忍不重要的服务不稳定时对调用方的影响。

@Reference(version = "version1",timeout = 1000,mock = "fail:return timeout")
@Reference(version = "version2",timeout = 1000,mock = "force:return mocktest")

7.本地存根

本地存根其实也是降级的一种,就是在消费者端利用stub进行类似代理的降级。

@RestController
@RequestMapping("/stubsite")
public class StubSiteController {

    @Reference(version = "version2",timeout = 1000,stub = "true")
    SiteService siteService;

    @GetMapping("/test")
    public  String test(@RequestParam(value = "name") String name){
        return siteService.test(name); //实际调用的是SiteServiceStub中的test方法
    }
}
//要与SiteService接口同级
public class SiteServiceStub implements SiteService {

    private final SiteService siteService;

    public SiteServiceStub(SiteService siteService) {
        this.siteService = siteService;
    }

    @Override
    public String test(String s) {
        try {
            return siteService.test(s);
        }catch (Exception e){
            return "stub"+s;
        }
    }
}

8.异步调用

是靠CompletetableFuture实现的,实现异步计算。

// api-interface
public interface SiteService {
    String test(String s);

    default CompletableFuture<String> testAsync(String s) {
        return null;
    }
}
// 服务提供者
@Service(version = "async")
public class ASyncSiteServiceImpl implements SiteService {
    @Override
    public String test(String s) {
        return "计算的结果为:5235465";
    }

    @Override
    public CompletableFuture<String> testAsync(String s) {
        System.out.println("现在正在异步计算结果。。。");
        return CompletableFuture.supplyAsync(()->{
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return test(s);
        });
    }
}
// 服务消费者
@RestController
@RequestMapping("/asyncsite")
public class AsyncSiteController {

    @Reference(version = "async")
    private SiteService siteService;

    @GetMapping("/asynctest")
    public  String test(@RequestParam(value = "name") String name) throws InterruptedException {
        //设置异步调用
        CompletableFuture<String> future = siteService.testAsync(name);
        //设置监听,回调方法,非阻塞
        future.whenComplete((v, e) -> {
            if(e == null){
                System.out.println("返回的结果是:"+v);
            }else {
                e.printStackTrace();
            }
        });
        System.out.println("可以先执行之后的事情1");
        System.out.println("可以先执行之后的事情2");
        System.out.println("可以先执行之后的事情3");
        Thread.sleep(1000);
        return "success:这是一次成功的异步调用测试";
    }
}

执行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767642.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用MATLAB批量读取图像时出现名称排序错乱问题解决方法sort-nat函数

利用MATLAB批量读取图像时出现名称排序错乱问题解决方法sort-nat函数 一、问题描述二、解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 使用MATLAB批量读取图像文件&#xff0c;会发现提取出…

华为交换机基本命令配置(创建vlan、配置telnet登录)

<HUAWEI>system-view 进入系统视图 [HUAWEI]sysname SW1 交换机命名为SW1 [SW1]undo info-center enable 关闭消息中心 [SW1]quit 退出当前视图 <SW1>display vlan 查看vlan详情 <SW1>system-view 进入系统视图 [SW1]vlan 5 …

OpenSSL EVP详解

OpenSSL EVP详解 Chapter1 OpenSSL EVP详解一、EVP基本介绍1. EVP 加密和解密2. EVP 签名和验证3. EVP 加解密文件 二、源码结构2.1 全局函数2.2 BIO扩充2.3 摘要算法EVP封装2.4 对称算法EVP封装2.5 非对称算法EVP封装2.6 基于口令的加密 三、开发实例3.1 示例13.2 示例23.3 示…

Maya崩溃闪退常见原因及解决方案

Autodesk Maya 是一款功能强大的 3D 计算机图形程序&#xff0c;被电影、游戏和建筑等各个领域的设计师广泛使用。然而&#xff0c;Maya 就像任何其他软件一样可能会发生崩溃问题。在前文中&#xff0c;小编给大家介绍了3ds Max使用V-Ray渲染时的崩溃闪退解决方案&#xff1a; …

Xilinx FPGA:vivado关于单端ROM的一个只读小实验

一、实验要求 将生成好的voe文件里的数据使用rom读取出来&#xff0c;采用串口工具发送给电脑&#xff08;当按键来临时&#xff09;。 二、程序设计 按键消抖模块&#xff1a; timescale 1ns / 1ps module key_debounce(input sys_clk ,input rst_n…

vcruntime140_1.dll下载——修复vcruntime140_1.dll方法解析

vcruntime140_1.dll 是 Microsoft Visual C Redistributable 中的一个重要动态链接库文件。它在许多应用程序的正常运行中起着关键作用。然而&#xff0c;有时用户可能会遇到 vcruntime140_1.dll 丢失或损坏的情况&#xff0c;导致相关程序无法启动。在这种情况下&#xff0c;下…

代码随想录-二叉搜索树①

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 98. 验证二叉搜索树 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 530. 二叉搜索树的最小绝对差 题目描述&#x…

Windows Server 2008近源应急OS-1

前景需要&#xff1a;小王从某安全大厂被优化掉后&#xff0c;来到了某私立小学当起了计算机老师。某一天上课的时候&#xff0c;发现鼠标在自己动弹&#xff0c;又发现除了某台电脑&#xff0c;其他电脑连不上网络。感觉肯定有学生捣乱&#xff0c;于是开启了应急。 我们需要…

第三方软件测试公司分享:软件渗透测试的测试内容和注意事项

软件渗透测试是一种通过模拟攻击的方式来评估软件系统的安全性和漏洞&#xff0c;以发现并修复系统中的安全弱点。保护用户的数据和信息不被恶意攻击者利用&#xff0c;也是软件产品开发流程中重要的环节&#xff0c;可以帮助开发团队完善产品质量&#xff0c;提高用户满意度。…

VSG虚拟同步发电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 VSG虚拟同步发电机simulink建模与仿真&#xff0c;虚拟同步发电机&#xff08;Virtual Synchronous Generator, VSG&#xff09;技术是电力电子领域的一项重要创新&#xff0c…

Modbus RTU协议简介即CRC算法实现

目录 1 Modbus 介绍2 Modbus RTU协议传输方式2.1 地址码2.2 功能码2.3 数据码2.4 校验码 3 CRC算法实现2.1 代码3.2 运行结果 1 Modbus 介绍 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编…

2024 6G无线通信AI大赛分享交流会暨颁奖典礼圆满落幕

7月1日&#xff0c;由IMT-2030(6G)推进组、IMT-2020(5G)推进组5G与AI融合研究任务组主办&#xff0c;OPPO广东移动通信有限公司承办的2024 6G无线通信AI大赛在北京顺利举行分享交流会暨颁奖典礼。主承办方专家、10支获奖团队代表及6G无线通信相关领域专业人才齐聚北京&#xff…

企业元宇宙3D云端数字化展厅扩大客户触及面

在浩瀚无垠的元宇宙中&#xff0c;一个立体、虚拟的数字空间正在等待您的探索与创造。如何在这片无边界的数字领域中快速搭建起属于您自己的虚拟展馆&#xff0c;已成为当今企业关注的焦点。 元宇宙数字展馆搭建&#xff0c;不仅是对新技术领域的探索&#xff0c;更是品牌创新与…

股指期货看盘技巧和方法分享!

股指期货看盘技巧&#xff0c;简单来说&#xff0c;就是要找到适合自己的方法&#xff0c;同时要考虑大的经济环境。做交易时&#xff0c;要勇敢&#xff0c;不要后悔。 1. 了解自己&#xff1a;首先&#xff0c;你得清楚自己是哪种类型的投资者。你是喜欢长期投资&#xff0c;…

迅睿CMS 后端配置项没有正常加载,上传插件不能正常使用

首先&#xff0c;尝试迅睿CMS官方提供的【百度编辑器问题汇总】解决方案来解决你的问题。你可以访问这个链接&#xff1a;官方解决方案。 如果按照【百度编辑器问题汇总】解决方案操作后&#xff0c;依然遇到“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”的问题…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便&#xff0c;操作简单&#xff0c;集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片&#xff0c;能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

未对文件 xxx.ps1 进行数字签名,无法在当前系统上运行该脚本解决

无法执行PS1脚本&#xff1a; 解决方法: 启用远程签名策略 set-ExecutionPolicy RemoteSigned 启用签名策略后&#xff0c;成功执行ps1脚本 解决方法2: 使用当前用户签名策略&#xff1a; Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 成功运行ps1脚本 PowerShell I…

【计算机网络】网络层(作业)

【一】 1、某主机的 IP 地址为 166.199.99.96/19。若该主机向其所在网络发送广播 IP 数据报&#xff0c; 则目的地址可以是&#xff08;D&#xff09;。 A. 166.199.99.255B. 166.199.96.255C. 166.199.96.0D. 166.199.127.255 解析&#xff1a; 166.199.99.96/19166.199.0…

【FPGA】STA静态时序分析

文章目录 一.定义二.分类1. 静态时序分析2. 静态时序分析 三. 概念四. 时间余量1.场景2.建立时间余量3.保持时间余量 一.定义 时序分析:检查电路是否满足时序要求&#xff1b; 二.分类 1. 静态时序分析 STA,遍历所有的时序路径&#xff0c;根据时序库&#xff08;.lib文件&…

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border&#xff08;边框边距&#xff09;二、样式优先级三、var&#xff08;使用 CSS 变量更改多个元素样式&#xff09;四、media quary&#xff08;媒体查询&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉…