SpringCloud 微服务全栈体系(一)

第一章 认识微服务

  • 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?

一、单体架构

  • 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

在这里插入图片描述

  • 单体架构的优缺点如下:

    • 优点:

      • 架构简单
      • 部署成本低
    • 缺点:

      • 耦合度高(维护困难、升级困难)

二、分布式架构

  • 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

在这里插入图片描述

  • 分布式架构的优缺点:

    • 优点:

      • 降低服务耦合
      • 有利于服务升级和拓展
    • 缺点:

      • 服务调用关系错综复杂
  • 分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:

    • 服务拆分的粒度如何界定?
    • 服务之间如何调用?
    • 服务的调用关系如何管理?
  • 人们需要制定一套行之有效的标准来约束分布式架构。

三、微服务

  • 微服务的架构特征:

    • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
    • 自治:团队独立、技术独立、数据独立,独立部署和交付
    • 面向服务:服务提供统一标准的接口,与语言和技术无关
    • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

在这里插入图片描述

  • 微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

  • 因此,可以认为微服务是一种经过良好架构设计的分布式架构方案

  • 但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。

  • 其中在 Java 领域最引人注目的就是 SpringCloud 提供的方案了。

四、SpringCloud

  • SpringCloud 是目前国内外使用最广泛的微服务框架。
  • 官网地址:https://spring.io/projects/spring-cloud。
  • SpringCloud 集成了各种微服务功能组件,并基于 SpringBoot 实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
  • 其中常见的组件包括:

在这里插入图片描述

  • 另外,SpringCloud 底层是依赖于 SpringBoot 的,并且有版本的兼容关系,如下:

在这里插入图片描述

  • 版本:Hoxton.SR10,对应的 SpringBoot 版本是 2.3.x 版本。

五、总结

  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

    ① 优点:拆分粒度更小、服务更独立、耦合度更低

    ② 缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud 是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

第二章 服务拆分和远程调用

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

一、服务拆分原则

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

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

在这里插入图片描述

二、服务拆分示例

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

在这里插入图片描述

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

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

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

1. 导入 Sql 语句

  • cloud-order.sqlcloud-user.sql导入到 mysql 中:
    见专栏 -> 全栈资料包 -> 资源包/02_cloud

在这里插入图片描述

  • cloud-user 表中初始数据如下:
    在这里插入图片描述
  • cloud-order 表中初始数据如下:
    在这里插入图片描述
  • cloud-order 表中持有 cloud-user 表中的 id 字段。

2. 导入 demo 工程

  • 用 IDEA 导入 Demo:
    见专栏 -> 全栈资料包 -> 资源包/02_cloud
    在这里插入图片描述
  • 项目结构如下:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  • 会出现这样的菜单:

在这里插入图片描述

  • 配置下项目使用的 JDK:

在这里插入图片描述

三、实现远程调用案例

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

在这里插入图片描述

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

在这里插入图片描述

  • 其中的 user 为 null

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

在这里插入图片描述

查询的结果如图:

在这里插入图片描述

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 对象,一起返回

2. 注册 RestTemplate

  • 首先,我们在 order-service 服务中的 OrderApplication 启动类中,注册 RestTemplate 实例:
package com.alex.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("com.alex.order.mapper")
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

3. 实现远程调用

  • 修改 order-service 服务中的 com.alex.order.service 包下的 OrderService 类中的 queryOrderById 方法:

在这里插入图片描述

四、提供者与消费者

  • 在服务调用关系中,会有两个不同的角色:

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

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

在这里插入图片描述

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

  • 如果服务 A 调用了服务 B,而服务 B 又调用了服务 C,服务 B 的角色是什么?

    • 对于 A 调用 B 的业务而言:A 是服务消费者,B 是服务提供者
    • 对于 B 调用 C 的业务而言:B 是服务消费者,C 是服务提供者
  • 因此,服务 B 既可以是服务提供者,也可以是服务消费者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

介绍Node.js中fs模块 代码和注释。

Node.js中的fs模块提供了一些用于文件系统操作的API,包括文件读写、目录操作等。 读取文件 使用fs.readFile()方法可以读取文件内容。该方法的第一个参数是文件路径,第二个参数是可选的选项对象,第三个参数是回调函数。回调函数的第一个参数…

Looper分析

Looper分析 在 Handler 机制中,Looper 的作用是提供了一个消息循环 ( message loop ) 的机制,用于处理和分发消息。 Looper 是一个线程局部的对象,每个线程只能有一个 Looper 对象。它通过一个无限循环来不断地从消息队列中取出消息&#x…

C#,数值计算——分类与推理Phylo_clc的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylo_clc : Phylagglom { public override void premin(double[,] d, int[] nextp) { } public override double dminfn(double[…

WebSocket的入门秘籍?

一、是什么 WebSocket,是一种网络传输协议,位于OSI模型的应用层。可在单个TCP连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接&#xff0c…

Linux常用命令——clockdiff命令

