Dubbo用法示例

news2025/2/23 17:07:25

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.coloradmin.cn/o/1889918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis分布式锁的应用场景有哪些

⼀ 、应⽤场景 在多线程并发的场景下 &#xff0c;Java Synchronized/Reentrantlock 锁能够实现同⼀个JVM进程内多线程 并发的安全性 &#xff0c;但⽆法保证多个JVM进程实例构成的集群环境在多线程下的安全性。在⼀些业务场景 下需要引⼊分布式锁。 1、缓存击穿 当某个热点缓…

图增强LLM + 个性化健康

图增强LLM 个性化健康 提出背景图增强LLM 子解法1&#xff08;使用层次图模型&#xff09; 子解法2&#xff08;动态数据整合&#xff09; 子解法3&#xff08;LLM引导评估&#xff09; 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.16252 健康监测系统通过持续…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

Python特征工程 — 1.4 特征归一化方法详解

目录 1 Min-Max归一化 方法1&#xff1a;自定义的Min-Max归一化封装函数 方法2&#xff1a; scikit-learn库中的MinMaxScaler 2 Z-score归一化 方法1&#xff1a;自定义的Z-score归一化封装函数 方法2&#xff1a; scikit-learn库中的StandardScaler 3 最大值归一化 4 L…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了&#xff0c;续费提醒那是提前一周准时到来&#xff0c;但是看到客户发来的续费价格截图&#xff0c;我是真的没忍住。这不就是在杀熟吗&#xff1f;就这配置续费竟然如此昂贵&#xff1f;说实话这个客户的服务器代维是…

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811 2024/7/3 18:25 详细的刷机LOG&#xff1a; [BEGIN] 2024/7/3 18:18:49 rootRK3588:/# DDR Version V1.07 20220412 LPDDR4X, 2112MHz channel[0] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size204…

创建线程的五种方式

一.继承Thread ,重写run class MyThread extends Thread{Overridepublic void run() {//这里的内容就是该线程要完成的工作while(true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeExceptio…

类和对象(提高)

类和对象&#xff08;提高&#xff09; 1、定义一个类 关键字class 6 class Data1 7 { 8 //类中 默认为私有 9 private: 10 int a;//不要给类中成员 初始化 11 protected://保护 12 int b; 13 public://公共 14 int c; 15 //在类的内部 不存在权限之分 16 void showData(void)…

远程登录WINDOWS10,提示你的凭据不工作

1&#xff1a;想通过远程桌面登录WINDOWS10输入用户名和密码后&#xff0c;出现下面的提示。 2&#xff1a;登录WINDOWS10&#xff0c;在运行中输入gpedit.msc 3&#xff1a;本地组策略编辑器窗口中&#xff0c;依次展开&#xff0c;计算机配置 ---> 管理模版---> 系统--…

海外注册 | 欧盟医疗器械法规下免除临床试验的条件与要求

在欧盟医疗器械法规&#xff08;MDR&#xff09;的严格监管下&#xff0c;植入性医疗器械和III类医疗器械通常需要进行临床试验来证明其安全性和性能。 然而&#xff0c;MDR也规定了一些特定情况下免除临床试验的可能性。以下是免除临床试验的条件和要求的详细说明&#xff1a…

“穿越时空的机械奇观:记里鼓车的历史与科技探秘“

在人类文明的发展历程中&#xff0c;科技的创新与进步不仅仅推动了社会的进步&#xff0c;也为我们留下了丰富的文化遗产。记里鼓车&#xff0c;作为一种古老的里程计量工具&#xff0c;其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理…

视频分析、目标检测的过去和未来:目标检测从入门到精通 ------ YOLOv8 到 多模态大模型处理视觉基础任务

文章大纲 计算机视觉项目的关键步骤目标检测入门视频分析项目最佳实践数据集构建数据准备:数据集标注规范与数据规模参考标注工具标注工具:目标检测yolo 极简标注工具综合标注工具:label-studio半自动标注工具:X-AnyLabeling目标检测与多模态哪些多模态模型可以做目标检测?…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤&#xff1a; ① 程序开始前&#xff0c;我们要断言一下&#xff0c;确保指针是有效的&#xff0c;不是NULL&#xff1b; ② 我们还要断言一下&#xff0c;指定的…

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些&#xff1f; 目前主流的开源LLM&#xff08;语言模型&#xff09;模型体系包括以下几个&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI发布的一系列基于Transformer架构…

64位Office API声明语句第120讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载为止&#xff0c;它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接 1. 加载 加载是整个类加载的一个过程。在加载阶段&#xff0c;Java虚拟机…

第25篇 滑动开关控制LED<三>

Q&#xff1a;如何创建流水灯汇编语言程序工程并运行呢&#xff1f; A&#xff1a;基本原理&#xff1a;与用单个SW控制单个对应LED点亮与熄灭一样&#xff0c;我们创建用SW控制流水灯状态。默认初始状态为4个连续的红色LED为一组&#xff08;每组之间隔4个熄灭的LED&#xff…

如何在网络抓取过程中绕过 CAPTCHA 和 reCAPTCHA?

什么是 CAPTCHA&#xff1f; CAPTCHA&#xff0c;全称为 “Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;完全自动化的公共图灵测试以区分计算机和人类&#xff09;&#xff0c;是一种用于识别网站访问者是否为真实人的测试。 这…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线&#xff0c;每位玩家都能在这里开启全新的时空冒险之旅&#xff0c;主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本&#xff0c;以及日常任务为主&#xff0c;在以往的手游中&#xff0c;玩家进入某项玩法只需要从游戏界面调取菜单即可&#…