Spring Cloud - 带你认识微服务,简单demo实现服务拆分及远程调用

news/2024/7/5 2:17:34

目录

一、微服务

1.1、简介

1.2、架构工作原理

1.3、架构特点

1.4、简单了解 SpringCloud 

二、服务拆分和远程调用

2.1、服务拆分

2.2、微服务远程调用

2.2.1、远程调用分析

2.2.2、具体调用步骤

三、小结


一、微服务


1.1、简介

微服务是一种架构风格,按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。

1.2、架构工作原理

 以电子商城为例,一个商城应用拆分成了多个微服务,如用户服务、交易服务和商品服务,相互之间协作支持整个商城的应用。

1.3、架构特点

  1. 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
  2. 面向服务:微服务对外暴露业务接口
  3. 自治:团队独立、技术独立、数据独立、部署独立
  4. 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

1.4、简单了解 SpringCloud 

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:

值得注意的是 SpringCloud 与 SpringBoot 的版本兼容关系如下:

二、服务拆分和远程调用


2.1、服务拆分

前面我们了解到微服务需要对一块大的服务,拆分成多个小的微服务,那么这个拆分的粒度我们应该如何去把控呢?需要我们注意一下几点:

1. 单一职责:不同微服务,不要重复开发相同业务
2. 数据独立:不要访问其它微服务的数据库
3. 面向服务:将自己的业务暴露为接口,供其它微服务调用

例如:我们将一个大的服务拆分成了订单模块和用户模块,并且每一个微服务有自己的数据库(订单数据库和用户数据库)。由于在不同的数据库中,因此只能通过订单 id 查询订单数据,或者通过用户 id 查询用户数据,不能交叉访问,如下图

那么如果需求是:“根据订单id查询订单的同时,把订单所属的用户信息一起返回”,我们该如何跨服务访问呢?接着往下走~

2.2、微服务远程调用

2.2.1、远程调用分析

需求是:“根据订单id查询订单的同时,把订单所属的用户信息一起返回”。

相同的服务,我们可以直接通过 mapper 调用其数据库,不同的服务如何相互调用呢?办法很简单,就如上图,用户模块提供公开的访问接口("/user/{id}"),订单模块主动向用户模块发送 http 请求获取数据,这样就做到了跨服务之间的调用~

2.2.2、具体调用步骤

根据刚刚所说的案例,我们只需要以下四步:

1)注册RestTemplate

在订单服务(order-service)OrderApplication中(SpringBoot 启动类)注册RestTemplate,如下:

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 注解的作用相当于在指定包下的所有 mapper 接口上都加上了 @mapper 注解
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

    /**
     * 将 RestTemplate 对象注入到 spring 容器中
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

2)服务远程调用RestTemplate

在订单服务中,通过 RestTemplate 的 getForObject / postForObject 方法来构造get / post 请求(此处显然使用 get 请求获取用户数据),请求中携带的参数便是订单表中的 userId 数据,当用户微服务接收到请求后,就可以根据 userId 获取用户数据,最后返回到订单服务中,这样就实现了跨服务调用~

import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用 RestTemplate 发送 http 请求,查询用户
        String url = "http://localhost:8081/user/" + order.getUserId();
        //get请求:getForObject
        //post请求:postForObject
        //第一个参数是 url, 第二个参数是请求后响应的参数类型(自动的反序列化)
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装 User 到 Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

跨服务调用前的执行效果:

 

跨服务调用后的执行效果:

三、小结

你学费了吗?

 


http://lihuaxi.xjx100.cn/news/1230349.html

相关文章

【大学计算机技术】测试 2

文章目录 选择题 选择题 下列有关PC机硬盘存储器的叙述错误的是( )。 A. 硬盘上的数据块要用柱面号、扇区号和磁头号这三个参数来定位 B. 目前硬盘一般都含有DRAM芯片构成的高速缓存(Cache) C. 目前硬盘与主机的接口大多为SATA接口 D. 硬盘容量的增加主要…

设计模式-接口隔离原则

一般的系统设计都需要系统设计架构图,图中会将系统整体按照几个不同维度的模块进行拆分,以达到模块之间高内聚、低耦合的效果,协同完成系统的各项功能。同样,在应用程序设计的时候,我们也需要对模块、接口进行拆分&…

基于 Quivr 搭建个人知识库

目录 Quivr介绍 Quivr特性 Quivr演示 Demo with GPT3.5: Demo of the new version: Quivr实战 Quiv 使用的主要技术 Quiv 实践依赖 创建Supabase项目 部署Quiv项目 第一步:现在源码 第二步:设置环境变量 第三步:执行sql 第…

如何使用Vue的异步更新机制?

首先,让我们来了解一下Vue的异步更新机制是什么。简单来说,当Vue的数据发生变化时,它并不会立即更新页面,而是将更新操作放在一个队列中,等到浏览器空闲时再批量执行这些更新操作。这样做的好处是,可以减少…

MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法

MySQl学习(MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法 第四篇_MySQL中常用的运算符及其用法运算符1. 算术运算符1.加法与减法运算符2.乘法与除法运算符3.求模(求余&#…

老话新谈之缓存一致性

前言 缓存一致性常见的更新策略也比较多,如先更新数据库再更新缓存,先删缓存再更新数据库等等,我在理解的时候有些混乱,所以这个文章提供了一些理解上的技巧去理解缓存一致性。 为什么会有缓存一致性的问题 缓存与数据库是两套…

UniApp组件封装

什么是UniApp组件? UniApp是一个跨平台的开发框架,允许开发者使用Vue.js编写一次代码,然后将其发布到多个平台,包括iOS、Android和Web。在UniApp中,组件是构建用户界面的基本单元,它们可以重复使用&#x…

Vcpkg介绍及使用

Vcpkg用于在Windows、Linux、Mac上管理C和C库,极大简化了第三方库的安装,它由微软开源,源码地址:https://github.com/Microsoft/vcpkg,最新发布版本为2023.04.15 Release,它的license为MIT。 在windows上安…