Dubbo SpringBoot+Dubbo泛化的使用,以及开发时直连本地的Dubbo服务(Dubbo指定点对点调用服务)

​ 一般情况我们使用dubbo)通过rpc调用dubbo提供方的服务,首先要在消费者的项目中引入接口提供者的jar包(provider端暴露的接口和方法),然后使用jar包里面的类和方法,两端才能正常通信调用。但是如果要调N个不同服务提供者的接口,就要引入N个jar包,这时候消费者项目有N多个dubbo提供者的jar,项目就会耦合。我们可以用dubbo的泛化实现调用dubbo服务,泛化调用不需要引入provider提供的jar即可实现远程调用,降低耦合。
​ 但是一般提供好的jar是不会再修改里面的接口方法的,即使修改,也要尽量向下兼容,兼容之前版本的接口(不然这个jar被很多客户端引入的话,那么他们都要修改),在jar里面提供好了dubbo接口的方法和参数,其他客户端引入就可以调用,所以还是引jar的方式调dubbo接口比较方便,不过我这里记录一下不引入jar的调用dubbo接口的笔记

注:
底层原理跟普通的RPC调用是一致的,网络、序列化、反射这些底层技术一致。区别就在于参数和返回值中所有的POJO都用Map表示。通过GenericService来调用所有的服务实现。

GenericService 这个接口只有一个方法,名为 $invoke,它接受三个参数,分别为方法名、方法参数类型数组和参数值数组;
对于方法参数类型数组如果是基本类型,如 int 或 long,可以使用 int.class.getName()获取其类型;
如果是基本类型数组,如 int[],则可以使用 int[].class.getName();
如果是 POJO,则直接使用全类名,如 com.xinlin.model.xxxPOJO

注:这个全类名是指dubbo服务提供方provider的接口的参数的POJO的全类名

例子

1.在dubbo的服务提供方写一个查询用户信息的服务

@Service
public class DubboUserService implements IDubboUserService {@Overridepublic UserVO getUser( UserDTO userDTO) {UserVO user = new UserVO();user.setName("xinlin");user.setId(1);return user;}
}

2.在dubbo的消费者中配置获取这个用户信息的泛化的服务

