Dubbo-笔记随记一

一、实战

1 . Springboot整合

1.1 服务提供者

1.1.1 依赖
         <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-spring-boot-starter</artifactId><version>3.2.10</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><artifactId>logback-classic</artifactId><groupId>ch.qos.logback</groupId></exclusion></exclusions></dependency>
1.1.2 配置
dubbo:protocol:name: triport: 50051application:name: lyl-dubbo-serverlogger: slf4jregistry:address: zookeeper://localhost:2181
1.1.3 开启dubbo

@EnableDubbo 使用该注释,开启dubbo

@SpringBootApplication
@EnableDubbo
public class ServerApp
{public static void main( String[] args ){SpringApplication.run(ServerApp.class, args);System.out.println("server started!");}
}
1.1.4 服务暴露(服务注册)
@DubboService 使用该注释,进行服务暴露(注册到注册中心)
package com.doumi.service;import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;@DubboService
@Service
public class DemoServiceImpl implements DemoService {@Overridepublic String hello(String name) {return "i am server hello " + name;}
}

1.2 服务消费者

1.2.1 依赖
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.8</version></dependency>
<!--        dubbo 依赖--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-zookeeper-spring-boot-starter</artifactId><version>3.2.10</version></dependency>
1.2.2 配置
dubbo:protocol:name: triport: 50052application:name: lyl-dubbo-clientlogger: slf4jregistry:address: zookeeper://localhost:2181
1.2.3 开启dubbo
package com.doumi;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;/*** 服务调用端!**/
@SpringBootApplication
@RestController
@EnableDubbo
public class ClientApp
{public static void main( String[] args ){SpringApplication.run(ClientApp.class, args);System.out.println( "client start!" );}
}
1.2.4 使用服务
@DubboReference 使用该注解,调用dubbo服务
package com.doumi.controller;import com.doumi.service.DemoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(mock = "true")private DemoService demoService;@GetMapping(path = "/hello")public String hello(@RequestParam String name) {return demoService.hello(name);
//        return "i am client, hello "+name;}}

2、高级特性

2.1 序列化

package com.doumi.service;import com.doumi.pojo.User;public interface DemoService {String hello(String name);User find(Integer id);}
package com.doumi.service;import com.doumi.pojo.User;
import org.apache.dubbo.config.annotation.DubboService;@DubboService
public class DemoServiceImpl implements DemoService {@Overridepublic String hello(String name) {return "i am server hello " + name;}@Overridepublic User find(Integer id) {User user = new User(id, "user-" + id);return user;}}
package com.doumi.controller;import com.doumi.pojo.User;
import com.doumi.service.DemoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(mock = "false")private DemoService demoService;@GetMapping(path = "/hello")public String hello(@RequestParam String name) {return demoService.hello(name);}@GetMapping(path = "/find")public User find(@RequestParam Integer id) {return demoService.find(id);}}

当返回是个对象时,该对象必须进行序列化,因为该对象需要在两台服务器间(网络)传输

pojo定义如下:

