dubbo里面的GenericService干啥的

本文详细介绍了Dubbo框架中泛化服务的实现原理,包括泛化服务和泛化引用的工作机制。通过实例展示了如何配置泛化服务,以及消费者如何通过泛化引用调用服务,无需关注具体接口和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个用途一直是泛化服务,一种是泛化引用。前者是为了provider省事,后者是消费者省事。先介绍泛化服务怎么做到的:

比如提供者想省事,虽然提供了10个方法,但是不想在接口里面写十个方法,也就不用给这十个方法做函数声明、参数声明了。直接通过:

ServiceConfig<GenericService> service = new ServiceConfig<GenericService>();
        service.setApplication(new ApplicationConfig("generic-provider"));
        service.setRegistry(new RegistryConfig("N/A"));
        service.setProtocol(new ProtocolConfig("dubbo", 29581));
        service.setInterface(DemoService.class.getName());
        service.setRef(new GenericService() {

            public Object $invoke(String method, String[] parameterTypes, Object[] args)
                    throws GenericException {
                if ("sayName".equals(method)) {
                    return "Generic " + args[0];
                }
                if ("throwDemoException".equals(method)) {
                    throw new GenericException(DemoException.class.getName(), "Generic");
                }
                if ("getUsers".equals(method)) {
                    return args[0];
                }
                return null;
            }
        });
        service.export();

  也就是通过method不同,直接返回不同处理结果,隐藏了方法和参数声明。上面虽然 service.setInterface(DemoService.class.getName()),这里传入的是接口的str名称。也就是说通过generic,provider已经完全不依赖interface了,只是用到这个接口的名称字符串用做servericekey用的。

 

之所以能这样操作,消费者在调用的时候,需要在url里面指定generic=true,那么在经过filter链的时候,在GenericImplFilter会做generic处理

把method-name设置成$invoke

parameter-types由于提供者不一定有,于是传入类型的string类型。

args按照pojo或者java-bean进行序列化成一个map,里面指定了参数的class类型、每个filed的value。

 

provider不会把这个map做逆序列化处理,直接原样返回这个map,所以可以看到这个generic的provider能够处理的东西比较有限。消费者在得到结果的时候,依然是一个map,那么在GenericImplFilter里面,把invoke得到的结果逆序列化成具体的对象。也就是说由GenericImplFilter序列化成一个map,你自己负责逆序列化。

 

 

 

对于泛化引用的话,例子如下:

 

ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
            reference.setApplication(new ApplicationConfig("generic-consumer"));
            reference.setInterface(DemoService.class);
            reference.setUrl("dubbo://127.0.0.1:29581?scope=remote");
            reference.setGeneric(true);
            GenericService genericService = reference.get();
            try {
                List<Map<String, Object>> users = new ArrayList<Map<String, Object>>();
                Map<String, Object> user = new HashMap<String, Object>();
                user.put("class", "com.alibaba.dubbo.config.api.User");
                user.put("name", "actual.provider");
                users.add(user);
                users = (List<Map<String, Object>>) genericService.$invoke("getUsers", new String[]{List.class.getName()}, new Object[]{users});
                

  

消费者直接使用$invoke方法,不用考虑provider到底提供了哪些方法,通过字符串getuser调用,参数类型也不用关心,直接用map描述参数的类型和value。

provider在被调用的时候,还是GenericImplFilter这个filter里面,由provider通过map进行逆序列化,毕竟provider提供的方法里面是按照这个参数类型进行处理的,所以必须从map转化成真正的类型,处理完成以后,还要逆序列化成map才能返回给consumer,因为consumer只认识map,不认识具体参数类型。

 

转载于:https://www.cnblogs.com/notlate/p/10127942.html

### Dubbo 和 ZooKeeper 的作用 #### Dubbo 的角色 Dubbo 是一款高性能的 Java RPC 框架,主要用于构建分布式服务架构。其核心功能在于提供高效的服务调用机制和服务治理能力,包括但不限于远程过程调用、负载均衡、集群容错等功能[^1]。 #### ZooKeeper 的职责 ZooKeeper 则是一个分布式的协调服务工具,能够帮助开发者轻松管理配置信息、命名服务、同步服务等。特别是在分布式环境中,ZooKeeper 可以为应用程序提供可靠的数据存储,并确保数据的一致性和高可用性[^2]。 ### 协同工作机制 当 Dubbo 与 ZooKeeper 结合使用时,后者充当注册中心的角色,负责维护所有服务实例的状态信息及其位置详情。具体来说: - **服务注册**:每当一个新的服务启动并加入到网络中时,它会向 ZooKeeper 注册自己的存在,即写入相应的节点路径和元数据(如主机名、端口号)。这样做的好处是可以让其他成员快速定位该新成员的位置。 - **服务发现**:消费者应用通过查询 ZooKeeper 来获取目标服务提供商的具体地址列表。一旦找到合适的提供者之后,则可以直接发起请求建立连接完成通信操作。此外,如果某个提供者的状态发生变化(比如下线),这些变动也会被及时通知给所有的订阅方以便做出相应调整。 ```java // 示例代码展示如何在 Spring Boot 中集成 Dubbo 和 ZooKeeper @Configuration public class DubboConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig config = new ApplicationConfig(); config.setName("demo-provider"); return config; } @Bean public RegistryConfig registryConfig() { RegistryConfig config = new RegistryConfig(); config.setAddress("zookeeper://localhost:2181"); // 设置 ZooKeeper 地址 return config; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值