Dubbo服务架构模块搭建

基础环境

本文基于Spring Boot模块使用Dubbo,分为三个Spring Boot模块,包括公共模块(api)、服务提供者模块(order)、服务消费者模块(business)。

注册中心

Dubbo需要依赖一个配置中心,本文以Zookeeper为例,需要先部署好一个Zookeeper。

Zookeeper在Docker下安装

公共模块

增加Dubbo相关依赖

<dependency>  
    <groupId>org.apache.dubbo</groupId>  
    <artifactId>dubbo-spring-boot-starter</artifactId>  
    <version>3.2.0</version>  
</dependency>  
  
<dependency>  
    <groupId>org.apache.dubbo</groupId>  
    <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>  
    <type>pom</type>  
    <version>3.2.0</version>  
    <exclusions>
        <exclusion>
            <artifactId>slf4j-reload4j</artifactId>  
            <groupId>org.slf4j</groupId>  
        </exclusion>
    </exclusions>
</dependency>

在公共模块中定义服务提供者模块和服务消费者模块都需要依赖的类,包括接口定义,DTO等

package com.oliverclio.api.order.dto;  
  
import lombok.Data;  
  
@Data  
public class OrderDto implements Serializable {  
    private Integer id;  
    private String userId;  
    private String commodityCode;  
    private Integer count;  
    private Integer money;  
}
package com.oliverclio.api.order.service;  
  
import com.oliverclio.api.order.dto.OrderDto;  
  
public interface OrderService {  
    void createOrder(OrderDto orderDto);  

    OrderDto getOrder(Integer id);
}

服务提供者模块

依赖公共模块

<dependency>  
    <groupId>com.oliverclio</groupId>  
    <artifactId>api</artifactId>  
    <version>0.1.0</version>  
</dependency>

增加Dubbo相关配置项

dubbo:  
  application:  
    name: dubbo-order  
    qos-enable: false  
  protocol:  
    name: dubbo  
    port: -1  
  registry:  
    address: zookeeper://192.168.154.8:2181

Spring Boot启动类增加@EnableDubbo注解

package com.oliverclio.order;  
  
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;  
import org.mybatis.spring.annotation.MapperScan;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@SpringBootApplication  
@EnableDubbo  
public class OrderApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(OrderApplication.class, args);  
    }  
}

服务实现

package com.oliverclio.order.service;  
  
import com.oliverclio.api.order.dto.OrderDto;  
import com.oliverclio.api.order.service.OrderService;  
import com.oliverclio.order.mapper.OrderMapper;  
import lombok.AllArgsConstructor;  
import org.apache.dubbo.config.annotation.DubboService;  
  
@DubboService  
public class OrderServiceImpl implements OrderService {  
  
    @Override  
    public void createOrder(OrderDto orderDto) {  
        System.out.println("createOrder invoked!");  
        System.out.println(orderDto.getUserId());  
        System.out.println(orderDto.getCommodityCode());  
        System.out.println(orderDto.getCount());
    }  

    @Override  
    public OrderDto getOrder(Integer id) {  
        OrderDto orderDto = new OrderDto();  
        orderDto.setId(1);  
        return orderDto;  
    }
}

服务消费者模块

依赖公共模块

<dependency>  
    <groupId>com.oliverclio</groupId>  
    <artifactId>api</artifactId>  
    <version>0.1.0</version>  
</dependency>

增加Dubbo相关配置项

dubbo:  
  application:  
    name: dubbo-business  
    qos-enable: false  
  protocol:  
    name: dubbo  
    port: -1  
  registry:  
    address: zookeeper://192.168.154.8:2181  
  consumer:  
    check: false

Spring Boot启动类增加@EnableDubbo注解

package com.oliverclio.business;  
  
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
  
@SpringBootApplication  
@EnableDubbo  
public class BusinessApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(BusinessApplication.class, args);  
    }  
}

服务调用

package com.oliverclio.business.controller;  
  
import com.oliverclio.api.order.dto.OrderDto;  
import com.oliverclio.api.order.service.OrderService;  
import lombok.AllArgsConstructor;  
import org.apache.dubbo.config.annotation.DubboReference;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
@AllArgsConstructor  
public class BusinessController {  
  
    @DubboReference 
    private OrderService orderService;  
  
    @PostMapping("purchase")  
    public String purchase(String userId, String commodityCode, Integer orderCount) {  
        OrderDto orderDto = new OrderDto();  
        orderDto.setUserId(userId);  
        orderDto.setCommodityCode(commodityCode);  
        orderDto.setCount(orderCount);  
        orderService.createOrder(orderDto);  
        return "ok";  
    }  

    @GetMapping("order")  
    public String order(Integer id) {  
        OrderDto orderDto = orderService.getOrder(id);  
        System.out.println(orderDto.getId());  
        return "ok";  
    }
}