小白的学习笔记——服务拆分和远程调用

很久没写随笔了,这些东西早就该写了。

一、服务拆分和远程调用

(一)服务拆分

任何分布式架构都离不开服务的拆分,微服务也是一样。
微服务拆分时有这样几个原则:

  • 不同微服务,不要重复开发相同业务
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

比如现在有一个Demo工程,它结构下有两个子工程:

  • Order-Service:订单微服务,负责订单相关业务
  • User-Service:用户微服务,负责用户相关业务

那么它们两个应该满足以下要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立
  • 订单服务和用户服务都对外暴露Restful的接口
  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能直接查询用户数据库

通过例子,我觉得服务拆分的概念与SpringBoot中分层解耦的三层架构的概念有一定相似度。微服务架构将应用程序拆分为多个独立的服务,每个服务都是一个独立的模块,具有自己的功能和数据。同样,Spring Boot的三层架构也将应用程序的不同部分划分为独立的层次,每个层次负责不同的任务,具有相对独立性。(欢迎讨论)

二、远程调用

在Order-Service服务中,有一个根据id查询订单的接口:

点击查看代码


@RestController
@RequestMapping("order")
public class OrderController {

   @Autowired
   private OrderService orderService;

    @GetMapping("{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
        // 根据id查询订单并返回
        return orderService.queryOrderById(orderId);
    }
}

根据id查询订单,返回值是Order对象,如图:

image

其中的user为null

在User-Service中有一个根据id查询用户的接口:

image

查询结果:

image

我们需要修改Order-Service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。
我们需要在Order-Service中 向User-Service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口

首先,注册RestTemplate
我们在order-service服务中创建配置类,注册RestTemplate实例:

点击查看代码


@Configuration
public class RestTemplateConfig {

    /*
    * 创建RestTemplate对象并注入到SpringIOC容器中
    * */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

然后,实现远程调用
修改order-service服务中的OrderService类中的queryOrderById方法:

点击查看代码

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        //url路径
        String url = "http://localhost/8081/user/" +  order.getUserId();
        //发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);  //反序列化
        // 3.封装user信息
        order.setUser(user);
        // 4.返回
        return order;
    }
}

实际上,这种方法的局限性很大,而且代码非常繁琐,我们一般会基于Fegin来进行远程调用,在之后的学习中会提到。

posted on 2024-03-17 23:59  superNeumann  阅读(18)  评论(0编辑  收藏  举报