springBoot 整合 dubbo

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容器中

配置文件覆盖原则

image-20200730184138154

优先级:jvm 虚拟机参数 > xml配置 > properties(yml)配置

整合案例(基于配置文件和xml形式)

前提:配置好zookeeper+dubbo admin+ dubbo monitor

software:http://stack-blog.oss-cn-beijing.aliyuncs.com/code/dubbo/software.zip

  1. 首先要创建公共API接口(dubbo 是基于接口的远程调用,所以要提供公共接口为服务提供者和消费者使用)-动态代理
  2. 编写服务提供者+配置文件
  3. 编写服务消费者+配置文件

1

目录结构说明:

​ 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值