在线Linux命令查询工具 clockdiff 检测两台linux主机的时间差 补充说明 在ip报文的首部和ICMP报文的首部都可以放入时间戳数据。clockdiff程序正是使用时间戳来测算目的主机和本地主机的系统时间差。 选项 -o:使用IP时间戳选项来测量系统时间差。时间戳只用3个…

Kotlin 中 apply、let、also、run的区别

apply apply 函数接收一个目标并回来该目标自身。它答应您在目标上履行一些操作&#xff0c;同时仍然回来原始目标。 fun <T> T.apply(block: T.() -> Unit): TT 是目标的类型&#xff0c;block 是一个 lambda 表达式&#xff0c;能够在该目标上履行一些操作。在这个…

【OpenCV概念】 11— 对象检测

一、说明 这都是关于物体识别的。物体识别是指通过计算机视觉技术&#xff0c;自动识别图像或视频中的物体及其属性和特征&#xff0c;是人工智能领域的一个分支。物体识别可应用于多个领域&#xff0c;包括工业自动化、智能家居、医疗、安防等。请随时阅读这篇文章&#xff1a…

【Qt进阶之自定义控件】使用QListWidget实现自定义Item效果

目的 Q&#xff1a;如何在Qt库的基础上&#xff0c;实现自定义控件呢&#xff1f; A&#xff1a;根据官方文档回答&#xff0c;就是继承需实现的控件&#xff0c;然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何&#xff1a; listItem 主…

【LeetCode】94. 二叉树的中序遍历 [ 左子树 根结点 右子树 ]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

【计算机网络笔记】OSI参考模型中端-端层(传输层、会话层、表示层、应用层)功能介绍

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

JVM参数调优

一、案例实践 64G物理内存服务器JVM参数配置建议 如果你的服务器有 64GB 内存&#xff0c;你可以使用以下 JVM 参数来优化 Java 程序的性能&#xff1a; -Xms&#xff1a;设置 Java 堆的初始内存使用量。推荐将该参数设置为总内存的 25% 到 50%。例如&#xff0c;可以设置为…

Debian11系统简单配置

debian11系统简单配置 网卡配置 修改/etc/network/interfaces address 192.168.0.188 gateway 192.168.0.1 netmask 255.255.255.0重启网卡systemctl restart networking.service systemctl restart networking 执行apt 报错 rootdebian:~# apt update 忽略:1 cdrom://[D…

软考 系统架构设计师系列知识点之基于架构的软件开发方法ABSD(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之基于架构的软件开发方法ABSD&#xff08;6&#xff09; 所属章节&#xff1a; 第7章. 系统架构设计基础知识 第5节. 特定领域软件体系结构 相关试题 3. 基于架构的软件设计&#xff08;Architecture-Based Software …

openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员

文章目录 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员106.1 初始用户106.2 系统管理员106.3 安全管理员106.4 审计管理员106.5 监控管理员106.6 运维管理员106.7 安全策略管理员 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员 10…

嵌入式硬件中常见的100种硬件选型方式

1请列举您知道的电阻、电容、电感品牌&#xff08;最好包括国内、国外品牌&#xff09;。 电阻&#xff1a; 美国&#xff1a;AVX、VISHAY 威世 日本&#xff1a;KOA 兴亚、Kyocera 京瓷、muRata 村田、Panasonic 松下、ROHM 罗姆、susumu、TDK 台湾&#xff1a;LIZ 丽智、PHY…

springBoot--web开发--WebMvcAutoConfiguration原理

WebMvcAutoConfiguration原理 自动配置类的生效条件hiddenHttpMethodFilter和formContentFilter的作用WebMvcConfigurer的作用使用演示 自动配置类的生效条件 点击ctarln 搜索类WebMvcAutoConfiguration hiddenHttpMethodFilter和formContentFilter的作用 hiddenHttpMethodF…

基于浣熊优化的BP神经网络(分类应用) - 附代码

基于浣熊优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于浣熊优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.浣熊优化BP神经网络3.1 BP神经网络参数设置3.2 浣熊算法应用 4.测试结果&#xff1a;5.M…

【单元测试】--基础知识

一、什么是单元测试 单元测试是软件开发中的一种测试方法&#xff0c;用于验证代码中的单个组件&#xff08;通常是函数、方法或类&#xff09;是否按预期工作。它旨在隔离和测试代码的最小单元&#xff0c;以确保其功能正确&#xff0c;提高代码质量和可维护性。单元测试通常…

函数式编程:Rust中的闭包与迭代器

闭包 Closure 闭包是一种匿名函数&#xff0c;它可以赋值给变量也可以作为参数传递给其它函数&#xff0c;不同于函数的是&#xff0c;它允许捕获调用者作用域中的值&#xff0c;例如&#xff1a; fn main() {let x 1;let sum |y| x y;assert_eq!(3, sum(2)); }上面的代码…

【JVM系列】- 类加载子系统与加载过程

类加载子系统与加载过程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正…