最近公司的一个分布式系统想要尝试迁移到Dubbo,项目本身是Spring Boot的,经过一些努力,最终也算是搭建起一个基础的框架了,放到这里记录一下。需要依赖一个外部的zookeeper。
源码地址:点我
项目结构:
Maven构建的Spring Boot 多模块项目,provide为服务提供者,开放出接口供外部访问;consume为服务消费者,RPC调用provide提供的服务。
Provide
Dubbo配置类:
@Configuration @PropertySource("classpath:dubbo/dubbo.properties") @ImportResource({ "classpath:dubbo/*.xml" }) public class DubboConfig { }
在resources下新建dubbo文件,并添加 dubbo-provider.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="${dubbo.application.name}"/> <dubbo:registry protocol="${dubbo.registry.protocol}" address="${dubbo.registry.address}"/> <dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}"/> <dubbo:service interface="com.csonezp.TestService" ref="testService" retries="0" timeout="6000"/> beans>
dubbo.properties文件:
#应用名称 dubbo.application.name=example-provider #注册中心类型 dubbo.registry.protocol=zookeeper #注册中心地址 dubbo.registry.address=127.0.0.1:2181 #暴露服务方式 dubbo.protocol.name=dubbo #暴露服务端口 dubbo.protocol.port=20880
com.csonezp.TestService:
public interface TestService { String test(); }
TestServiceImpl:
@Service("testService") public class TestServiceImpl implements TestService { @Override public String test() { return "message from provide"; } }
xml文件中的 ref="testService" 很重要,后面consume需要通过这个来进行RPC访问。
Consume
Dubbo配置类:
/** * Created by csonezp on 2017/9/14. */ @Configuration @PropertySource("classpath:dubbo/dubbo.properties") @ImportResource({ "classpath:dubbo/*.xml" }) public class DubboConfig { }
在resources下新建dubbo目录,添加dubbo-consume.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="${dubbo.application.name}"/> <dubbo:registry protocol="${dubbo.registry.protocol}" address="${dubbo.registry.address}"/> <dubbo:reference id="testService" interface="com.csonezp.TestService"/> beans>
这个id 就是Provide里设置的ref,不要错了;
dubbo.properties文件:
#应用名称
dubbo.application.name=example-consume
#注册中心类型
dubbo.registry.protocol=zookeeper
#注册中心地址
dubbo.registry.address=127.0.0.1:2181
TestService:
/**
* Created by csonezp on 2017/9/14.
*/
public interface TestService {
String test();
}
仅需要一个接口,不需要实现,通过远程调用来调用Provide的具体实现;
TestController:具体测试入口,调用远程Provide的实现:
@RestController
public class TestController {
@Autowired
TestService testService;
@RequestMapping("/test")
public Object test() {
return testService.test();
}
}
还需要修改一下consume的端口,防止冲突,在consume的application.properties加入:
server.port=8081
现在将Provide和Consume都启动,然后访问 localhost:8081/test,这时会得到:
可知项目已经正确的执行了远程调用。