SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

这几天在学习Dubbo,所以整合了一些知识分享给大家。首先先介绍一下Dubbo,Dubbo是阿里巴巴公司开源的一个高性能优秀的服务治理框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。其在github上的网址为https://github.com/alibaba/dubbo-spring-boot-starter。Dubbo的主要架构如下图所示:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

其中Provider是服务的提供方,Consumer是服务的消费方,Registry是服务的注册中心,Monitor是服务的监控中心,Container则是服务运行的容器。这次的springboot与dubbo整合主要分为三个模块,分别是dubbo-demo-api(接口),dubbo-demo-provider(提供者),dubbo-demo-consumer(消费者),具体讲解如下。

dubbo-demo-api

首先我们在IDEA中新建一个Maven项目,得到的项目目录如下:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

因为是提供接口,所以pom.xml不需要提供配置,我们新建两个包,分别是model和service,model用于存放实体类User的信息,service用于写服务接口UserService,源码如下:

User实体类

package com.chen.model;

import java.io.Serializable;

/**
 * 用户实体类,此处必须要序列化
 */
public class User implements Serializable {

    private Integer id;

    private String name;

    private Integer age;

    public User(Integer id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

UserService接口类

package com.chen.service;

import com.chen.model.User;

import java.util.List;

/**
 * 用户服务接口类,仅定义方法
 */
public interface UserService {

    List<User> findUsers();

    String sayHi(String name);
}

写好代码之后我们在IDEA右侧找到Maven Projects,在Lifecycle下面找到install并双击,直到出现Build Success。这么做是为了生成jar包给提供者和消费者进行调用。具体截图如下:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

dubbo-demo-provider

我们在IDEA中新建一个Spring Boot项目,项目结构如下图所示:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

我们建了继承接口类UserServiceImpl,然后在pom.xml添加一些配置依赖,具体代码如下:

  <!-- dubbo接口项目的jar包依赖 -->
        <dependency>
            <groupId>com.chen</groupId>
            <artifactId>dubbo-demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- springboot集成dubbo的起步依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
      
        <!-- zookeeper的客户端jar依赖包 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

在application.properties添加dubbo的配置信息以及Web端口,代码如下:

spring.application.name=dubbo-spring-boot-starter
spring.dubbo.server=true
spring.dubbo.registry=N/A
#web端口
server.port=8081

UserServiceImpl接口实现类

package com.chen.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.chen.model.User;
import com.chen.service.UserService;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@Service(interfaceClass = UserService.class)//dubbo的注解
public class UserServiceImpl implements UserService {

    @Override
    public List<User> findUsers() {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1,"孙尚香",20));
        userList.add(new User(2,"黄忠",30));
        userList.add(new User(3,"后羿",25));
        return userList;
    }

    @Override
    public String sayHi(String name) {
        return "hello,dubbo!";
    }
}

这里我们没有用到数据库,所以在UserServiceImpl中我们直接把数据添加进去了。

接着,大家不要忘记,在Application启动类中加入@EnableDubboConfiguration注解,这表示添加dubbo依赖,具体代码如下:

package com.chen;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubboConfiguration
public class DubboDemoProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboDemoProviderApplication.class, args);
    }

}

好了,到了这一步相信大家也有点着急了吧,我们这时候可以运行一下了,出现下面运行截图则表示配置正确,如果出错了,检查一下你之前的dubbo-demo-api是否已经install过。

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

dubbo-demo-consumer

仍然是新建一个Spring Boot项目,选择Web应用,该项目结构如下图所示:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

其中pom.xml添加如下配置文件(与provider中一样):

  <!-- dubbo接口项目的jar包依赖 -->
        <dependency>
            <groupId>com.chen</groupId>
            <artifactId>dubbo-demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- springboot集成dubbo的起步依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- zookeeper的客户端jar依赖包 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

application.properties文件添加如下配置信息:

#内嵌的Tomcat端口
server.port=8080
spring.application.name=dubbo-consumer-starter

新建一个控制类UserController,代码如下:

package com.chen.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.chen.model.User;
import com.chen.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
public class UserController {

    //此处如果注明版本version,一直会报错,去掉了就没有报错
    @Reference(url="dubbo://127.0.0.1:20880")
    private UserService userService;

    @RequestMapping("/hello")
    public Object sayHi(String name){
        return userService.sayHi("cpx");
    }

    @RequestMapping("/findUsers")
    public List<User> findUsers(){
        return userService.findUsers();
    }

}

同样的,大家不要忘记在Application中添加@EnableDubboConfiguration注解,代码如下:

package com.chen;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubboConfiguration
public class DubboDemoConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboDemoConsumerApplication.class, args);
    }

}

好了,到了这一步已经基本结束了,我们接下来运行,注意,必须先运行provider,才能再运行consumer,否则会报错。

运行截图如下所示:

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

另外大家注意一点,就是在consumer中UserController的Reference不要加上version=***,直接加上url="dubbo://127.0.0.1:20880"

即可,若加上version属性,则会出现如下错误。

SpringBoot2.1.3整合Dubbo2.6.0完整案例(基于IDEA)

好了,这次的分享就到这里了,接下来有新的知识我也会继续更新博客的,大家有什么疑惑可以在评论区留言哦!