SpringCloud01--黑马【上】

news2024/12/23 15:35:38

SpringCloud01

1.认识微服务

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

1.0.学习目标

了解微服务架构的优缺点

1.1.单体架构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUOVVW0Z-1671434633083)(assets/image-20210713202807818.png)]
单体架构的优缺点如下:

优点:

  • 架构简单
  • 部署成本低

缺点:

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

1.2.分布式架构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqcv3HMt-1671434633088)(assets/image-20210713203124797.png)]
分布式架构的优缺点:

优点:

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

缺点:

  • 服务调用关系错综复杂

分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:

  • 服务拆分的粒度如何界定?
  • 服务之间如何调用?
  • 服务的调用关系如何管理?

人们需要制定一套行之有效的标准来约束分布式架构。

1.3.微服务

微服务的架构特征:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTHNGKsa-1671434633091)(assets/image-20210713203753373.png)]
微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高

内聚,低耦合。因此,可以认为微服务是一种经过良好架构设计的分布式架构方案

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

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

1.4.SpringCloud

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

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

其中常见的组件包括:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gv2otG2u-1671434633094)(assets/image-20210713204155887.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efxuUjxs-1671434633095)(assets/image-20210713205003790.png)]
我们课堂学习的版本是 Hoxton.SR10,因此对应的SpringBoot版本是2.3.x版本。

1.5.总结

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

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

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

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

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

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

2.服务拆分和远程调用

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

2.1.服务拆分原则

这里我总结了微服务拆分时的几个原则:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ejwmP0W7-1671434633098)(assets/image-20210713210800950.png)]

2.2.服务拆分示例

以课前资料中的微服务cloud-demo为例,其结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HhG1s1EK-1671434633102)(assets/image-20210713211009593.png)]
cloud-demo:父工程,管理依赖

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

要求:

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

2.2.1.导入Sql语句

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

在这里插入图片描述

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

在这里插入图片描述
cloud-order表中初始数据如下:

在这里插入图片描述
cloud-order表中持有cloud-user表中的id字段。

2.3.实现远程调用案例

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

在这里插入图片描述

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

在这里插入图片描述

其中的user为null

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDrYSTbz-1671434633122)(assets/image-20210713213146089.png)]

查询的结果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-padW0XS0-1671434633123)(assets/image-20210713213213075.png)]

2.3.1.案例需求:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tu0F88HM-1671434633125)(assets/image-20210713213312278.png)]

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

大概的步骤是这样的:

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

2.3.2.注册RestTemplate

首先,我们在order-service服务中的OrderApplication启动类中,注册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();
    }
}

2.3.3.实现远程调用

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WLrR5GS-1671434633126)(assets/image-20210713213959569.png)]

2.4.提供者与消费者

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

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

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

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

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

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

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

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

相关文章

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法 本次和大家分享三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法,由于汇川IT6000系列触摸屏组态软件中没有三菱FX5U系列PLC的连接驱动,所以采用MODBUS TCP通信的方式实现。 具体步骤可…

黄海冷水区微生物群落的季节演替及温度响应模式

期刊:Applied and Environmental Microbiology 影响因子:5.005 发表时间:2022 样本类型:水体 客户单位:中国海洋大学 凌恩客户中国海洋大学发表在《Applied and Environmental Microbiology》上的文章…

vue3 antd项目实战——table表格 根据属性值设置背景颜色【rowClassName添加行样式 + /deep/样式穿透 + css不可控】

根据数据属性值添加table表格行样式(rowClassName)知识调用场景复现利用rowClassName编写行样式编写行样式函数➕筛选条件编写特定的行样式取消相应的斑马纹样式知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vue组件库引入…

如何检测时间序列中的异方差(Heteroskedasticity)

时间序列中非恒定方差的检测与处理,如果一个时间序列的方差随时间变化,那么它就是异方差的。否则数据集是同方差的。 异方差性影响时间序列建模。因此检测和处理这种情况非常重要。 让我们从一个可视化的例子开始。 下面的图1显示了航空公司乘客的时间…

Zotero快速入门

文章目录一、前言二、下载和安装Zotero三、界面初识和基本操作3.1 创建分类3.2 文献导入3.2.1 自动导入3.2.2 手动导入3.3 内置pdf管理3.4 同步3.5 插件3.5.1 安装方法3.5.2 插件推荐四、与word/wps协同引用文献4.1 使用内置格式4.1.1 添加索引4.1.2 添加书目4.2 自定义格式4.2…

