Dubbo SpringBoot版本入门

2023-11-16

1、目的

  学习如何使用SpringBoot版本的Dubbo搭建一个简单的项目。这里笔者使用商城作为案例,一共有两个服务:订单服务、用户服务。其中用户服务是服务提供者,订单服务是服务消费者。实现的功能是订单服务调用用户服务实现用户收货地址的查询。

2、方法

  

2.1 系统工程总体介绍

   需要将系统服务进行拆分成springboot-order-service-consumer,springboot-user-service-provider,springboot-common-service。三个工程。其中springboot-order-service-consumer是订单服务,springboot-user-service-provider是用户服务,springboot-common-service是公共服务。

2.2 系统工程环境搭建

  首先新建一个空的Java工程。如下图所示,直接下一步直到完成,写好自己的工程名即可。

在这里插入图片描述

2.2.1 新建springboot-order-service-consumer服务

  首先新建一个module,如下图所示。

在这里插入图片描述

然后选择spring initializr选项,直接下一步即可。如下图所示。

在这里插入图片描述

修改包名及配置如下所示。

在这里插入图片描述

由于消费者本文将使用Web方式进行测试,这里选择了一个Spring Web

在这里插入图片描述

点击下一步,命名好工程,结果如下图所示。

在这里插入图片描述

2.2.2 新建springboot-user-service-provider服务

大体步骤同2.2.1,这里将贴出不同的地方截图,请读者自行理解。

Module参数配置如下图所示。

在这里插入图片描述

服务提供者我们不需要Web测试,所以这里不需要选择其他依赖。直接下一步即可。如下图所示。
在这里插入图片描述

新建好工程之后如下图所示。
在这里插入图片描述

2.2.3 新建springboot-common-service服务

新建公共服务,提供个服务的公共类。首先新建一个Maven工程。如下图所示。

在这里插入图片描述

定义好工程名,如下图所示。

在这里插入图片描述

新建好的工程结构如下图所示。

在这里插入图片描述

2.3 填充内容

2.3.1 springboot-common-service服务填充内容

首先在springboot-common-service工程内新建cn.edu.njust.gmall.common包名,效果如下图所示。

在这里插入图片描述

接着新建基本的BeanService接口,结构图如下所示。
在这里插入图片描述

UserAddress 用户地址Bean

package cn.edu.njust.gmall.common.bean;


import java.io.Serializable;

/**
 * 用户地址
 *
 */
public class UserAddress implements Serializable {

    private Integer id;
    private String userAddress; //用户地址
    private String userId; //用户id
    private String consignee; //收货人
    private String phoneNum; //电话号码
    private String isDefault; //是否为默认地址    Y-是     N-否

    public UserAddress() {
        super();
        // TODO Auto-generated constructor stub
    }

    public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,
                       String isDefault) {
        super();
        this.id = id;
        this.userAddress = userAddress;
        this.userId = userId;
        this.consignee = consignee;
        this.phoneNum = phoneNum;
        this.isDefault = isDefault;
    }

    public Integer getId() {
        return id;
    }

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

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getConsignee() {
        return consignee;
    }

    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getIsDefault() {
        return isDefault;
    }

    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }


}

OrderService 订单服务接口

package cn.edu.njust.gmall.common.service;



import cn.edu.njust.gmall.common.bean.UserAddress;

import java.util.List;

public interface OrderService {

    /**
     * 初始化订单
     * @param userId
     * @return
     */
    List<UserAddress> initOrder(String userId);
}

UserService 用户服务接口

package cn.edu.njust.gmall.service;


import cn.edu.njust.gmall.bean.UserAddress;

import java.util.List;

public interface UserService {
    /**
     * 根据用户id返回所有的收货地址
     *
     * @param userId
     * @return
     */
    List<UserAddress> getUserAddressList(String userId);
}

然后在springboot-order-service-consumer,springboot-user-service-provider服务中引入公共依赖和Dubbo依赖。

2.3.2 springboot-order-service-consumer服务填充内容

首先工程总体结构如下图所示。

在这里插入图片描述

InitController 初始化订单Controller类

package cn.edu.njust.gmall.order.controller;


import cn.edu.njust.gmall.common.bean.UserAddress;
import cn.edu.njust.gmall.common.service.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class InitController {

//    Dubbo的2.7.7版本中已经标注了Reference和Service注解为@Deprecated弃用了。
//    改用DubboReference和DubboService这两个注解了
    @DubboReference
OrderService orderService;

    @ResponseBody
    @RequestMapping("/initOrder")
    public List<UserAddress> initOrder(@RequestParam("uid") String userId) {
        return orderService.initOrder(userId);
    }
}


OrderServiceImpl


package cn.edu.njust.gmall.order.service.impl;


import cn.edu.njust.gmall.common.bean.UserAddress;
import cn.edu.njust.gmall.common.service.OrderService;
import cn.edu.njust.gmall.common.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

import java.util.List;

@DubboService
@Service
public class OrderServiceImpl implements OrderService {
    @DubboReference
    UserService userService;

    public List<UserAddress> initOrder(String userId) {
        return userService.getUserAddressList(userId);
    }
}

OrderApplication

package cn.edu.njust.gmall.order;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class OrderApplication {

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

}


application



server.port=8085

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





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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.edu.njust.gmall</groupId>
    <artifactId>order</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>order</name>
    <description>订单服务-消费者</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springboot-common-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.13.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.3.3 springboot-user-service-provider服务填充内容

首先工程总体结构如下图所示。
在这里插入图片描述

UserServiceImpl

package cn.edu.njust.gmall.user.service.impl;


import cn.edu.njust.gmall.common.bean.UserAddress;
import cn.edu.njust.gmall.common.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

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

@DubboService
@Service
public class UserServiceImpl implements UserService {
    public List<UserAddress> getUserAddressList(String userId) {
        ArrayList<UserAddress> userAddresses = new ArrayList<UserAddress>();
        for (int i = 0; i < 10; i++) {
            UserAddress userAddress = new UserAddress(i, "userAdderss_" + i, "userId_" + i,
                    "consignee_" + i, "phoneNum_" + i, "isDefault_" + i);
            userAddresses.add(userAddress);
        }

        System.out.println(userAddresses);
        return userAddresses;
    }
}

UserApplication

package cn.edu.njust.gmall.user;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class UserApplication {

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

}

application

 

server.port=8086
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





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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.edu.njust.gmall</groupId>
    <artifactId>user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user</name>
    <description>用户服务-提供者</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springboot-common-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.13.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

以上则建立好全部工程。启动服务。

2.4 测试

这里还需要启动zookeeper作为注册中心。然后启动两个服务即可。效果图如下。
在这里插入图片描述

然后访问http://localhost:8085/initOrder?uid=1即可。
效果图如下。

在这里插入图片描述

说明服务成功启动。Dubbo服务成功搭建起来了。

有点菜,有时间再优化一下。

3、总结

  书上的代码直接运行绝大部分是对的,但是总有一些软件的更新使得作者无能为力。之前的API是对的,但是之后就废弃了或修改了是常有的事。所以我们需要跟踪源代码。这只是一个小小的问题,如果没有前辈的无私奉献,很难想象我们自己一天能学到多少内容。感谢各位前辈的辛勤付出,让我们少走了很多的弯路!

点个赞再走呗!欢迎留言哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo SpringBoot版本入门 的相关文章

随机推荐