目前的dubbo已支持和springboot集成,还是之前的例子,这次我们通过springboot容器来实现。借此了解一下基于springboot容器启动的dubbo的配置及使用。
1. 准备工作
创建一个Maven空项目,作为项目的父工程,此工程的子项目基于Spring Boot 2.0.5 实现
在父工程的pom.xml引入之后要创建的子工程
<modules> <module>gmall-interface</module> <module>user-service-provider</module> <module>order-service-consumer</module> </modules>
可以提前看一下工程结构
下面分别来实现子工程:(子工程的实现方式都是在gmall工程下新建Module)
2. 公共API
项目中共用的接口和POJO类,代码和之前一样,这里不再展开
3. 服务提供者
工程结构如下
引入依赖
<!-- 引入公共API,以实现其接口 --> <dependency> <groupId>com.zang</groupId> <artifactId>gmall-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 引入spring-boot-starter以及dubbo和curator的依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <!-- Spring Boot相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
需要注意的是,根据jdk和Spring Boot版本的不同,dubbo-spring-boot-starter的版本需要有根据的选择
dubbo提供了@Service注解,可将类声明为提供方,省去了大量配置的麻烦
import com.alibaba.dubbo.config.annotation.Service; import com.zang.gmall.bean.UserAddress; import com.zang.gmall.service.UserService; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; @Service //属于Dubbo的@Service注解,非Spring 作用:暴露服务 @Component public class UserServiceImpl implements UserService { @Override public List<UserAddress> getUserAddressList(String userId) { //省略 }}
通过属性配置的方式设置application.properties
#当前服务/应用的名字 dubbo.application.name=user-service-provider
#注册中心的协议和地址 dubbo.registry.protocol=zookeeper dubbo.registry.address=127.0.0.1:2181
#通信规则(通信协议和接口) dubbo.protocol.name=dubbo dubbo.protocol.port=20880
#连接监控中心 dubbo.monitor.protocol=registry #开启包扫描,可替代 @EnableDubbo 注解 ##dubbo.scan.base-packages=com.zang.gmall
<!-- 监控中心配置 -->
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
<!-- 直连监控中心服务器地址,如:address="192.168.3.71:7070"-->
<dubbo:monitor protocol="registry"/>
————————————————
springboot容器根据配置启动服务提供方,这里需要添加 @EnableDubbo 注解
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 开启基于注解的dubbo功能(主要是包扫描@DubboComponentScan) // 也可以在配置文件中使用dubbo.scan.base-package来替代 @EnableDubbo @EnableDubbo @SpringBootApplication public class UserServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(UserServiceProviderApplication.class, args); } }
提供方顺利启动
4. 服务消费者
消费者工程在初始化时设置为web项目,结构如下
引入和服务提供方同样的依赖,除此之外,添加springboot web模块的依赖。
<!-- springboot web模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
dubbo提供了@Reference注解,可替换@Autowired注解,用于引入远程服务
import com.alibaba.dubbo.config.annotation.Reference; import com.zang.gmall.bean.UserAddress; import com.zang.gmall.service.OrderService; import com.zang.gmall.service.UserService; import org.springframework.stereotype.Service; import java.util.List; @Service public class OrderServiceImpl implements OrderService { @Reference UserService userService; @Override public List<UserAddress> initOrder(String userId) { //代码省略 }
}
配置文件application.properties
#避免和监控中心端口冲突,设为8081端口访问 server.port=8081 dubbo.application.name=order-service-consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.monitor.protocol=registry
启动类同样加上@EnableDubbo注解
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubbo @SpringBootApplication public class OrderServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceConsumerApplication.class, args); } }
为查看调用是否成功,新增控制层用于访问
import com.zang.gmall.bean.UserAddress; import com.zang.gmall.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller public class OrderController { @Autowired OrderService orderService; @ResponseBody //以json格式返回 @RequestMapping("/initOrder") public List<UserAddress> initOrder(@RequestParam("uid") String userId){ return orderService.initOrder(userId); } }
5. 测试调用
启动消费方,在浏览器访问
调用成功
附:springboot也允许引用xml文件配置,方法是在启动类中加入如下注解
//@EnableDubbo //引入配置信息 @ImportResource(locations="classpath:provider.xml") @SpringBootApplication public class UserServiceProviderApplication { //略 }