Dubbo的基本使用

1、Dubbo概述
2、Dubbo处理流程
3、服务注册中心Zookeeper
4、Dubbo基本使用
4.1、基于注解模式
4.2、基于XML模式

1.Dubbo概述

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

官网提供了用户文档与开发指南,基本对所有功能有大概的描述与使用方式
官方网址:https://dubbo.apache.org/zh/

2.Dubbo处理流程

以下处理流程图与节点说明均来自官方

dubbo 项目 怎么启动 dubbo使用教程_xml

节点说明:

节点

角色名称

Provider

暴露服务的服务提供方

Consumer

调用远程服务的服务消费方

Registry

服务注册与发现的注册中心(zookeeper)

Monitor

统计服务的调用次数和调用时间的监控中心

Container

服务运行容器,负责启动、加载、运行服务提供者

3.服务注册中心Zookeeper

通过前面的Dubbo架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用。Dubbo官方推荐使用Zookeeper作为服务注册中心。Zookeeper 是 Apache Hadoop 的子项目,作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用

4.Dubbo基本使用

快速入门码云克隆地址:https://gitee.com/zhangxushare/duboo.git

启动时:先启动注册中心zookeeper,在启动提供者,其次消费者

dubbo 项目 怎么启动 dubbo使用教程_zookeeper_02

4.1注解版

spring+mvc版

项目结构如下:把公共接口抽取出来,service中写实现,controller中调用

dubbo 项目 怎么启动 dubbo使用教程_spring_03

1.接口协定(公共接口)
若是服务提供者和消费者都自己写一份,就不方便维护,导致不一致。

package com.itheima.service;
public interface UserService {
    public String sayHello();
}

2.创建服务提供者
首先引入与消费者相同的公共依赖,以及zookeeper和dubbo的包

<!--依赖公共的接口模块-->
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
         
        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.4.1</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.0</version>

在spring的配置文件里配置dubbo (注意包扫描使用的dubbo开头)

<?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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	<!--<context:component-scan base-package="com.itheima.service" />-->
	<!--dubbo的配置-->
	<!--1.配置项目的名称,唯一-->
	<dubbo:application name="dubbo-service">
     <!--加入该配置,启动时警告端口占用就没有了-->
    <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
	<!--2.配置注册中心的地址-->
	<dubbo:registry address="zookeeper://localhost:2181"/>
	<!--3.配置dubbo包扫描-->
	<dubbo:annotation package="com.itheima.service.impl" />
</beans>

一台机子启动报错端口占用加如上代码<dubbo:parameter key=“qos.port” value=“33333”/>修改端口

java.net.BindException: Address already in use: bind

创建公共接口实现类
注意:此处的@service导包是dubbo中的,不要到错了

import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;
//@Service spring中,将该类的对象创建出来,放到Spring的IOC容器中  bean定义
//此处的service是dubbo中的,将这个类提供的方法(服务)对外发布,将访问的地址 ip,端口,路径注册到注册中心中
@Service
public class UserServiceImpl implements UserService {
    @Override
    public String sayHello() {
        return "hello dubbo hello!~";
    }
}

3.创建服务消费者

首先引入与服务提供者相同的公共依赖,以及zookeeper和dubbo的包,和上面提供者的pom一样

在springMVC的配置文件里配置dubbo与上相似,但需要配置springMVC注解扫描等

<mvc:annotation-driven/>
    <context:component-scan base-package="com.itheima.controller"/>

    <!--dubbo的配置-->
    <!--1.配置项目的名称,唯一-->
    <dubbo:application name="dubbo-web" >
    <!--加入该配置,启动时警告端口占用就没有了-->
    <dubbo:parameter key="qos.port" value="22222"/>
    </dubbo:application>
    <!--2.配置注册中心的地址-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--3.配置dubbo包扫描-->
    <dubbo:annotation package="com.itheima.controller" />

创建userService的消费者,@Reference关键字远程注入,调用服务

package com.itheima.controller;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
    //注入Service
    //@Autowired 本地注入

    /*  @Reference 远程注入
        1. 从zookeeper注册中心获取userService的访问url
        2. 进行远程调用RPC
        3. 将结果封装为一个代理对象。给变量赋值 */
    @Reference
    private UserService userService;
    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }
}

小推荐:
小测试项目直接使用maven插件,就不用再配置本地tomcat啦

<build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>9000</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

springBoot版

可以也用上面的pom版本,最新版本的注解有所不同,注解有 @DubboService、@DubboReference。
注解版别忘了主启动类@EnableDbubbo开启注解,xml配置不需要开启

4.2 xml版本(springBoot)

提供者
先在资源下创建配置文件,使用xml配置则服务名,注册中心等也必须要在xml中配置,然后加载配置文件,去掉@Service即可 (yml中配置会找不到提供者,无法装配创建bean,自己是这样的)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:property-placeholder/>

    <dubbo:application name="dubbo-springboot-demo-privder"/>
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <dubbo:service interface="com.example.service_api.UserService" ref="userServiceImpl"/>
    <bean id="userServiceImpl" class="com.example.boot_service.imp.UserServiceImpl"/>

</beans>

消费者
同上步骤,去掉@Refance,用@Autowrite即可

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans" 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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:property-placeholder/>

    <dubbo:application name="dubbo-springboot-demo-consumer"/>
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <dubbo:reference interface="com.example.service_api.UserService" id="userServiceImpl"/>
</beans>