DUBBO是阿里巴巴开源的RPC框架,按照官网的说明可以很轻松的与spring搭建一个分布式服务。
DUBBO的官网:http://dubbo.io/
我使用的dubbo版本是dubbo-2.5.6,zookeeper版本是zookeeper3.4.11,spring版本是spring-4.3.13
dubbo-admin-2.5.8.war,是我在官网下载的,丢进tomcat就能跑起来,下载链接在最下面
其他依赖的jar包:
javassist-3.22.0-GA.jar netty-3.9.9.Final.jar slf4j-api-1.7.9.jar slf4j-simple-1.7.9.jar zkclient-0.10.jar
截个图:
jar包版本搞定之后,spring的配置文件和代码其实是很简单的。
服务端demo源码:https://gitee.com/zhuhongliang/dubboSpringStudy
客户端demo源码:https://gitee.com/zhuhongliang/dubboStudy
dubbo-admin后台管理可以对分布式服务做各种配置,集群的负载均衡权重等等,很丰富。
dubbo-admin-2.5.8.war,文件在dubboStudy项目的根目录下载。
先做一个服务端的:
一个接口,一个接口实现类,一个spring配置xml就搞定。
接口:
package com.zhl.service; /** * @author 朱宏亮 * @version 创建时间:2018年1月10日 上午10:42:26 * 类说明 */ public interface ProviderService { public String hello(String name); public String say(String name); }
实现接口:
package com.zhl.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; /** * @author 朱宏亮 * @version 创建时间:2018年1月10日 上午11:04:16 * 类说明 */ @Service("providerService") public class ProviderServiceImpl implements ProviderService{ Logger logger = LoggerFactory.getLogger(ProviderServiceImpl.class); @Override public String hello(String name) { logger.info("方法hell"); return "服务器8081welcome :"+name+" !" ; } @Override public String say(String name) { logger.info("方法say"); return "服务器8081你好 : "+name+" !" ; } }
spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.zhl.service" />
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="zhl_provider" />
<!-- 使用zookeeper注册中心暴露服务地址
dubbo:registry 标签一些属性的说明:
1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
2)check注册中心不存在时,是否报错。
3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
4)timeout注册中心请求超时时间(毫秒)。
5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
-->
<dubbo:registry address="zookeeper://192.168.1.129:2181" subscribe="false" register=""/>
<!-- 用dubbo协议在20880端口暴露服务 sticky粘滞连接-->
<dubbo:protocol name="dubbo" port="20880" sticky="true" />
<!-- 声明需要暴露的服务接口
dubbo:service标签的一些属性说明:
1)interface服务接口的路径
2)ref引用对应的实现类的Bean的ID
3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
4)register 默认true ,该协议的服务是否注册到注册中心。
-->
<dubbo:service interface="com.zhl.service.ProviderService" ref="providerService" cluster="failover"/>
<!-- 具体的实现bean -->
<!-- 使用spring的@Service注解
<bean id="providerService" class="com.zhl.service.ProviderServiceImpl" />
-->
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.zhl.service.UserService" ref="userService" />
</beans>
需要提供多少个服务,就向zookeeper暴露多少个服务接口(dubbo:service)就行了
其他基本的springmvc的文件我就不贴出来了,不会的话下源码看。文章的最后有源码链接。
就这样打包丢进tomcat就能跑起来了。
消费端:在客户端需要一个和服务端一模一样的接口文件,不需要具体实现类文件。客户端向zookeeper获取服务端暴露的服务地址,然后和服务端连接,访问服务接口和具体方法。
xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="zhl-consumer"/> <!-- 使用zookeeper注册中心暴露服务地址 dubbo:registry 标签一些属性的说明: 1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。 2)check注册中心不存在时,是否报错。 3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。 4)timeout注册中心请求超时时间(毫秒)。 5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。 --> <dubbo:registry address="zookeeper://192.168.1.129:2181" register="false" /> <!-- 1)interface调用的服务接口 2)check 启动时检查提供者是否存在,true报错,false忽略 3)registry 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔 4)loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用 --> <dubbo:reference id="providerService" interface="com.zhl.service.ProviderService" /> <dubbo:reference id="demoService" interface="com.zhl.service.DemoService" /> <dubbo:reference id="userService" interface="com.zhl.service.UserService" /> </beans>
客户端代码:
package com.zhl.consumer; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zhl.service.DemoService; import com.zhl.service.ProviderService; import com.zhl.service.User; import com.zhl.service.UserService; /** * @author 朱宏亮 * @version 创建时间:2018年1月9日 上午10:10:33 * 类说明 */ public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"conf/consumer.xml"}); //for(int i =0;i <10;i++){ context.start(); /* // obtain proxy object for remote invocation DemoService demoService = (DemoService) context.getBean("demoService"); // execute remote invocation String hello = demoService.sayHello("world"); // show the result System.out.println(hello); */ UserService userService = (UserService) context.getBean("userService"); User user = userService.getUser(); System.out.println("id:"+user.getId()+"\t name:"+user.getName()+"\t phone:"+user.getPhone()+"\t address:"+user.getAddress()); user.setId(88); user.setName("朱宏亮"); user.setPhone("18627888889"); user.setAddress("中关村软件园"); userService.setUser(user); User user2 = userService.getUser(); System.out.println("user2 id:"+user2.getId()+"\t user2 name:"+user2.getName()+"\t user2 phone:"+user2.getPhone()+"\t user2 address:"+user2.getAddress()); ProviderService providerService = (ProviderService)context.getBean("providerService"); String msg = providerService.hello("zhl"); System.out.println(msg); String msg2 = providerService.say("朱宏亮"); System.out.println(msg2); //} //context.close(); //System.exit(0); } }
其实这个东西的基本功能的使用就是这么简单,而且官方文档也特别详细,最关键的还是中文文档。
服务端demo源码:https://gitee.com/zhuhongliang/dubboSpringStudy
客户端demo源码:https://gitee.com/zhuhongliang/dubboStudy
dubbo-admin后台管理可以对分布式服务做各种配置,集群的负载均衡权重等等,很丰富。
dubbo-admin-2.5.8.war,文件在dubboStudy项目的根目录下载。
下面是:管理后台dubbo-admin的截图: