SpringBoot项目模块间通信的两种方式
  zNRyot8onCGb 24天前 36 0

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

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

(两个模块是独立的)

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


用户实体类

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项目模块间通信的两种方式

测试

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 24天前 0

暂无评论

推荐阅读
zNRyot8onCGb