阿里巴巴网站建设哪家好,阿里云域名查询和注册,做教案找资料有哪些网站,市北网站建设 一般情况我们使用dubbo)通过rpc调用dubbo提供方的服务#xff0c;首先要在消费者的项目中引入接口提供者的jar包#xff08;provider端暴露的接口和方法#xff09;#xff0c;然后使用jar包里面的类和方法#xff0c;两端才能正常通信调用。但是如果要调N个不同服务提… 一般情况我们使用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){ReferenceConfigGenericService reference new ReferenceConfigGenericService();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*/ResponseBodyRequestMapping(value /getUser)public Map getUser(){//构造参数,用Map表示POJO参数如果返回值为POJO也将自动转成MapMapString, 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.registerfalseReference(timeout 3000,urldubbo://localhost:20880)
IDubboDemoService dubboDemoService;