需要先开启zookeeper和dubbo

Dubbo环境搭建

 

spring版本

Dubbo服务提供消费者接口搭建

创建Maven项目=> gmail-interface 用于存放共同的服务接口(存放实体bean和接口interface

创建Maven项目=> user-service-provider 服务提供者(提供接口实现类)接口的实现类impl)

创建Maven项目=> order-service-consumer 服务消费者(使用到提供者的接口的实现类)接口的实现类impl

 

接口项目中有自己的引用格式(pom.xml)(可以在其他maven项目中使用接口)(用于在消费者提供者引用)

<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>

 

 

在消费者和提供者 pom.xml 中引用dubbo,接口项目,zookeeper客户端(也可使用其他的注册中心,可在dubbo官网查询)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
    <!-- 引入接口项目的接口 -->
    <dependency>
        <groupId>com.atguigu.gmall</groupId>
        <artifactId>gmall-interface</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <!-- 引入dubbo -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.2</version>
    </dependency>
    <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>
View Code

 

在消费者(consumer.xml)和提供者(provider.xml)的resources下分别创建两个xml(使用的是spring配置方式配置dubbo和zookeeper)(xml名字随便取,之后使其ioc生效修改名字就行)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
<?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">

    <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
    <dubbo:application name="user-service-provider"></dubbo:application>
    
    <!-- 2、指定注册中心的位置 -->
    <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    
    <!-- 3、指定通信规则(通信协议?通信端口) -->
    <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    
    <!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" 
        ref="userServiceImpl01" timeout="1000" version="1.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
    </dubbo:service>
    
    <!--统一设置服务提供方的规则  -->
    <dubbo:provider timeout="1000"></dubbo:provider>
    
    
    <!-- 服务的实现 -->
    <bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
    
    
    <dubbo:service interface="com.atguigu.gmall.service.UserService" 
        ref="userServiceImpl02" timeout="1000" version="2.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
    </dubbo:service>
    <bean id="userServiceImpl02" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean>
    
    <!-- 连接监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    
</beans>
provider.xml
Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
<?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://dubbo.apache.org/schema/dubbo"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.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">
    <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>


    <dubbo:application name="order-service-consumer"></dubbo:application>
    
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    
    <!--  配置本地存根-->
    
    <!--声明需要调用的远程服务的接口;生成远程服务代理  -->
    <!-- 
        1)、精确优先 (方法级优先,接口级次之,全局配置再次之)
        2)、消费者设置优先(如果级别一样,则消费方优先,提供方次之)
    -->
    <!-- timeout="0" 默认是1000ms-->
    <!-- retries="":重试次数,不包含第一次调用,0代表不重试-->
    <!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 -->
    <dubbo:reference interface="com.atguigu.gmall.service.UserService" 
        id="userService" timeout="5000" retries="3" version="*">
        <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
    </dubbo:reference>
        
    <!-- 配置当前消费者的统一规则:所有的服务都不检查 -->
    <dubbo:consumer check="false" timeout="5000"></dubbo:consumer>

    <dubbo:monitor protocol="registry"></dubbo:monitor>
    <!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->
    
</beans>
consumer.xml

 

 启动检查

Dubbo创建提供者、消费者项目(dubbo怎么使用)_xml_07

 

超时(timeout,ms,设置提供者消费者使用超时时间,精确优先(方法先,接口后),消费者优先,)

重试(retries,设置重试次数不包括最开始调用,重试会调用其他的提供者)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_xml_08

 

 

 Dubbo创建提供者、消费者项目(dubbo怎么使用)_apache_09

 

 Dubbo创建提供者、消费者项目(dubbo怎么使用)_ide_10

 

 

 

多版本使用(version)

提供者

Dubbo创建提供者、消费者项目(dubbo怎么使用)_spring_11

 

消费者

 Dubbo创建提供者、消费者项目(dubbo怎么使用)_spring_12

 

 

 

 本地存根(消费者先执行部分逻辑,再调用提供者服务)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_13

需要先在接口应用处写上接口

再在提供者位置上实现接口

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
public class UserServiceStub implements UserService {
    
    private final UserService userService;

    /**
     * 传入的是userService远程的代理对象
     * @param userService
     */
    public UserServiceStub(UserService userService) {
        super();
        this.userService = userService;
    }

    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        // TODO Auto-generated method stub
        System.out.println("UserServiceStub.....");
        if(!StringUtils.isEmpty(userId)) {
            return userService.getUserAddressList(userId);
        }
        return null;
    }
}
Stub类 在提供者位置,可以作消费者部分逻辑

