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;比如《王者荣耀》《炉石传说》《纪念…

SpringBoot读取resource或template中的文件

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

关于使用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 …

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

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

SimpleDateFormat的线程不安全问题

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

JVM——System.gc、内存溢出、内存泄漏、STW、安全点、安全区域、强软弱虚引用

文章目录①. System.gc()的理解②. 内存溢出(out of Memory)③. 内存泄漏(Memory Leak)④. Stop The World⑤. 多线程中的并行与并发⑥. 垃圾回收的并行、串行、并发⑦. 安全点(Safepoint)⑧. 安全区域(Safe Region)⑨. 引用①. 强引用:不回收②. 软引用: 内存不足即回收③. 弱…

Java——ThreadLocal概述、解决SimpleDateFormat出现的异常、内存泄漏、弱引用、remove方法

文章目录①. ThreadLocal简介①. ThreadLocal是什么②. api介绍③. 永远的helloword④. 通过上面代码总结②. 从阿里ThreadLocal规范开始①. 非线程安全的SimpleDateFormat②. 将SimpleDateFormat定义成局部变量(方案一)③. ThreadLocal 解决日期格式乱码问题④. 阿里规范怎么说…

JPA入门

文章目录JPA概述JPASpring Data JPAJPA注解基础注解EntityTableIdEnumeratedTransientColumnTemporal联合主键注解IdClassEmbeddable和EmbeddedId注解实体之间关联关系注解OneToOneManyToOne和OneToManyRepositoryJPA查询方式DQM&#xff08;定义查询方法&#xff09;使用实例D…

Java8——Stream流操作List排序_List集合中每个对象元素按时间顺序排序

一个学生类的实体类 Data public class Student {private Long id;private String name;private int age;private Double height;public Student(Long id, String name, int age, Double height) {this.id id;this.name name;this.age age;this.height height;}然后我们测…

java线程初始方法三种_Java 多线程 三种实现方式

Java多线程实现方式主要有三种&#xff1a;继承Thread类、实现Runnable接 口、使用ExecutorService、Callable 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值&#xff0c;只有最后一种Callable是带返回值的&#xff0c;返回结果可以从Future中取出来关于Exe…

java控制层创建websocket_用Java构建一个简单的WebSocket聊天室

前言首先对于一个简单的聊天室&#xff0c;大家应该都有一定的概念了&#xff0c;这里我们省略用户模块的讲解&#xff0c;而是单纯的先说说聊天室的几个功能&#xff1a;自我对话、好友交流、群聊、离线消息等。今天我们要做的demo就能帮我们做到这一点啦&#xff01;&#xf…

Java中Date与 LocalDateTime ,LocalDate之间的转换

Date与LocalDateTime和LocalDate互相转换思路 Date转LocalDateTime和LocalDate都可以通过Date先转换成Instant然后再转换成LocalDateTime和LocalDate&#xff0c;可以按照下图的方式进行转换。LocalDateTime和LocalDate转换成Date也是以Instant为中介来进行转换的。 1&#xff…

Spring-data-jpa入门(一)

啥是JPA 我这个小白没有听说过&#xff0c;全英文名叫Java Persistence API&#xff0c;就是java持久化api&#xff0c;是SUN公司推出的一套基于ORM的规范。 持久化想必如雷贯耳&#xff0c;都2022年了&#xff0c;谁还不用个持久化框架啊&#xff0c;举起mybatis。 ORM呢&a…

struts单例模式 java_Java单例设计模式详细介绍

Java单例设计模式教程中包含了单例模式的定义、特点以及线路安全等问题。单例模式定义&#xff1a;单例模式确保某个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例。在计算机系统中&#xff0c;线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对…

NetBeans、Eclipse 和 IDEA,哪个才是最优秀的Java IDE?

NetBeans、Eclipse 和 IDEA&#xff0c;哪个才是最优秀的Java IDE? 本文将向您介绍三种流行的Java IDE的基本特点&#xff0c;并比较它们的优缺点。 众所周知&#xff0c;集成开发环境(IDE)能够让程序员的日常编程过程&#xff0c;比起直接在文本编辑器上编写代码要容易得多。…

Spring-data-jpa入门(二)

前言 上一节我们讲解了spring-data-jpa最基础的架构和最简单的增删查改的实现&#xff0c;可以发现spring-data-jpa在简单增删查改的实现是非常友好的&#xff0c;甚至根本见不着sql语句的存在&#xff0c;让人直呼NB。 还记得上一节埋的几个坑吗&#xff0c;这一节就先把坑填…

JavaWeb学习笔记——详细

一、HTTP协议简介 1、什么是http协议 概述&#xff1a; HTTP是Hyper Text Transfer Protocol的缩写&#xff0c;即超文本传输协议。它是一种请求/响应式的协议&#xff0c;客户端在与服务器端建立连接后就可以向服务器端发送请求&#xff0c;这种请求被称作HTTP请求&#xf…

基本数据类型和包装类的区别,编程中如何选择?

问题&#xff1a;基本数据类型和包装类有什么区别吧&#xff0c;什么时候用包装类什么时候用基本数据类型&#xff1f; 最本质的区别&#xff1a;基本数据类型不是对象&#xff0c;包装类型是对象存储位置不同&#xff1a;基本类型是直接将变量值存储在栈中&#xff0c;而包装…