微服务-服务拆分和远程调用

发布时间:2024年01月19日

任何分布式架构都离不开服务的拆分,微服务也是一样。

一、服务拆分原则

微服务拆分时的几个原则:

  • 不同微服务,不要重复开发相同业务

  • 微服务数据独立,不要访问其它微服务的数据库

  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

二、服务拆分示例

以微服务cloud-demo为例,其结构如下:

cloud-demo:父工程,管理依赖

  • order-service:订单微服务,负责订单相关业务

  • user-service:用户微服务,负责用户相关业务

要求:

  • 订单微服务和用户微服务都必须有各自的数据库,相互独立

  • 订单服务和用户服务都对外暴露Restful的接口

  • 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库

2.1??导入Sql语句

首先,将资料提供的cloud-order.sqlcloud-user.sql导入到mysql中:

cloud-user表中初始数据如下:

cloud-order表中初始数据如下:

cloud-order表中持有cloud-user表中的id字段。

2.2??导入demo工程

用IDEA导入资料提供的Demo:

项目结构如下:

导入后,会在IDEA右下角出现弹窗:

点击弹窗,然后按下图选择:

会出现这样的菜单:

配置下项目使用的JDK:

三、实现远程调用案例

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

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

其中的user为null

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

查询的结果如图:

3.1??案例需求:

修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。

因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器

  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User

  • 将查询的User填充到Order对象,一起返回

3.2??注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:


在Spring Boot中,RestTemplate是一个常用的类,用于发送HTTP请求和接收响应。它是Spring框架的一部分,提供了简单而强大的RESTful Web服务客户端。

RestTemplate的主要功能包括:

  1. 发送HTTP请求:RestTemplate提供了多种HTTP方法,如GET、POST、PUT、DELETE等,可以轻松地发送请求到指定的URL。
  2. 解析响应:RestTemplate可以将HTTP响应中的数据解析为Java对象,使得数据交互更加方便。
  3. 设置请求参数:可以通过RestTemplate设置请求参数,如查询参数、请求头等,以定制化请求。
  4. 异常处理:当请求失败时,RestTemplate会抛出异常,可以通过捕获这些异常来进行异常处理。

在Spring Boot中,RestTemplate的使用通常通过注入的方式将其注入到需要使用它的类中,然后调用相应的方法发送HTTP请求。需要注意的是,随着Spring Framework的不断更新,RestTemplate可能会被其他更现代的类或库所取代。尽管如此,对于许多现有的Spring Boot项目来说,RestTemplate仍然是一个非常有用的工具。


package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

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

3.3??实现远程调用

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法:

?

文章来源:https://blog.csdn.net/weixin_55772633/article/details/135706887
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。