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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nHTneC3-1574038593894)(D:\TinkingCat\dubbo\assets\20190314211042225.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Rp3m9rg-1574038593895)(D:\TinkingCat\dubbo\assets\20190314212335976.png)]

因为是提供接口,所以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包给提供者和消费者进行调用。具体截图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKcEBPIq-1574038593897)(D:\TinkingCat\dubbo\assets\20190314214903842.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEhMzN1W-1574038593897)(D:\TinkingCat\dubbo\assets\20190314215105993.png)]

dubbo-demo-provider

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eoXQeglu-1574038593898)(D:\TinkingCat\dubbo\assets\20190314222221465.png)]

我们建了继承接口类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过。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJh91bBk-1574038593900)(D:\TinkingCat\dubbo\assets\20190314224542906.png)]

dubbo-demo-consumer

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZX9sIsp9-1574038593901)(D:\TinkingCat\dubbo\assets\20190314225127708.png)]

其中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,否则会报错。

运行截图如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXRi2B8A-1574038593902)(D:\TinkingCat\dubbo\assets\20190314230356871.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKjlQ9Hg-1574038593903)(D:\TinkingCat\dubbo\assets\20190314230434735.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVuCa9tA-1574038593903)(D:\TinkingCat\dubbo\assets\20190314231126418.png)]