@Configuration
public class DubboUserServiceConfig {@Beanpublic GenericService dubboUserService(ApplicationConfig applicationConfig, RegistryConfig registryConfig){ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();reference.setApplication(applicationConfig);reference.setRegistry(registryConfig);// 设置调用的reference属性,下面只设置了协议、接口名、版本、超时时间reference.setProtocol("dubbo");reference.setInterface("cn.com.xinlin.service.IDubboUserService");
//        reference.setVersion("1.0.0");reference.setTimeout(2000);// 声明为泛化接口reference.setGeneric(true);// GenericService可以接住所有的实现GenericService genericService = reference.get();return genericService;}
}

3.在dubbo消费者的controller中注入这个泛化的dubbo服务

@Controller
@RequestMapping("/demo")
public class DemoController {// generic = true 声明为泛化接口@AutowiredGenericService dubboUserService;/*** 泛化调用* @return*/@ResponseBody@RequestMapping(value = "/getUser")public Map getUser(){//构造参数,用Map表示POJO参数,如果返回值为POJO也将自动转成MapMap<String, Object> userDTO = new HashMap<>();userDTO.put("age", "25");userDTO.put("name", "b");Object result = dubboUserService.$invoke("getUser",new String[]{"cn.com.xinlin.model.dto.UserDTO"},new Object[]{userDTO});return (Map)result;}
}

4.在浏览器测试调用,调试可以看到成功调用了dubbo服务,这个过程并没有引入一个dubbo提供方的jar包即可实现远程调用dubbo的服务
在这里插入图片描述
在这里插入图片描述

注:
优点降低耦合
缺点也明显,参数传递麻烦,需要显示指定方法名称、参数。

(dubbo不需要注册中心也可以指定点对点调用服务)

有时候本地开发测试的时候,总不能每次都放到测试环境才去测,在@Reference注解的url写本地的dubbo服务的localhost+端口即可连上,例:url=“dubbo://localhost:20880”,先启动本地的dubbo服务,如果本地的dubbo服务提供者连不上注册中心的话,在application.propertites加上这行配置禁止向注册中心注册就可以了

dubbo.registry.register=false
@Reference(timeout = 3000,url="dubbo://localhost:20880")
IDubboDemoService dubboDemoService;

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

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

相关文章

java string... 参数_Java String.Format() 方法及参数说明

JDK1.5中&#xff0c;String类新增了一个很有用的静态方法String.format():format(Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字…

Unity3D VS UE4

Unity3D&#xff08;U3D&#xff09; 1.视觉效果&#xff1a;Unity3D相对UE4略逊、手机3D应用、3D游戏轻量级首选&#xff0c;支持跨平台、设备兼容性更好 2.产品力&#xff1a;Unity3D更加多元化&#xff0c;各平台都有代表作&#xff0c;比如《王者荣耀》《炉石传说》《纪念…

java 打包边下载_JAVA实现边下载边压缩

ResponseBodypublic voiddownloadUrl(HttpServletResponse response, HttpServletRequest request){String sourceFilePathproperties.getString("sourceFilePath");//要下载的文件路径eavlProName xxx;//项目名String downloadName "xxx.zip"; //下载文…

Java将时间加1分钟的方法

SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date now new Date(); System.out.println("当前时间&#xff1a;" sdf.format(now));方法一&#xff1a; Date afterDate new Date(now .getTime() 60000); System.out.println…

对List集合中每个对象元素按时间顺序排序

需求&#xff1a; 需要对List中的每个student对象按照birthday顺序排序&#xff0c;时间由小到大排列。 1. 刚开始用的是冒泡排序&#xff0c;出现数据覆盖的情况 for (int i 0; i < list.size() - 1; i) {for (int j 0; j < list.size() - 1 - i; j) {long time li…

SpringBoot读取resource或template中的文件

Spring-Boot读取resource或template中的文件 1.项目场景&#xff1a; 以jar包方式部署系统&#xff0c;想读取resource或是template下面的文件时&#xff0c;报 File Not Found 我遇到的情况是&#xff0c;整个项目达成了一个包&#xff0c;在开发环境&#xff08;windows i…

java slot_LocalVariableTable之 Slot 复用

LocalVariableTable中的 Slot&#xff0c; 是存在复用现象的&#xff0c;这个我早就知道&#xff0c;但是&#xff0c;不太清楚是如何复用的。Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量slot做太多限制&#xff0c;只是规定了参数要从下标为0开始的局部…

关于使用this.getClass().getResource(“/“)获取文件时遇到的坑_ClassPathResource加载资源文件用法

最近在工作中遇到需要读取配置文件&#xff0c;然后第一想法就是将文件放到项目的resources目录下, 然后使用&#xff1a; String fileName "config/zh.md" String path this.getClass().getResource("/").getPath() fileName; System.out.println(p…

Objects.requireNonNull( )方法说明

Objects.requireNonNull( )方法在java.util.Objects中 作用就是判断一个对象是否为空 底层源码&#xff1a; /* param obj 需要检测是否为空的对象* param <T> 对象类型* return 对象不为空则返回该对象* throws 对象为空则报NullPointerException异常*/public static …

java 类的执行顺序_Java-类加载和main()方法的执行顺序?

2、类加载和main()的执行顺序&#xff1f;备注&#xff1a;执行main()方法会先加载main()方法所在的类。存在继承关系中&#xff0c;创建子类对象初始化过程为:父类静态成员和语句块子类静态成员和静态语句块父类普通成员和普通语句块父类构造函数子类普通成员和普通语句块父类…

利用Gson解析多层嵌套的JSON数据

数据实例: {"error": 0,"status": "success","results": [{"currentCity": "青岛","index"

编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...

【多选题】下列关于多行注释的应用,正确的是( )【单选题】是在思维中把对象分解为各个部分、侧面、属性以及阶段,分别加以考察的方法。(1.0分)【判断题】多行注释“/*...*/”中不可以嵌套单行注释“//”。( )【多选题】直觉具有( )等特性。(2.0分)【多选题】马克思主义科学技术…

数据模型 同比 环比_同比和环比计算公式?

一、同比增长计算公式&#xff1a; 1、同比增长率(本期数&#xff0d;同期数)同期数100% 例子&#xff1a;比如说去年3月的产32313133353236313431303231363533e4b893e5b19e31333365666237值100万&#xff0c;本年3月的产值300万&#xff0c;同比增长率是多少&#xff1f; 本…

mysql80配置环境变量_MySQL:安装与配置

一、MySQL安装0、下载社区版安装包1、进入安装页面&#xff0c;这里不选择默认安装的所有工具&#xff0c;仅选择Server only。2、如果没有VC环境就点击execute安装&#xff0c;已安装就继续下一步。3、安装MySQL服务&#xff0c;Next。4、进入MySQL的配置环节&#xff0c;首先…

解决SVN无法add to ignore list的问题

有时候&#xff0c;在SVN中添加某文件夹到忽略列表即add to ignore list的时候报错&#xff0c;无法添加进忽略列表&#xff0c;这里总结一下&#xff0c;无非就是两个原因 仓库中已经存在了该文件夹的历史版本&#xff0c;因而无法忽略 解决方法&#xff1a;先备份该文件夹&am…

oracle正则表达式包含但不含_Oracle 正则表达式(详细)

Oracle 正则表达式正则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板&#xff0c;将某个字符模式与所搜索的字符串进行匹配。本文详细地列出了能在正则表达式中使用…

获取某个月中的第一天和最后一天某个月的天数当月第一天,当月最后一天,当年的第一天,当年的最后一天

获取某个月中的第一天和最后一天&某个月的天数 public static void main(String args[]){int month 2;// 2月Calendar cal Calendar.getInstance();cal.set(Calendar.YEAR, 2022);cal.set(Calendar.MONTH, month - 1);int max cal.getActualMaximum(Calendar.DATE);int…

python使用loaddata_Python中LOADDATAINFILE语句导入数据(txt)进入MySQL的一些注意事项...

问题&#xff1a;ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ROW 1 at line 1")代码如下&#xff1a;# -*- coding: utf-8 -*-"&quo…

SimpleDateFormat 日期格式化,以及sdf.parse(“2022-02-30“)顺序加问题

时间日期标识符&#xff1a; yyyy&#xff1a;年 MM&#xff1a;月 dd&#xff1a;日 hh&#xff1a;1~12小时制(1-12) HH&#xff1a;24小时制(0-23) mm&#xff1a;分 ss&#xff1a;秒 S&#xff1a;毫秒 E&#xff1a;星期几 D&#xff1a;一年中的第几…

SimpleDateFormat的线程不安全问题

一、前言 日期的转换与格式化在项目中应该是比较常用的了 一个问题&#xff1a;项目中的日期转换怎么用的&#xff1f;SimpleDateFormat 用过吗&#xff1f;能说一下 SimpleDateFormat 线程安全问题吗&#xff0c;以及如何解决&#xff1f; 回答&#xff1a;平时就是在全局定…