Dubbo3入门实践,SpringBoot+Dubbo+Nacos+DubboAdmin

news/2024/3/29 13:46:14/文章来源:https://blog.csdn.net/Print_lin/article/details/128102304

前言

        学习Dubbo的过程中发现官网文章太过简单,而且没有提供完整的项目整合,导致入门门槛比较高,初学者不知从何下手。本文将在SpringBoot的基础上整合Dubbo,注册中心使用当下流行的Nacos,还将使用Dubbo-Admin来管理服务。本文未提到Dubbo的基础知识与基本概念,这方面内容可以直接查阅【Dubbo官网-总体架构】。

步骤

  • SpringBoot多模块基础项目创建
  • Dubbo服务提供方实现
  • Dubbo服务消费方实现
  • 自定义Filter拦截所有消费请求
  • 自定义LoadBalance完成特殊负载均衡
  • DubboAdmin的使用

SpringBoot多模块基础项目创建

项目结构

└─dubbo-test
    │  pom.xml
    ├─dubbo-test-consumer(服务消费方)
    │  │  pom.xml
    │  └─src
    ├─dubbo-test-interface(消费方和提供方共享的接口定义)
    │  │  pom.xml
    │  └─src
    └─dubbo-test-provider(服务提供方)
        │  pom.xml
        └─src

        多模块的创建这里不再赘述,主要分为三个子模块。消费方和提供方共享接口定义模块,避免代码重复。服务提供方实现接口定义,消费方根据接口定义去请求提供方的具体实现,Dubbo完成了整个请求的过程。

Dubbo服务提供方实现

配置文件

dubbo:application:name: dubbo-test-providerprotocol:name: dubboport: -1registry:address: nacos://192.168.0.129:8848username: nacospassword: nacosconfig-center:address: nacos://192.168.0.129:8848username: nacospassword: nacosgroup: dubbometadata-report:address: nacos://192.168.0.129:8848username: nacospassword: nacosgroup: dubbo

关键代码

//用户服务
@DubboService
public class UserServiceImpl implements IUserService {private static final Random random = new Random();@Overridepublic User login(String username, String password) {if(!"123456".equals(password)){return null;}User user = new User();user.setId(random.nextInt(1000));user.setUsername(username + "_" + user.getId());user.setSex(user.getId()%2 == 0 ? "男" : "女");return user;}
}//群组服务
@DubboService
@Component
public class GroupServiceImpl implements IGroupService {@Value("${dubbo.application.name}")private String appName;@Overridepublic String join(Integer userId, String groupId) {return userId+"_"+groupId+"_"+appName;}
}

         这里实现了两个服务,均是来自dubbo-test-interface中的接口定义。用户服务做了一个简单的随机用户信息的创建,群组服务返回了当前属于哪一台主机(为后文自定义负载均衡做准备)。

Dubbo服务消费方实现

配置文件

server:port: 8888dubbo:application:name: dubbo-test-consumerprotocol:name: dubboport: -1registry:address: nacos://192.168.0.129:8848username: nacospassword: nacosconfig-center:address: nacos://192.168.0.129:8848group: dubbousername: nacospassword: nacosmetadata-report:address: nacos://192.168.0.129:8848group: dubbousername: nacospassword: nacosconsumer:filter: logFilter

关键代码

@RestController
public class UserController {@DubboReferenceprivate IUserService userService;@DubboReference(loadbalance = "groupLoadBalance")private IGroupService groupService;@GetMapping("/login")public User login(String username, String password){return userService.login(username, password);}@GetMapping("/join")public String join(Integer userId, String groupId){return groupService.join(userId, groupId);}
}

        代码引用了两个服务,其中IGroupService服务使用了自定义的负载均衡策略。

自定义Filter拦截所有消费请求

关键代码

@Slf4j
@Activate(group = CommonConstants.CONSUMER)
public class LogFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {log.info("开始调用,接口:{},参数:{}", invocation.getMethodName(), JSON.toJSONString(invocation.getArguments()));Result result = invoker.invoke(invocation);log.info("调用完成,结果:{}", JSON.toJSONString(result.getValue()));return result;}
}

配置 

        配置filter需要在yml增加【dubbo.consumer.filter: logFilter】,其中logFilter是自定义的过滤器名称,这个需要在resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter中配置,默认项目中是没有这个文件的,需要按文件夹路径逐一手动创建,具体参考【Dubbo官网-调用拦截扩展】。

自定义LoadBalance完成特殊负载均衡

        在现实业务中默认负载均衡策略可能不能满足需求,我们可以自定义负载均衡策略。这里通过继承Dubbo默认的RandomLoadBalance来进行自定义拓展,实现了一个通过群组id获取指定服务器的策略,达到了同一个群的用户在同一台服务器的业务效果。当然这里只是一个功能演示,有许多未考虑的情况,具体需求还需根据场景使用其它手段实现。

