阅读 16

Dubbo笔记(三)

服务应用

服务端将IP,port,Interface,method暴露给消费端。消费者拿到这些信息就可以通过网络来调用服务端的API。

消费端用API调用

public static void main(String[] args) {
		// 当前应用配置
		ApplicationConfig application = new ApplicationConfig();
		application.setName("consumer-of-helloworld-app");
		Map<String, String> appParameters = new HashMap<String, String>();
		appParameters.put("qos.enable", "false");
		application.setParameters(appParameters);

		// 连接注册中心配置
		RegistryConfig registry = new RegistryConfig("224.5.6.7:1234", "multicast");
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("unicast", "true");
		//registry.setParameters(parameters);

		// 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
		// 引用远程服务
		// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
		ReferenceConfig<OrderService> reference = new ReferenceConfig<OrderService>();
		reference.setApplication(application);
		reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
		reference.setInterface(OrderService.class);
		reference.setTimeout(2000);
		reference.setVersion("1.0.0");
		
		ReferenceConfigCache cache = ReferenceConfigCache.getCache();

		// 和本地bean一样使用demoService
		OrderService demoService = cache.get(reference); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
		OrderModel order = new OrderModel();
		order.setOrderName("充值订单");
		order.setOrderType(1);
		order.setUserId("12306");
		String orderNo = demoService.createOrder(order);
		logger.debug("获得订单编号:"+orderNo);
		
		try {
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
复制代码

入口就在cache.get(reference)方法中

初始化方法中做一些参数的检查,关键的是创建代理的方法
看最后的返回值,再去看看Invoker都是怎么处理的

tmp的
injvm的
读取注册中心
在loadRegistries中

现在看refer()方法在RegistryProtocol中。在refer()中doRefer();

最后返回一个伪装的Invoker,每个实现类就是将Invoker传入对象中

new InvokerInvocationHandler(invoker)中的invoke()方法最后会调到FailoverClusterInvoker这个类的doInvoker()方法,在FailoverClusterInvoker的父类AbstractClusterInvoker中也会调用doInvoker()

开启客户端连接

通过目录查看

多个url通知notify() 路由的,配置的等
看最后的如何将url变成invoker

在 toInvokers()方法中的 invoker = new RegistryDirectory.InvokerDelegate(this.protocol.refer(this.serviceType, url), url, providerUrl); 根据protocol的创建不同的Invoker。

默认的dubbo,进入DubboInvoker找到doInvoker()发起通信了 通过protocol的refer里面的getClient()

走到了NettyTransporters中

关注下面的标签,发现更多相似文章
评论