基础环境
本文基于Spring Boot模块使用Dubbo,分为三个Spring Boot模块,包括公共模块(api)、服务提供者模块(order)、服务消费者模块(business)。
注册中心
Dubbo需要依赖一个配置中心,本文以Zookeeper为例,需要先部署好一个Zookeeper。
公共模块
增加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";
}
}
PREVIOUSRestTemplate使用
NEXTDubbo常用配置