关键代码

@Slf4j
public class GroupLoadBalance extends RandomLoadBalance {private static final Map<String, Integer> groupMapping = new HashMap<>();@Overridepublic <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {log.info("进入自定义负载均衡,{}", url.getAbsolutePath());//获取调用方法名称String methodName = invocation.getMethodName();if(!"join".equals(methodName) || invocation.getArguments() == null|| invocation.getArguments().length != 2){//直接采用默认策略log.info("不满足条件,直接采用默认策略");return super.select(invokers, url, invocation);}//获取群组参数String groupId = (String) invocation.getArguments()[1];Integer selected = groupMapping.get(groupId);if(selected != null){//查找已有的服务器for(Invoker<T> invoker : invokers){if(selected.equals(invoker.hashCode())){log.info("查找到群组对应的服务器,直接返回");return invoker;}}}//未找到已有的服务器则使用默认策略选择服务器log.info("当前群组没有对应服务器,使用默认策略选择服务器");Invoker<T> randomSelected = super.select(invokers, url, invocation);//保存群组对应的服务器groupMapping.put(groupId, randomSelected.hashCode());return randomSelected;}
}

配置

        自定义负载均衡不用再yml中增加配置,只需要在引用时使用名称指定特定负载均衡策略即可,如上文提到的@DubboReference(loadbalance = "groupLoadBalance")。同filter一样,也需要在resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance中配置名称和对应的Class地址,具体参考【Dubbo官网-负载均衡扩展】。

DubboAdmin的使用

        dubbo-admin是官方推出的一个后台管理软件,可以查看当前dubbo的运行情况并做动态配置调整。可以从官方仓库【apache/dubbo-admin】拉取代码部署,也可以直接使用官方准备好的docker运行,还可以下打好包的jar文件运行。这里使用官方Releases的0.5.0版本运行,下载地址【apache-dubbo-admin-0.5.0-bin-release.zip】。

        下载后打开bin/config/application.properties文件,将原本的zookeeper配置注释,打开下面的nacos注释并修改链接信息。如下图所示:

        然后使用 bin/startup.cmd脚本启动即可,停止则使用shutdown.cmd。

