当前位置:首页 > 后端开发 > 微服务拆分原则以及服务间进行远程调用

微服务拆分原则以及服务间进行远程调用

7个月前 (05-20)43

将一个单体项目拆分成微服务项目, 如何实现?

拆分原则:

(1)微服务需要根据模块拆分, 做到单一职责, 不重复开发相同业务。

(2)微服务需要暴露业务接口, 供其他服务使用。

(3)不同微服务都应该有自己的数据库。

现将一个原本处于一个单体项目拆分成微服务项目

(1)进行了模块拆分,为订单和用户模块单独创建一个项目。

(2)订单模块为8080, 用户模块为8081。

(3)订单和用户模块都有自己单独的数据库。

微服务拆分原则以及服务间进行远程调用 _ Java侠

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

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

订单模块配置文件:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_order?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true

用户模块配置文件:

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true

OrderController.java

@RestController
@RequestMapping("/order")
public class OrderController {
     
   @Autowired
   private OrderService orderService;
    @GetMapping("/{orderId}")
    public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
     
        // 根据id查询订单并返回
        return orderService.queryOrderById(orderId);
    }
}

UserController.java

@RestController
@RequestMapping("/user")
public class UserController {
     
    @Autowired
    private UserService userService;
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
     
        return userService.queryById(id);
    }
}

订单中有个查询订单功能, 但是查出来的用户为null
微服务拆分原则以及服务间进行远程调用 _ Java侠

需求是: 订单中需要查用户模块, 面对跨服务之间的调用, 又如何实现呢?

这就用到了远程调,因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口, 从而获取user对象。

大概的步骤是这样的:

  • 注册一个RestTemplate的实例到Spring容器
  • 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User,将查询的User填充到Order对象,一起返回

第一步,注册一个RestTemplate的实例到Spring容器

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

第二步, 修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User,将查询的User填充到Order对象,一起返回

@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
     
    // 1.查询订单
    Order order = orderMapper.findById(orderId);
    // 2. 发送请求, 获取user对象
    String url = "http://localhost:8081/user/" + order.getUserId();
    User user = restTemplate.getForObject(url, User.class);
    // 3. 将获取到的user对象设置到订单中
    order.setUser(user);
    // 4.返回
    return order;
}

在这次服务调用关系中, order-service作为服务消费者, 而user-service作为服务提供者

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

【注】一个服务既可以是服务提供者,也可以是服务消费者。

作者:一只小小码农z
来源链接:https://blog.csdn.net/qq_43908235/article/details/124067439

标签: 微服务

“微服务拆分原则以及服务间进行远程调用” 的相关文章

微服务搭建图解idea

微服务搭建图解idea

作者:小流年。Moon 来源链接:https://blog.csdn.net/csdncsdnqwdfwer/articl...

微服务构建过程

微服务构建过程

作者:sun_TheProgramLife 来源链接:https://blog.csdn.net/weixin_42107940/article/details...

什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务

什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务

一、微服务简介 1. 微服务的诞生 微服务是基于分而治之的思想演化出来的。过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们...

SpringCloud微服务入门

SpringCloud微服务入门

SpringCloud微服务入门 初识SpringCloud Eureka注册中心 HelloWorld 1....

微服务之间授权

微服务之间授权

准备第二个资源服务器 集成feign resource1 导包 开启feign 写接口-》打注解 加上调用的服务名字 拷贝r2的control...

什么是微服务?为什么你要用微服务?

什么是微服务?为什么你要用微服务?

前言 最近几年微服务很火,大家都在建设微服务,仿佛不谈点微服务相关的技术,都显得不是那么主流了。 近几年见识到身边朋友的很多公司和团队都在尝试进行微服务的改变,但...

【云原生】微服务Nacos的简单介绍与使用

【云原生】微服务Nacos的简单介绍与使用

前言: 最近看完了Nacos相关的课程,对相关知识总结如下,希望能够加深最近的印象以及帮助到各位大佬🎉🎉 如果文章有需要改进的地方还请大佬斧正🤞🤞...

微服务介绍

微服务介绍

什么是微服务? 将单一程序服务运行在自己的进程中,服务间通信采用轻量级通信机制( 如HTTP机制的API )。 简单的微服务架构如下:...

微服务架构介绍

微服务架构介绍

文章目录 微服务架构介绍 一、技术架构演变...

微服务概念详细介绍

微服务概念详细介绍

目录 一、单机服务到微服务的演变 二、微服务的定义 三、微服务为我们解决了哪些问题 四、当前微服务面临的挑战 五、结语 一、单机服...