基于AD Event日志监测域内信息探测行为

01、简介当攻击者获得内网某台域内服务器的权限,就会以此为起始攻击点,尽可能地去收集域的信息,以获取域控权限作为内网的终极目标。例如,攻击者会在内网中收集域管理员用户列表和特定敏感用户的信息,通过定位域管理员…

【c++】STL--vector

前言 想必大家已经对string有所了解了,string是专门用于字符串的。今天讲到的vector则是表示可变大小数组的序列容器。就像数组一样,vectoer也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组…

从根本上理解Synchronized的加锁过程

伸手摘星,即使一无所获,亦不致满手污泥。 请关注公众号:星河之码 作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 …

顶刊实证复现:金融投资行为与企业技术创新 -动机分析与经验证据(思路梳理+全数据源+python代码)

标题:金融投资行为与企业技术创新 ——动机分析与经验证据 参考文献 作者:段军山 庄旭东 数据概况 1、数据来源: 第三方数据库 2、样本:2009-2018 中国 A 股市场的上市公司科技数据和财务数据 3、数据处理: (1)由…

Filter和Listener学习笔记

1.什么是Filter 2.定义过滤器 (注意导的Filter的包来源是Javax.servlet) /* 定义一个过滤器的步骤:1. 自定义一个类实现Filter接口2. 把过滤器规则定义在doFilter方法里面3. 使用WebFilter注解配置过滤的路径*///过滤的路径 //WebFilter(&qu…

用拙劣的Python技术画出的圣诞树(勿喷)

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 一、前言 今天晚上,准备睡觉的我看见了CSDN有活动了,我就立马飞奔到电脑前面 这不,CSDN又举办了一场活动,看着令人心动的奖励和丰富的勋章,我的口水都从眼睛里流出来了(夸张),我准备创造一颗圣诞树,但是又想到我…

「设计模式」责任链模式

「设计模式」责任链模式 文章目录「设计模式」责任链模式一、概述二、结构三、案例实现四、优缺点五、应用场景六、模拟过滤器机制七、拓展八、小结一、概述 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予…

高频时序数据的储存与统计方案

文章目录问题背景解决办法第一步,梳理数据和计算要求第二步,确定存储和计算方案第三步,确定技术选型和方案第四步,实施优化方案后记问题背景 发电设备中常常会放置传感器(DCS)来采集数据以监控设备运转的状…

河海大学软件工程学硕考研复试经验贴

一、写在前面 想必看到这篇文章的学弟学妹都已经考完初试了,考得如何每个人心中各有千秋。无论如何,坚持将考研整个过程走下来的你们就已经是最棒的了,现在可以好好休息一下,静待考研成绩的公布了。 我写下这篇文章的目的主要是…

4.3.1、IPv4 地址概述

1、基本介绍 在 TCP/IP 体系中,IP 地址是一个最基本的概念,我们必须把它弄清楚。 IPv4 地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的 32 比特的标识符。 IP 地址由因特网名…

5.8 什么是学习博主?看两个博主案例【玩赚小红书】

先看大家看两个博主案例 ​ 学习博主,就是专门为用户提供学习方法的人。 学习方法在小红书的内容中属于干货价值,也就是用户们需要的东西,能为他们解决问题的内容,所以是比较受欢迎的,换言之,就是笔记数据…

Spark 3.0 - 15.ML PIC 快速迭代聚类理论与实战

目录 一.引言 二.PIC 理论 1.谱聚类 2.快速迭代聚类 三.PIC 实战 1.数据准备 2.构建 PIC 3.预测与展示 四.总结 一.引言 前面介绍了 K-means 聚类与高斯混合聚类,本文介绍另外一种聚类方法 Power Iteration Cluster 快速迭代聚类,简称 PIC。快…

【架构设计】你的类足够“专一”吗

前言 软件设计SOLID原则中有一个最基础的原则就是单一职责原则,我想绝大部分的程序员都知道,而且都理解它的意思,甚至觉得很简单。但是往往“看懂”和“会用”是两回事,而“用好”更是难上加难。好比我们项目,一开始一…

取代OpenFeign:Spring Framework 6全新声明式客户端@HttpExchange

本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“…

【几种可调动对象,Function和bind;线程的调动方式举例】

1.可调动对象的调动方式 方法 1、函数指针调动 方法2 、类类型的括号的重载 调动可调动对象 #include<iostream> #include<functional> using namespace std; struct Foo {void operator()(int x){cout<<"Foo operator "<<x<<endl;}…