        最后打开浏览器输入http://localhost:8080/即可访问,默认账号root,密码root。

完整代码

printlin/dubbo-test

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

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

相关文章

web前端-javascript-基本数据类型和引用数据类型(对象和基本数据类型保存到栈内存,对象保存在堆内存,比较两个基本数据类型或引用数据类型)

基本数据类型和引用数据类型 var a 123; var b a; a;/* console.log("a "a); console.log("b "b); */var obj new Object(); obj.new "孙悟空";var obj2 obj;//修改obj的name属性 obj.name "猪八戒";/* console.log(obj.name…

C. Strange Test(位运算或)

Problem - 1632C - Codeforces 伊戈尔正在读11年级。明天他将不得不写一份信息学测试&#xff0c;由学校最严格的老师帕维尔-杰尼索维奇负责。 伊戈尔知道测试将如何进行&#xff1a;首先&#xff0c;老师会给每个学生两个正整数a和b&#xff08;a<b&#xff09;。之后&…

BP神经网络详解,Python实现求解异或问题

BP神经网络 符号及其含义 nln_lnl​表示第lll层神经元的个数&#xff1b;f(⋅)f()f(⋅)表示神经元的激活函数&#xff1b;W(l)∈Rni∗ni−1W^{(l)}\in\mathbb R^{n_i*n_{i-1}}W(l)∈Rni​∗ni−1​表示第l−1l-1l−1层到第lll层的权重矩阵&#xff1b;wij(l)w_{ij}^{(l)}wij(l…

idea手动创建webapp(在main文件夹下)

SSM自学笔记 文章目录一、Maven使用正常情况首先不使用骨架创建好Maven项目然后选择Project Structure...选择要创建webapp的模块修改路径二、Maven不正常工作时一、Maven使用正常情况 首先不使用骨架创建好Maven项目 然后选择Project Structure… 选择要创建webapp的模块 选好…

python数据容器——列表

目录 一.数据容器 二.数据容器——列表 基本语法 注意 三.列表的下标&#xff08;索引&#xff09; 嵌套列表的下标&#xff08;索引&#xff09; 四.列表的常用操作&#xff08;方法&#xff09; 1.查询元素下标 2.插入元素 3.删除元素 4.统计元素 说明 一.数据容器 1&a…

传奇出现黑屏卡屏不动是怎么回事

在写这篇文章之前&#xff0c;先给给大家说一下&#xff0c;这篇文章写的是出现黑屏、卡屏不动是我们玩传奇的时候出现的&#xff0c;而不是在架设传奇时候出现的&#xff0c;所以要特别是注意一下&#xff0c;架设和玩出现黑屏是完全不一样的&#xff0c;所以解决方案也不一样…

H3C opsf/rip/ftp/telent/nat/acl综合

实验拓扑 拓扑下载 https://sharewh2.xuexi365.com/share/84b85b32-acb7-4f62-a389-6188680a19f3?t3 图 1-1 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备…

【jmeter】windows下使用 (测试MQTT)

1. 添加线程组 二、添加如下请求 1. 添加创建连接请求-选中线程组&#xff0c; 点击右键&#xff0c;添加>取样器>MQTT Connect设置MQTT连接 本次使用本机开启的MQTT服务进行测试&#xff0c;默认ip为127.0.0.1&#xff0c;端口默认1883 2. 添加发布请求-选中线程组 …

软件测试之对于测试的反思及思考

1.针对一个页面&#xff0c;从页面的完整性(包括字段、输入框、功能点)出发 2.对于分页&#xff0c;考虑未在首页的时候的测试&#xff0c;末页的情况。 3.对条件的查询来说&#xff0c;要针对于单个输入框的测试、交叉输入框的测试 4.对于删除、修改等&#xff0c;要考虑你删除…

nablet Elements released处理视频的组件

nablet Elements released处理视频的组件 mediaEngine-一个转码工厂&#xff0c;为视频工作流从贡献到分发提供动力。 HeightScreen-AI驱动的工具&#xff0c;用于将视频转换为垂直屏幕&#xff0c;自动选择感兴趣的区域。 Shrynk-AI驱动的解决方案&#xff0c;可自动完成高亮编…

【站内题解】十六道csdn每日一练Python题解

文章目录题目一&#xff1a; 游乐园的门票1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案5.1 解法一5.2 解法二题目二&#xff1a;小桥流水人家1. 问题描述2. 输入描述3. 输出描述4. 示例4.1 输入4.2 输出5. 答案题目三&#xff1a;小艺读书1. 问题描述2. 输…

Wordpress模板主题中functions.php常用功能代码与常用插件(持续收集整理)

用Wordpress建站的初学者一定会需要用到的Wordpress模板主题中functions.php常用功能代码与常用插件。慢慢持续收集整理....... 目录 一、Wordpress模板主题中functions文件常用的代码 二、Wordpress自定义字段的设定与调用代码&#xff08;系统常规自定义字段&#xff09; …

ESP32基础应用之LVGL基础

文章目录1 实验目的1.1 参考文章2 实验工具3 准备工作3.1 搭建ESP32开发环境3.2 克隆lv_port_esp32工程4 配置lv_port_esp32工程5 实验验证6 使用过程遇到的问题6.1 触摸功能点击屏幕位置不对1 实验目的 本实验为使用ESP32实现LVGL&#xff08;轻量级的嵌入式图形库&#xff0…

消息队列概述与扩展

一、消息队列的特性 与业务解藕&#xff1a;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行通信。FIFO&#xff1a;先投递先到达的保证是一个消息队列和一…

计算机组成原理习题课第三章-2(唐朔飞)

计算机组成原理习题课第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

梦开始的地方——C语言柔性数组

文章目录柔性数组什么是柔性数组&#xff1f;柔性数组的使用柔性数组的优点柔性数组 什么是柔性数组&#xff1f; 在C99中&#xff0c;结构体最后一个元素它允许是一个未知大小的数组&#xff0c;这就叫做柔性数组成员。 这个概念听起来可能有点不可以思议&#xff0c;但它的…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容&#xff0c;本篇内容讲到使自定义组件&#xff0c;讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容&#xff0c;那么什么是自定义指令&#xff0c;在前面的内容讲过了好些常用的指令&#xff0c;如 v-modl…

【linux】环境基础开发工具使用

1.vim编辑器 vim中最常用的是三种模式&#xff1a;命令模式&#xff0c;底行模式&#xff0c;插入模式。 命令模式(Normal mode)命令模式是我们第一次vim打开文件的样子&#xff08;默认模式&#xff09;&#xff0c;这里控制屏幕光标的移动&#xff0c;字符、字或行的删除&…

考CISAW的N个理由!

随着信息科技的飞速发展&#xff0c;互联网的普及&#xff0c;面对信息安全的严峻局势&#xff0c;网络信息安全显得尤为重要&#xff0c;同时近些年来&#xff0c;国家也相继出台一些政策&#xff0c;并推出一些国家认证的资格证书&#xff0c;CISAW认证就是专门针对信息安全保…

DPDK代码目录结构

DPDK功能结构 DPDK工程目录内容 dpdk-stable-18.11.11]# ls app buildtools devtools drivers GNUmakefile lib MAINTAINERS meson.build mk README usertools build config doc examples kernel license Makefile meson_opt…