跟别个一样,介绍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。