SpringBoot 整合Dubbo构建分布式服务

版权声明:原创文章欢迎转载,转载请备注来源:https://blog.csdn.net/weixin_41986096 欢迎关注微信公众号摘星族 https://blog.csdn.net/weixin_41986096/article/details/83867724

SpringBoot Dubbo 实践 概述:

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

项目构建

注:项目构建通过: http://start.spring.io/ 快速构建web 项目,
具体操作可以参考《SpringBoot使用SpringDataJPA完成数据查询 -Demo》

在基础环境确定好了之后,我们项目的目录结构如下:

**上图所示,我们项目主要分为了两个模块,

    一部分是生产者:hdd-doorplate-dubbo-server ,

    一部分是消费者:hdd-doorplate-dubbo-client。

hdd

父pom文件当中的配置信息

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 引入项目子模块 -->
    <modules>
        <module>hdd-doorplate-dubbo-server</module>
        <module>hdd-doorplate-dubbo-client</module>
    </modules>
</project>

配置文件

   由于我们底层使用的是Spring-Boot 进行开发,那么我们就应该善于利用Spring-Boot 给我们带来的优势,因此我们可以直接在Application.properties 文件中配置Dubbo 服务:

server.port=6660
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo

服务提供

  在服务提供主要包括两部分,一个是暴露服务,一个是服务实现
  暴露服务:即我们平常开发中所使用的的接口,这里我们创建一个 DoorplateServer 的接口,主要包括操作信息的方法。

package com.herbret.hdd.doorplate.dubbo;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 *
 * 程序业务 Dubbo 服务层
 *
 */

public interface DoorplateServer {

    /**
     *  查询信息
     * @return
     */
    List<String> list();

}

服务实现:

服务实现,与我们平常的服务一样,对接口进行实现,比较特别的是,我们这里需要使用到Dubbo 的 @Service 注解

package com.herbert.hdd.doorplate.dubbo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;

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

/**
 * Created by Herbert on 2018/11/7.
 */

// 注册为 Dubbo 服务
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {
    @Override
    public List<String> list() {
        List<String> list = new ArrayList<String>();
        list.add("城市中心运动公园");
        return list;
    }
}

hdd-doorplate-dubbo-server

pom文件配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd-doorplate-dubbo-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>hdd-doorplate-dubbo-server</name>
    <description>Doorplate project for Spring Boot</description>


    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <!-- 集中定义版本号 -->
    <properties>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>

    <dependencies>

        <!-- Spring Boot Dubbo 依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>

        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

hdd-doorplate-dubbo-client

pom文件配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.herbert.hdd</groupId>
    <artifactId>hdd-doorplate-dubbo-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>hdd-doorplate-dubbo-server</name>
    <description>Doorplate project for Spring Boot</description>


    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <!-- 集中定义版本号 -->
    <properties>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>

    <dependencies>

        <!-- Spring Boot Dubbo 依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>

        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

配置文件

配置文件与生产者稍有区别:

## 避免和 server 工程端口冲突
server.port=6661

## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo

服务实现

在这里,如果我们需要调用注册服务中的相关服务,则需要实现相关的接口。

package com.herbert.hdd.doorplate.dubbo;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 */
public interface DoorplateServer {

    List<String> list();
}

服务调用

我们需要实现一个RESTful 接口,提供给用户调用:

package com.herbert.hdd.doorplate.dubbo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * Created by Herbert on 2018/11/7.
 */
@RestController
@RequestMapping("/user")
public class DoorpalteController {

    @Reference(version = "1.0.0")
    DoorplateServer doorplateServer;

    @RequestMapping("/list")
    public List<String> list(){
        List<String> list =doorplateServer.list();
        System.out.println(list.toString());
        return list;
    }
}

另外,我们还可以在需要使用到生产者中的方法,则需要创建一个接口,然后再调用时,使用 @Reference 注解进行引用也可以直接引用

测试

我们启动hdd-doorplate-dubbo-server 来注册服务,前提是已经启动ZooKeeper注册中心

启动hdd-doorplate-dubbo-server

package com.herbert.hdd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// Spring Boot 应用的标识

@SpringBootApplication
public class HddDoorplateDubboProviderApplication {

    public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(HddDoorplateDubboProviderApplication.class, args);
    }
}

启动完成

启动hdd-doorplate-dubbo-client

package com.herbert.hdd;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HddDoorplateDubboClientApplication {

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

启动完成

接口访问

http://127.0.0.1:6661/user/list

返回值

["城市中心运动公园"]

欢迎关注公众号

猜你喜欢

转载自blog.csdn.net/weixin_41986096/article/details/83867724
今日推荐