package com.doumi.pojo;import java.io.Serializable;public class User implements Serializable {private Integer id;private String name;public User() {}public User(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

当对象没有序列化的时候,报错如下:


org.apache.dubbo.rpc.StatusRpcException: INTERNAL : Serialize response failedat org.apache.dubbo.rpc.TriRpcStatus.asException(TriRpcStatus.java:213) ~[dubbo-3.2.10.jar:3.2.10]at org.apache.dubbo.rpc.protocol.tri.call.UnaryClientCallListener.onClose(UnaryClientCallListener.java:53) ~[dubbo-3.2.10.jar:3.2.10]

2.2  地址缓存

注册中心挂了,服务是否可以正常访问?

  • 可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后再调用,则不会访问注册中心。
  • 当服务提供者地址发生变化时,注册中心会通知服务消费者。

2.3 超时

  • 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这时候,服务消费者会一直等待下去。
  • 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
  • dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
  • 使用timeout属性配置超时时间,默认值1000,单位毫秒。
服务端配置超时时间
package com.doumi.service;import com.doumi.pojo.User;
import org.apache.dubbo.config.annotation.DubboService;@DubboService(timeout = 3000)//服务端配置超时时间
public class DemoServiceImpl implements DemoService {@Overridepublic String hello(String name) throws InterruptedException {Thread.sleep(5000);return "i am server hello " + name;}int i ;@Overridepublic User find(Integer id) throws InterruptedException {System.out.println("调用服务端"+i++);User user = new User(id, "user-" + id);Thread.sleep(5000);return user;}}
客户端配置超时时间
package com.doumi.controller;import com.doumi.pojo.User;
import com.doumi.service.DemoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(mock = "true",timeout = 6000) //客户端设置超时时间,服务端设置成3s,服务调用实际时间是5s,此时可以调用成功private DemoService demoService;@GetMapping(path = "/hello")public String hello(@RequestParam String name) throws InterruptedException {timer();return demoService.hello(name);}@GetMapping(path = "/find")public User find(@RequestParam Integer id) throws InterruptedException {timer();return demoService.find(id);}int i = 1;public void timer() {new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println(i++);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}).start();}}

2.4 重试

设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。

如果出现网络抖动,则这次请求就会失败。

dubbo提供重试机制,来避免类似问题的发生。

通过retries属性来设置重试次数,默认为2次。

@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(mock = "true",timeout = 1000,retries = 5) 当前服务1秒超时,重试5次,共调用6次private DemoService demoService;

2.5 多版本

2.5.1 使用场景

  • 灰度发布:当出现新功能时,会让一部分用户先试用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
  • dubbo中使用version属性来设置和调用同一个接口的不同版本
2.5.2 实现方式

服务端两个版本的实现,分别标识 version = "v1.0" version = "v2.0"

客户端使用version = "v1.0" 和version = "v2.0",控制具体使用哪个版本

package com.doumi.service;import com.doumi.pojo.User;
import org.apache.dubbo.config.annotation.DubboService;@DubboService(timeout = 3000,retries =1,version = "v1.0")
public class DemoServiceImpl implements DemoService {@Overridepublic String hello(String name) throws InterruptedException {Thread.sleep(5000);return "i am server hello " + name;}int i ;@Overridepublic User find(Integer id) throws InterruptedException {System.out.println("old 调用服务端"+i++);User user = new User(id, "user-" + id);Thread.sleep(5000);return user;}
}
package com.doumi.service;import com.doumi.pojo.User;
import org.apache.dubbo.config.annotation.DubboService;@DubboService(timeout = 3000,retries =1,version = "v2.0" )
public class DemoServiceImpl2 implements DemoService {@Overridepublic String hello(String name) throws InterruptedException {Thread.sleep(5000);return "i am server hello " + name;}int i ;@Overridepublic User find(Integer id) throws InterruptedException {System.out.println("new  调用服务端 "+i++);User user = new User(id, "user-" + id);Thread.sleep(5000);return user;}
}
@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(mock = "true",timeout = 1000,retries = 5,version = "v1.0") //当前服务1秒超时,重试5次,共调用6次private DemoService demoService;

2.6 负载均衡

负载均衡策略:(4种)

  • Random:按权重随机,默认值,按权重设置随机概率
  • RoundRobin:按权重轮询
  • LeastActive:最少活跃调用数,相同活跃数的随机
  • ConsistantHash:一致性Hash,相同参数的请求总是发到同一提供者
@RestController
@RequestMapping("/users")
public class MyRestController {/*** mock 容错处理,返回null* mock = true*/@DubboReference(loadbalance ="RandomLoadBalance" ) //负载均衡策略private DemoService demoService;

2.7 集群容错

集群容错模式:

FailOver Cluster:失败重试,默认值。当出现失败,重试其他

FailFast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于写操作。

FailSafe Cluster:失败安全,出现异常时,直接忽略。返回一个空结果。

FailBack Cluster:失败自动恢复,后台记录失败请求,定时重发。

Forking Cluster:并行调用多个服务器,只要有一个成功即返回。

//    @DubboReference(cluster = "failover",version = "v1.0")//失败重试
//    @DubboReference(cluster = "failfast",version = "v1.0")//快速失败,失败了直接返回错误
//    @DubboReference(cluster = "failsafe",version = "v1.0")//失败了返回一个空结果,防止出现异常
//    @DubboReference(cluster = "failback",version = "v1.0")//失败自动恢复,后台记录失败请求,定时重发。@DubboReference(cluster = "forking",version = "v1.0")//并行调用多个服务器,只要有一个成功即返回。private DemoService demoService;

2.8 服务降级

服务降级方式:

  • mock=force:return null :表示消费方对该服务的方法的调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  • mock=fail:return null 表示消费方对该服务的方法调用在失败后,再返回null值,不抛出异常。用来容忍不重要服务不稳定时,对调用方的影响。
//@DubboReference(mock = "force:return null")//不会发起调用,直接失败,用于服务降级的场景,保证重点服务可用,非重点服务直接失败
@DubboReference(mock = "fail:return null",version="v1.0")//表示消费方对该服务的方法调用在失败后,再返回null值,不抛出异常。用来容忍不重要服务不稳定时,对调用方的影响。private DemoService demoService;

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

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

相关文章

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3&#xff0c;不同的API结果无论是访问URL还是使用etcdctl进行通信&#xff0c;都会导致问题&#xff0c;例如使用etcdctl和v3进行通信&#xff0c;如果没有实名ETCDCTL_API3指定API版本会直接…

使用VUE3创建个人静态主页

使用VUE3创建个人静态主页 &#x1f31f; 前言&#x1f60e;体验&#x1f528; 具体实现✨ 核心功能&#x1f3d7;️ 项目结构&#x1f680; 用这个项目部署 Git Page &#x1f4d6; 参考 &#x1f31f; 前言 作为开发者或者内容创作者&#xff0c;我们经常需要创建静态网页&a…

llm大模型学习

llm大模型 混合专家模型&#xff08;MoE&#xff09;MoE结构路由router专家expertSwitch Transformer的典型MOE模型最后MoE总结 混合专家模型&#xff08;MoE&#xff09; 模型规模是提升LLM大语言模型性能的关键因素&#xff0c;但也会增加计算成本。Mixture of Experts (MoE…

Linux入门攻坚——43、keepalived入门-1

Linux Cluster&#xff08;Linux集群的类型&#xff09;&#xff1a;LB、HA、HPC&#xff0c;分别是负载均衡集群、高可用性集群、高性能集群。 LB&#xff1a;lvs&#xff0c;nginx HA&#xff1a;keepalived&#xff0c;heartbeat&#xff0c;corosync&#xff0c;cman HP&am…

YOLOv8/YOLOv11改进 添加CBAM、GAM、SimAM、EMA、CAA、ECA、CA等多种注意力机制

目录 前言 CBAM GAM SimAM EMA CAA ECA CA 添加方法 YAML文件添加 使用改进训练 前言 本篇文章将为大家介绍Ultralytics/YOLOv8/YOLOv11中常用注意力机制的添加&#xff0c;可以满足一些简单的涨点需求。本文仅写方法&#xff0c;原理不多讲解&#xff0c;需要可跳…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…

解决“KEIL5软件模拟仿真无法打印浮点数”之问题

在没有外部硬件支持时&#xff0c;我们会使用KEIL5软件模拟仿真&#xff0c;这是是仿真必须要掌握的技巧。 1、点击“Project”&#xff0c;然后点击“Options for target 项目名字”&#xff0c;点击“Device”,选择CPU型号。 2、点击“OK” 3、点击“Target”,勾选“Use Mi…

donet (MVC)webAPI 的接受json 的操作

直接用对象来进行接收&#xff0c;这个方法还不错的。 public class BangdingWeiguiJiluController : ApiController{/// <summary>/// Json数据录入错误信息/// </summary>/// <param name"WeiguiInfos"></param>/// <returns></r…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式&#xff08;Singleton&#xff09; 游戏实现中的唯一对象 在游戏开发过程中…

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

如何让用户在网页中填写PDF表格?

在网页中让用户直接填写PDF表格&#xff0c;可以大大简化填写、打印、扫描和提交表单的流程。通过使用复选框、按钮和列表等交互元素&#xff0c;PDF表格不仅让填写过程更高效&#xff0c;还能方便地在电脑或移动设备上访问和提交数据。 以下是在浏览器中显示可填写PDF表单的四…

ThinkPHP 8高效构建Web应用-获取请求对象

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

23.行号没有了怎么办 滚动条没有了怎么办 C#例子

新建了一个C#项目&#xff0c;发现行号没有了。 想把行号调出来&#xff0c;打开项目&#xff0c;选择工具>选项> 如下图&#xff0c;在文本编辑器的C#里有一个行号&#xff0c;打开就可以了 滚动条在这里&#xff1a;

30天开发操作系统 第 12 天 -- 定时器

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

el-table 实现纵向多级表头

为了实现上图效果&#xff0c;最开始打算用el-row、el-col去实现&#xff0c;但发现把表头和数据分成两大列时&#xff0c;数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样&#xff0c;为保持高度样式一致&#xff0c;就需要我们手动去获取最高格的高度之后再设置…

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…

oxml中创建CT_Document类

概述 本文基于python-docx源码&#xff0c;详细记录CT_Document类创建的过程&#xff0c;以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类&#xff08;MetaClass&#xff09;是Python中的高级特性。元类是什么呢&#xff1f;Python是面向对象编程…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里

在 ASP.NET CORE 中上传、下载文件

创建 Web API 来提供跨客户端和服务器的文件上传和下载是常有的事。本文将介绍如何通过 ASP.NET CORE 来实现。 首先在 Visual Studio 中创建空的 Web API 项目&#xff0c;然后选择目标框架 .Net Core 3.1。 创建名为 FileController 的控制器&#xff0c;提供操作文件的接口…

vue2迁移至rsbuild

背景 由于远程机器配置较低&#xff0c;每次运行vue2项目都会非常卡。后期项目文件、路由更多的时候&#xff0c;启动到一半直接会跳出open too many files类似的错误&#xff0c;尝试将路由屏蔽掉只剩下开发所需的一个路由也不行&#xff08;不是说webpack的打包是全部打包&am…