dubbo入门示例

  

  跟别个一样,介绍dubbo之前先介绍下软件相互架构的演变。

  • 单一应用架构,一个应用包含前后端,service、controller、dao等,如启明struts2项目;
  • 垂直应用架构,分离前后端,各是一个应用,实现MVC,如启明SpringMVC项目;
  • 分布式服务架构,将一个应用拆分到多台机器上,实现集群,利用nginx等,RPC是关键;
  • 流动计算架构,实时监测压力,提高机器利用率的调度中心,如dubbo。

  说白了,dubbo就跟webservice是一个功能,将本地的service发布到远端,使不同系统直接的服务能直接调用。

  用dubbo,先用zookeeper做注册中心。安装zookeeper的方式很简单,上传tar包,解压即可:

   

  注意修改dataDir目录为真实目录,这里的clientPort就是zookeeper提供给别人连接它的端口,我认为。

  dubbo麻烦些。

  第一步:需要下载一个dubbo-admin的工程,放到tomcat容器下,

  坑taotao工程给的dubbo-admin只能跑在jdk7下8不行,去CSDN上找的个项目;

  注意看此处dubbo的配置文件,dubbo的注册地址默认是指向zookeeper的ip和端口。

  第二步,引入dubbo相关依赖,

<!-- dubbo相关 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<exclusions>

<exclusion>

<groupId>org.springframework</groupId>

<artifactId>spring</artifactId>

</exclusion>

<exclusion>

<groupId>org.jboss.netty</groupId>

<artifactId>netty</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

</dependency>

<dependency>

<groupId>com.github.sgroschupf</groupId>

<artifactId>zkclient</artifactId>

</dependency>

第三步,写接口和接口实现类,交给dubbo,

dubbo的xmlns和xsi:

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

然后就可以写Interface和Service,交给Spring容器生成bean,再把bean交给dubbo去发布。

<!-- 自动注册该路径下的实体bean,路径包含子包路径 -->

<context:component-scan base-package="com.taotao.service"/>

<!--<bean id="itemService" class="com.taotao.service.impl.ItemServiceImpl"/>-->

 

<!-- 使用dubbo发布服务 -->

<dubbo:application name="taotao-manager"/>

<dubbo:registry protocol="zookeeper" address="192.168.124.136:2181"/>

<!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->

<dubbo:protocol name="dubbo" port="20880"/>

<dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl"/>

dubbo发布service,application即应用名称,随意,跟工程名一样即可;

registry对应zookeeper注册中心的地址,端口zookeeper的clientPort,2181;

dubbo:protocol的port是随意指定的空闲端口;

dubbo:service的interface标明发布service的类接口型,ref对应bean的id,这里由于使用了Spring的自动扫描,ref就是实现类的名字。

然后在另一个项目中,同样引入依赖,配置dubbo引用:

<!-- 引用dubbo服务 -->

<dubbo:application name="taotao-manager-web"/>

<dubbo:registry protocol="zookeeper" address="192.168.124.136:2181"/>

<dubbo:protocol name="dubbo" port="20880"/>

<!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->

<dubbo:reference interface="com.taotao.service.ItemService" id="itemService" check="true"/>

指向同一个注册中心,使用相同协议和端口,dubbo:reference同一个接口,id是controller里实例名;

然后开始测试,先启动provider端,

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration({"/spring/applicationContext-*.xml"})

public class JunitTest {

@Autowired

private ItemService itemService;

@Test

public void c1() {

TbItem item = itemService.getItemById(536563);

System.out.println(item.getTitle() );

while(true){}

}

}

利用Spring-test和Junit4,加载applicationContext配置文件,利用死循环让服务不停止,其他阻塞的方式亦可。

打开dubbo-admin的监控界面(用户名root,密码root),

 

发现提供者多了一行信息,点开详情:

 

说明发布成功。

然后启动consumer的web工程taotaomanager-web,

 

说明消费者端启动成功。

访问web工程taotaomanager-web,测试刚刚的ItemService,

controller代码:

@Autowired

private ItemService itemService;

@RequestMapping("/item/list")

@ResponseBody

public EasyUIDataGridResult getItemList(Integer page, Integer rows) {

EasyUIDataGridResult result = itemService.getItemList(page, rows);

TbItem tbItem = itemService.getItemById(536563);

return result;

}

pom.xml配置:

<build>

<plugins>

<plugin>

<groupId>org.eclipse.jetty</groupId>

<artifactId>jetty-maven-plugin</artifactId>

<version>9.3.13.v20161014</version>

<configuration>

<httpConnector>

<port>8899</port>

</httpConnector>

<webAppConfig>

<contextPath>/</contextPath>

</webAppConfig>

</configuration>

</plugin>

</plugins>

</build>

访问成功界面:

 

坑:凡是通过dubbo传输的对象,必须实现Serializable接口,保证可被序列化。

最后:

其实dubbo-admin应该是可以不用的,只是一个监控工程,可有可无;

如果不自己搭建注册中心,可以使用multicast广播地址,固定为:

<dubbo:registry address="multicast://224.5.6.7:1234"/>

估计这个IP是阿里提供的。

思考: 如果不用dubbo,可以实现java项目通信吗?

直接java代码,A系统调用B系统的服务,基于springMVC。调用可以用HttpUrlConnection或者HttpClient。

原文地址:https://www.cnblogs.com/cherishBlueSky/p/10083433.html