dubbo系列(一)

进入官网之后,找到

http://dubbo.apache.org/en-us/docs/user/quick-start.html

有一个链接跳转到这里

http://dubbo.apache.org/en-us/docs/admin/install/provider-demo.html

使用git将项目下载下来

修改如下Service实现类

 1 /*
 2  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  * contributor license agreements.  See the NOTICE file distributed with
 4  * this work for additional information regarding copyright ownership.
 5  * The ASF licenses this file to You under the Apache License, Version 2.0
 6  * (the "License"); you may not use this file except in compliance with
 7  * the License.  You may obtain a copy of the License at
 8  *
 9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.dubbo.demo.provider;
18 
19 import org.apache.dubbo.demo.DemoService;
20 import org.apache.dubbo.demo.TestForm;
21 import org.apache.dubbo.rpc.RpcContext;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 
25 import java.text.SimpleDateFormat;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.Date;
29 import java.util.List;
30 
31 public class DemoServiceImpl implements DemoService {
32     private static Logger logger= LoggerFactory.getLogger(DemoServiceImpl.class);
33     @Override
34     public String sayHello(String name) {
35         System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
36         return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
37     }
38 
39     @Override
40     public List<TestForm> tranForm(TestForm testForm) {
41         if(testForm==null){
42             return Collections.emptyList();
43         }
44         logger.info("当前在{} 执行",RpcContext.getContext().getLocalAddress());
45         List<TestForm> testFormList=new ArrayList<>(1);
46         testFormList.add(testForm);
47         return testFormList;
48     }
49 
50 }
tranForm()是我新增的,TestForm 是一个普通的实体类
public class TestForm implements Serializable{
    private boolean b;
    private String s;
    private Integer i;
    private BigDecimal bigDecimal;
    private  Double d;
//这里省略get set方法 构造方法
}

修改dubbo-demo/dubbo-demo-consumer/的Consumer

 1 /*
 2  * Licensed to the Apache Software Foundation (ASF) under one or more
 3  * contributor license agreements.  See the NOTICE file distributed with
 4  * this work for additional information regarding copyright ownership.
 5  * The ASF licenses this file to You under the Apache License, Version 2.0
 6  * (the "License"); you may not use this file except in compliance with
 7  * the License.  You may obtain a copy of the License at
 8  *
 9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package org.apache.dubbo.demo.consumer;
18 
19 import com.alibaba.fastjson.JSON;
20 import org.apache.dubbo.demo.DemoService;
21 import org.apache.dubbo.demo.TestForm;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24 import org.springframework.context.support.ClassPathXmlApplicationContext;
25 
26 import java.math.BigDecimal;
27 import java.util.List;
28 
29 public class Consumer {
30     private static Logger logger= LoggerFactory.getLogger(Consumer.class);
31 
32     /**
33      * To get ipv6 address to work, add
34      * System.setProperty("java.net.preferIPv6Addresses", "true");
35      * before running your application.
36      */
37     public static void main(String[] args) {
38         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
39         context.start();
40         DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
41         int i=10;
42         while (i-->0) {
43             try {
44                 List<TestForm> testFormList = demoService.tranForm(new TestForm(true,"s",i,new BigDecimal(99),null)); // call remote method
45                 logger.info("序号:{}:返回内容:{}",i,JSON.toJSON(testFormList)); // get result
46             } catch (Throwable throwable) {
47                 throwable.printStackTrace();
48             }
49         }
50     }
51 }

 

修改 <dubbo:protocol name="dubbo" port="端口号"/> 运行Provider中的main方法 ,依次启动三个provider服务,端口号分别是 20880,20881,20882

运行Consumer中main方法,查看日志可以看出,Consumer分布式调用Provider已经成功了

 

 这个demo中,一共有三个模块

dubbo-demo-api 定义Service接口

dubbo-demo-consumer 传递实参调用Service

dubbo-demo-provider 定义Service实现类

        在consumer配置文件中,没有定义DemoService的实现类(文件路径:dubbo-demo\dubbo-demo-consumer\src\main\resources\META-INF\spring\dubbo-demo-consumer.xml)

而与DemoService相关的有这样的一个配置,我猜是dubbo创建了DemoService的bean并且放到了spring容器里,下面证实一个我的猜想:

 <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>

通过日志输入demoService的类型

logger.info("demoService实际类型:{}",demoService.getClass().getName());
[28/09/18 11:29:58:058 CST] main  INFO consumer.Consumer: demoService实际类型:org.apache.dubbo.common.bytecode.proxy0

打开 org.apache.dubbo.common.bytecode.Proxy 类,可以看到代理就是在这里创建的,继承了org.apache.dubbo.common.bytecode.Proxy抽象类

 

那么这个代理有什么用呢?未完待续

 

posted @ 2018-09-28 15:59  LDDXFS  阅读(658)  评论(0编辑  收藏  举报