SpringBoot项目模块间通信的两种方式

说明:在微服务架构开发中,一个请求是通过模块之间的互相通信来完成的,如下面这个场景:

创建两个子模块:订单模块(端口8081)、用户模块(端口8082),两个模块之间没有联系,现在需要查询订单,根据订单中的用户ID,查询该订单对应的用户信息。

(两个模块是独立的)

SpringBoot项目模块间通信的两种方式_第1张图片


用户实体类

import lombok.Data;

import java.io.Serializable;

/**
 * 用户
 */
@Data
public class User implements Serializable {

    /**
     * ID
     */
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 地址
     */
    private String address;
}

订单实体类,查询订单需要补充用户信息

import lombok.Data;

import java.io.Serializable;

/**
 * 订单
 */
@Data
public class Order implements Serializable {

    /**
     * ID
     */
    private Long id;

    /**
     * 价格
     */
    private Double price;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 商品名
     */
    private String name;

    /**
     * 商品数量
     */
    private Integer num;

    /**
     * 用户信息
     */
    private User user;
}

此时,因为订单模块中没有用户业务,是没有对应的UserMapper类操作数据库的。这就需要向用户模块发送请求,并传递用户ID,由用户模块里对应的方法去操作数据库,返回用户信息。可以用以下两种方式实现。

方式一:Hutool工具包

可使用Hutool工具包中的get(),向用户模块发送查询用户信息请求;

    @Override
    public Order getOrder(Long id) {

        Order order = orderMapper.getOrder(id);

        // 向用户模块发送请求
        String s = HttpUtil.get("http://localhost:8082/user?id=" + order.getUserId());

        // 解析相应结果
        User user = JSONUtil.toBean(s, User.class);

        order.setUser(user);

        return order;
    }

方式二:RestTemplate

使用RestTemplate中的getForEntity()方法,也可以达到同样的效果,使用前,需要手动添加该类到IOC容器中;

(手动添加Bean到IOC容器中)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AddBean {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

(使用RestTemplate的getForEntity方法,向用户模块发送请求)

    @Autowired
    private RestTemplate restTemplate;
	
    @Override
    public Order getOrder(Long id) {

        Order order = orderMapper.getOrder(id);

        // 使用restTemplate的getForEntity()方法向用户模块发送请求
        ResponseEntity<User> entity = restTemplate.getForEntity("http://localhost:8082/user?id=" + order.getUserId(), User.class);

        // 响应结果是一个response实例,先判断响应状态码是不是成功
        if (entity.getStatusCode().is2xxSuccessful()) {
            
            // 取出响应数据使用
            User user = entity.getBody();
            order.setUser(user);
        }

        return order;
    }

restTemplate.getForEntity()方法返回值类型

SpringBoot项目模块间通信的两种方式_第2张图片

测试

postman测试,两者都可以达到相同的效果

SpringBoot项目模块间通信的两种方式_第3张图片

你可能感兴趣的:(分布式,java,springboot)