第五课:调用模块源码分析1

preview
需积分: 0 0 下载量 34 浏览量 更新于2022-08-08 收藏 51KB DOCX 举报
【第五课:调用模块源码分析1】 本课主要探讨了Dubbo框架中的非典型使用场景,包括泛化提供(Generic Service)、泛化引用(Generic Reference)以及隐式参数传递(Implicit Argument Passing)。这些特性使得开发者在面对特定需求时能更加灵活地使用Dubbo。 一、Dubbo 调用非典型使用场景 1. 泛化提供 & 引用: 泛化提供是一种特殊的暴露服务的方式,它不需要明确的接口定义,而是直接将服务实例暴露出去。这在Mock框架或服务降级场景中特别有用。下面是一个示例代码演示如何创建一个泛化服务: ```java public static void doExportGenericService() { // 创建应用配置 ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("demo-provider"); // 创建注册中心配置 RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("192.168.0.147:2181"); // 创建协议配置 ProtocolConfig protocol = new ProtocolConfig(); protocol.setPort(-1); protocol.setName("dubbo"); // 创建通用服务实现 GenericService demoService = new MyGenericService(); // 创建服务配置 ServiceConfig<GenericService> service = new ServiceConfig<>(); // 设置弱类型接口名 service.setInterface("com.tuling.teach.service.DemoService"); // 指向通用服务实现 service.setRef(demoService); // 添加应用和注册中心配置 service.setApplication(applicationConfig); service.setRegistry(registryConfig); service.setProtocol(protocol); // 暴露并注册服务 service.export(); } ``` 泛化引用则是不通过常规接口调用服务的方式,适用于测试框架。下面是一个创建泛化引用的示例: ```java ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("demo-provider"); RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("192.168.0.147:2181"); ReferenceConfig<GenericService> reference = new ReferenceConfig<>(); reference.setInterface("com.tuling.teach.service.DemoService"); // 声明为泛化接口 reference.setGeneric(true); reference.setApplication(applicationConfig); reference.setRegistry(registryConfig); // 获取引用并调用 GenericService genericService = reference.get(); Object result = genericService.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"world"}); ``` 2. 隐示传参: 隐示传参允许通过非方法参数传递额外的数据,类似于HTTP调用中的cookie。这种技术常用于分布式追踪系统,确保数据在整个请求链路中的传递。以下是如何使用隐示传参的示例: ```java // 客户端设置隐示参数 RpcContext.getContext().setAttachment("index", "1"); // 服务端获取隐示参数 String index = RpcContext.getContext().getAttachment("index"); ``` 二、令牌验证: 通过令牌验证可以在注册中心层面控制权限,只允许有合法令牌的消费者获取服务。这种方式可以防止非法调用和保护服务安全。实现方式通常涉及在调用服务前检查令牌的有效性,如果验证失败,则拒绝服务请求。 总结,Dubbo的非典型使用场景展示了其强大的灵活性和可扩展性。泛化提供和引用简化了接口和服务的处理,隐示传参提供了数据传递的便利,而令牌验证则增强了服务的安全性。理解并熟练掌握这些特性,将有助于在实际项目中更好地运用和优化Dubbo服务。
航知道
  • 粉丝: 32
  • 资源: 301
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