提供者配置(stub)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_apache_16 

 

 

 

 

 springboot版本

SpringBoot与dubbo整合的三种方式:

1)、导入dubbo-starter,在主运行方法上使用@EnableDubbo在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】

2)、保留dubbo xml配置文件(spring中的xml配置);

导入dubbo-starter,使用@ImportResource导入dubbo的配置文件(@ImportResource(locations="classpath:provider.xml"))即可

3)、使用注解API的方式:

将每一个组件手动创建到容器中,让dubbo来扫描其他的组件

 

第一种方式(使用@Service【暴露服务】使用@Reference【引用服务】)

导入依赖(接口依赖,dubbo-spring-boot-starter依赖)(包含了dubbo,zookeeper)

        <dependency>
            <groupId>com.atguigu.gmall</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>

 

 

在application.properties中配置dubbo

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
dubbo.application.name=user-service-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper

dubbo.protocol.name=dubbo
dubbo.protocol.port=20881

dubbo.monitor.protocol=registry
dubbo.scan.base-packages=com.atguigu.gmall
View Code

 

提供者:

在springboot的主运行方法下开启dubbo的注解功能(@EnableDubbo

将提供者的   spring包下的注解@service换为@Component

并使用dubbo包下注解@service(将接口暴露到dubbo中,能给其他应用提供接口)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ide_19

 

Dubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_20

 

 这样就不需要大量的在springboot中配置了

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ide_21

 

 

消费者

开启springboot主运行方法中的dubbo注解(@EnableDubbo)

在dubbo中远程引用其他应用的接口

将@Autowired改为@Reference

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ide_22

 

Dubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_23

 

application.xml(因为监控中心使用的是8080端口,所以应用我们使用8081端口)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
server.port=8081

dubbo.application.name=boot-order-service-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry
View Code

 

负载均衡(根据什么规则分配任务给各个服务器,提供者,消费者都可以定义)

dubbo高可用机制(zk宕机,dubbo直连,负载均衡,服务降级,集群容错整合hystrix)

详情参考

随机权重(dubbo默认)

@Reference(loadbalance="random")

轮询权重

@Reference(loadbalance="random")

最小活跃(最小调用任务时长)

@Reference(loadbalance="leastactive")

 

第二种方式(和spring配置一样)

导入dubbo-starter

导入依赖(接口依赖,dubbo-spring-boot-starter依赖)(包含了dubbo,zookeeper)

        <dependency>
            <groupId>com.atguigu.gmall</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>

 

保留provider.xml 和 consumer.xml

 Dubbo创建提供者、消费者项目(dubbo怎么使用)_apache_26

在消费者(consumer.xml)和提供者(provider.xml)的resources下分别创建两个xml(使用的是spring配置方式配置dubbo和zookeeper)(xml名字随便取,之后使其ioc生效修改名字就行)

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideprovider.xml
Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideconsumer.xml

 

 

 在springboot主运行方法上使用

@ImportResource(locations="classpath:provider.xml")

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ide_29

 

 

第三种方式(使用config将配置加入容器)

 在springboot主运行方法上使用扫描配置

@EnableDubbo(scanBasePackages="com.atguigu.gmall")

Dubbo创建提供者、消费者项目(dubbo怎么使用)_spring_30

 

 

使用config配置dubbo

 Dubbo创建提供者、消费者项目(dubbo怎么使用)_spring_31

Dubbo创建提供者、消费者项目(dubbo怎么使用)_ideDubbo创建提供者、消费者项目(dubbo怎么使用)_zookeeper_02
@Configuration
public class MyDubboConfig {
    
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("boot-user-service-provider");
        return applicationConfig;
    }
    
    //<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("127.0.0.1:2181");
        return registryConfig;
    }
    
    //<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20882);
        return protocolConfig;
    }
    
    /**
     *<dubbo:service interface="com.atguigu.gmall.service.UserService" 
        ref="userServiceImpl01" timeout="1000" version="1.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
    </dubbo:service>
     */
    @Bean
    public ServiceConfig<UserService> userServiceConfig(UserService userService){
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(userService);
        serviceConfig.setVersion("1.0.0");
        
        //配置每一个method的信息
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(1000);
        
        //将method的设置关联到service配置中
        List<MethodConfig> methods = new ArrayList<>();
        methods.add(methodConfig);
        serviceConfig.setMethods(methods);
        
        //ProviderConfig
        //MonitorConfig
        
        return serviceConfig;
    }

}
MyDubboConfig