springBoot 整合 dubbo
导入dubbo的springBoot启动器依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
springBoot整合dubbo
springBoot整合dubbo的方式有三种:
1.通过application.properties(yml)配置属性,使用dubbo 提供的@Service注解暴露服务。使用dubbo提供
@Reference注解来引用服务(调用远程的类)。通过@EnableDubbo注解来开启dubbo的自动化配置。
2.通过dubbo.xml来配置dubbo服务,通过@ImportResource注解导入dubbo配置
3.采用API的方式声明dubbo配置类。把dubbo中的每一个属性通过@Bean加入IOC容器中
配置文件覆盖原则
优先级:jvm 虚拟机参数 > xml配置 > properties(yml)配置
整合案例(基于配置文件和xml形式)
前提:配置好zookeeper+dubbo admin+ dubbo monitor
software:http://stack-blog.oss-cn-beijing.aliyuncs.com/code/dubbo/software.zip
- 首先要创建公共API接口(dubbo 是基于接口的远程调用,所以要提供公共接口为服务提供者和消费者使用)-动态代理
- 编写服务提供者+配置文件
- 编写服务消费者+配置文件
目录结构说明:
public-interface 公共接口
dubbo-consumer 服务消费方(配置文件)
dubbo-provider 服务提供者(配置文件)
service-consumer 服务消费者 (xml)
service-provider 服务提供者(xml)
完整代码:http://stack-blog.oss-cn-beijing.aliyuncs.com/code/dubbo/code.zip
配置文件:
1.provider
dubbo:
# 配置应用的元数据信息
application:
name: dubbo-provider
environment: develop
# 配置注册中心zookeeper
registry:
address: 127.0.0.1:2181
protocol: zookeeper
# 配置监控中心
monitor:
address: 127.0.0.1:8080
# 表示监控中心通过注册中心连接dubbo服务
protocol: registry
# 配置服务提供者信息
protocol:
name: dubbo # 配置远程服务调用的协议
port: 20880 # 配置服务的端口号
provider:
timeout: 3000 # 配置服务提供者超时时间
retries: 3 # 消费者调用失败重试次数
version: 1.0 # 配置服务的版本号
2.comsumer
server:
port: 8081
dubbo:
application:
name: dubbo-consumer
environment: develop
# 配置注册中心(从注册中心获取服务提供者列表)
registry:
protocol: zookeeper
address: 127.0.0.1:2181
check: true # 开启注册订阅失败报错
# 配置监控中心(通过注册中心来获取服务信息,不采用dubbo直连的方式)
monitor:
protocol: registry
consumer:
check: false # 关闭服务启动时没有服务提供者报错
说明:
在配置dubbo的时候服务提供者和消费者都有一些公共基本的配置:application(应用信息),registry(注册中心),monitor(监控中心)
服务提供方一些关于提供方的公有信息通过 provider进行配置,关于提供的服务更细粒度的信息主要是通过@Service这个dubbo注解进行配置,它细化到了接口级别。@Service注解实现的功能是远程服务信息的配置,出现在类上,它并不能把这个类加入IOC容器。为了防止冲突,使用@Component注解加入IOC容器
消费方一些公有的属性通过consumer进行配置,更细粒度的配置主要通过@Reference进行配置(接口级别),@Reference实现的作用包括两方面(Java Bean的注入+引用远程服务)
3.实例:
package com.stack.dubboprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.stack.dubbo.bean.UserAddress;
import com.stack.dubbo.service.UserService;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* 服务提供者
* "@Service"注解是来自dubbo服务提供方注解,属于接口级别的注解(接口级别的注解优先级要高于配置文件)
* @author stack
*/
@Service(timeout = 2000,version = "1.0")
@Component
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
return Arrays.asList(address1,address2);
}
}
package com.stack.dubboconsumer.service.impl;
import java.util.List;
import com.alibaba.dubbo.config.annotation.Reference;
import com.stack.dubbo.bean.UserAddress;
import com.stack.dubbo.service.OrderService;
import com.stack.dubbo.service.UserService;
import org.springframework.stereotype.Service;
/**
* dubbo服务的消费方
* @author stack
*/
@Service
public class OrderServiceImpl implements OrderService {
/**
* 接口级别优先级高于配置文件
*/
@Reference(version = "1.0",check = false)
UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
// TODO Auto-generated method stub
System.out.println("用户id:"+userId);
//1、查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress : addressList) {
System.out.println(userAddress.getUserAddress());
}
return addressList;
}
}
package com.stack.dubboconsumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author stack
*/
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
注意点:@EnableDubbo开启dubbo自动化配置
xml
1.provider
<?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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--dubbo 应用信息配置-->
<dubbo:application name="service-provider"></dubbo:application>
<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
<!--dubbo 注册中心配置-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!--dubbo 监空中心配置-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--服务提供的配置-->
<dubbo:service interface="com.stack.dubbo.service.UserService" ref="userService" timeout="3000" version="2.0">
<dubbo:method name="getUserAddressList" timeout="3000"></dubbo:method>
</dubbo:service>
<!--服务提供方统一配置-->
<dubbo:provider timeout="3000" retries="3" version="2.0"></dubbo:provider>
</beans>
2.consumer
<?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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--dubbo 应用信息配置-->
<dubbo:application name="service-consumer"></dubbo:application>
<!--dubbo 注册中心配置-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!--dubbo 监空中心配置-->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--配置订阅服务的信息-->
<dubbo:reference interface="com.stack.dubbo.service.UserService" id="userService" version="*">
<dubbo:method name="getUserAddressList"></dubbo:method>
</dubbo:reference>
<!--消费者统一配置-->
<dubbo:consumer check="false"></dubbo:consumer>
</beans>
3.实例
package com.stack.serviceprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.stack.dubbo.bean.UserAddress;
import com.stack.dubbo.service.UserService;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
/**
* @author stack
*/
/**
* spring 组件注解
*/
@Component("userService")
public class UserServiceImpl implements UserService {
@Override
public List<UserAddress> getUserAddressList(String userId) {
UserAddress address1 = new UserAddress(1, "2.0", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "2.0", "1", "王老师", "010-56253825", "N");
return Arrays.asList(address1,address2);
}
}
package com.stack.serviceconsumer.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.stack.dubbo.bean.UserAddress;
import com.stack.dubbo.service.OrderService;
import com.stack.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author stack
*
*/
@Service
public class OrderServiceImpl implements OrderService {
/**
* 远程调用dubbo服务,IOC注入
*/
@Resource
UserService userService;
@Override
public List<UserAddress> initOrder(String userId) {
System.out.println("用户id:"+userId);
//1、查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
for (UserAddress userAddress : addressList) {
System.out.println(userAddress.getUserAddress());
}
return addressList;
}
}
package com.stack.serviceconsumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
/**
* 开启dubbo自动化配置
*/
@ImportResource(locations = "classpath:dubbo-consumer.xml")
@EnableDubbo
@SpringBootApplication
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
注意点:@ImportResource 导入配置文件@EnableDubbo 开启dubbo自动化配置
补充:1.配置文件和xml的配置方式本质上一样,不同点:通过springBoot的配置文件+注解配置dubbo,只能
细粒化接口级别。而通过xml配置能把dubbo服务的配置细粒化接口中的方法级别
2.配置覆盖:方法级优先,接口级次之,全局配置再次之。如果级别一样,则消费方优先,提供方次之
之。 虚拟机参数优先 > xml配置 > springBoot的配置
3.常用的配置属性:timeout(超时),retries(调用失败重试次数) ,version(版本号),check (检测是
否有服务提供者或注册中心时是否报错)
4.dubbo常用的远程服务调用的协议默认为dubbo协议,默认暴露端口20080
整合总结
springBoot整合dubbo不算太难。但是dubbo的涉及到的配置和概念比较多。关于dubbo的配置属性,以及如何高效配置dubbo官网都给出了说明。比如:在服务提供方尽可能多的配置消费者属性。因为对于provider的特点和服务质量等问题,服务提供方比消费方更了解。关于在使用dubbo中需要配置属性可以从官网查询。
dubbo 官网:http://dubbo.apache.org/zh-cn/