【SpringCloud】一、认识微服务

news2024/11/26 10:33:20

文章目录

  • 1、学习提纲
  • 2、和单体架构的比较
  • 3、认识微服务
  • 4、微服务技术常用框架
  • 5、SprigCloud
  • 6、服务拆分
  • 7、微服务远程调用

1、学习提纲

相比传统单体架构,微服务的整体架构如下图:

在这里插入图片描述

再引入日志、监控、持续集成、持续部署,就成了下面这个图:

在这里插入图片描述

对这里涉及到的技术,进行一个分类:

在这里插入图片描述

2、和单体架构的比较

单体架构

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

  • 架构简单
  • 部署成本低

缺点则是:

  • 耦合度高

在这里插入图片描述

微服务架构

相比单体架构,分布式架构则是根据业务功能对系统进行拆分,每个业务模块做为独立项目开发,成为一个个服务。从而:

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

在这里插入图片描述
但此时也产生了新的问题:

  • 系统怎么拆,即服务拆分粒度如何
  • 服务集群的地址怎么维护
  • 服务之间如何远程调用
  • 服务健康状态怎么感知
    在这里插入图片描述

3、认识微服务

微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力

  • 面向服务:微服务对外暴露业务接口

  • 自治:团队独立、技术独立、数据独立、部署独立。即每个服务有一个小组负责,这个小组有自己的前后端、测试、运维。可以选择适合该服务的语言与技术。每个服务有自己的数据库。

  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题(一个服务挂了,向依赖的服务全挂了)

在这里插入图片描述

服务之间的调用关系错综复杂,需要进行维护,因此微服务中还有一个注册中心,去维护每个微服务的信息和监控服务的健康状态。

对于一些配置,每次去微服务代码中去修改不现实,因此,还有一个配置中心,去统一管理每个微服务的配置。

最后再加上一个网关做为访问的入口,就得到了这样的架构:

在这里插入图片描述

4、微服务技术常用框架

微服务这种技术需要技术框架来进行落地,最常用的是SpringCloud和阿里巴巴的Dubbo。下面做个对比:

在这里插入图片描述
企业中常用的一个情况是:

  • SpringCloud技术栈
  • 接口采用Restful风格
  • 服务调用采用Feign方式

5、SprigCloud

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud

SpringCloud集成了下面的各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配。

在这里插入图片描述

SpringCloud和SpringBoot的版本适配情况:

在这里插入图片描述

6、服务拆分

微服务拆分的注意事项:

  • 单一职责:不同微服务,不要重复开发相同业务

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

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

在这里插入图片描述

案例:

在这里插入图片描述
在IDEA中导入Demo工程:

在这里插入图片描述
这里有两个模块:

在这里插入图片描述

调用一下两个模块的接口:

在这里插入图片描述

到此,可以看到拆分完成,不同的模块干不同的职责,order模块查订单,user模块查用户。并且数据库也做了分离。每个微服务有自己独立的数据库。

7、微服务远程调用

需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回
# 两个信息在不同的数据库
# 查询这两个信息得用两个模块的接口(这里只是举例,当然你强行在其中一个模块创建mapper并指定数据库也能实现,但这首先不符合微服务规范,因为操作了其他微服务的数据库。其次当这里的接口实现很复杂,不再是一句SQL能完成的时候,这么操作就不现实了)

分析:

在这里插入图片描述

实现远程调用:

在这里插入图片描述
像在浏览器发送HTTP请求得到用户信息一样,在模块中发送HTTP请求也可以得到响应。那如何在Java代码中发起合HTTP请求呢?

实现微服务调用的步骤:

STEP1:在调用方的(配置类)启动类中注册RestTemplate

//Bean的注入只能放在配置类中,而@SpringBootApplication注解的启动类本身也是配置类
@Bean
public RestTemplate restTemplate(){
	return new RestTemplate();
}

在这里插入图片描述

STEP2:在需要远程调用其他服务的方法中,使用restTemplate对象,调用getForObject方法或者postForObjecct方法,传入调用的url,和需要的类型(就可以json反序列化出User.class类型的对象)

@Service
public class OrderService{

	@Autowired
	private RestTemplate restTemplate;
	public Order queryOrderById(Long orderId){
		//查询订单
		Order order = orderMapper.findById(orderId);
		//查询用户
		String url = "http://localhost:8081/user/" + order.getUserId();
		//这里的url参数,浏览器中是个啥,这里也就是个啥,一样的
		User user = restTemplate.getForObject(url,User.class);
		//封装user信息,order对象中有引用属性User类型
		order.setUser(user);
		return order;
		
	}
}

重启order服务:

在这里插入图片描述

到此,跨服务的调用实现。

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

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

相关文章

RocketMQ 的介绍和基本使用

介绍 在 RabbitMQ 的基本概念和五种模式使用示例 前半部分介绍了 MQ 的应用场景,以及多个 MQ 产品的对比,那时说到 RocketMQ 的客户端版本只有 Java , 现在 Apache RocketMQ 社区中也增加了 C NodeJS Python Go 的客户端。 RocketMQ 是阿里巴巴开源的一…

iOS正确获取图片参数深入探究及CGImageRef的使用(附源码)

一 图片参数的正确获取 先拿一张图片作为测试使用 图片参数如下: 图片的尺寸为: -宽1236个像素点 -高748个像素点 -色彩空间为RGB -描述文件为彩色LCD -带有Alpha通道 请记住这几个参数,待会儿我们演示如何正确获取。 将这张图片分别放在…

从零开始 Spring Boot 32:AOP II

从零开始 Spring Boot 32:AOP II 图源:简书 (jianshu.com) 之前写过一篇文章从零开始 Spring Boot 26:AOP - 红茶的个人站点 (icexmoon.cn),讨论了AOP的基本用法,但那篇文章相当粗疏,对Spring中的AOP技术讨…

免费快速部署ChatGPT线上聊天网页:ChatGPT API + Github + Railway

1、使用工具 (1)需要自己生成的openai api,获取API的网站:openAI API 获取方式:OpenAI的API key获取方法 (2)本次使用该参考项目进行部署:chatweb 需要将该项目fork到自己的仓库里 …

29 SQL——事务操作

create table account (id int auto_increment primary key comment 主键ID,name varchar(18) comment 姓名,money int comment 余额 )comment 账户表;insert into account(id, name ,money)values(null,张三,2000),(nul…

不定积分题型简单总结

不定积分 考研数学复习笔记,用来复习知识点用,如有不足还请指出,Thanks♪(・ω・)ノ 文章目录 不定积分1 原函数/不定积分 概念和性质2 原函数存在定理3 不定积分的基本公式4 不定积分的基本计算4.1 三角代换型…

中间件-RabbitMQ

文章目录 1.什么是MQ1.1 特点1.2 MQ产品分类 2.RabbitMQ2.1.RabbitMQ介绍2.2.使用Docker安装RabbitMQ 3.SpringBoot中使用RabbitMQ3.1.SpringAMQP3.2使用步骤 1.什么是MQ RabbitMQ官方文档 消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消…

SpringBoot+Vue实现校园二手系统。前后端分离技术【完整功能介绍+实现详情+源码】

前言 文章内容有点长,建议打开右侧目录导航栏查看。 这个系统基本上可以改造为其它类似的系统。后台管理基本上一致。前台进行一些页面样式的改造就可以变成一个新的系统。有时间,做几个变体系统。 闲的无聊,把大学时候做的一个系统进行了重…

git源代码管理

文章目录 git源代码管理git单人本地仓库操作创建远程仓库(github为例)多人开发与冲突分支操作SSH(安全外壳协议) git源代码管理 文档连接:https://git-scm.com/docs git是用于源代码管理,方便多人协同开发…

架构整洁之道上篇(编程范式设计原则)

目录 1.概述 2.编程范式 2.1.结构化编程 2.2.面向对象编程 2.3.函数式编程 3.设计原则 3.1.单一职责原则 3.2.开闭原则 3.3.里氏替换原则 3.4.接口隔离原则 3.5.依赖反转原则 4.小结 1.概述 软件架构的终极目标是,用最小的人力成本来满足构建和维护该系…

2023 操作系统 R 复习大纲( 适用于太理软件 21 级)

目录 01.操作系统的定义 02.操作系统的基本类型及特征 1.批处理操作系统(单、多道) 2.分时操作系统 3.实时操作系统 03.操作系统的功能及特征 04.进程的定义、特征 05.进程基本状态及其转换原因 06.进程互斥、同步 07.进程控制块的内容、作用 …

Java数据类型之整数类型与浮点数

标识符(名字) 作用域 离其最近的大括号 { } !!! 数据类型的分类 赋值时,不可超过数据类型的范围(不可越界) 常量的进制转换 tips:给变量赋值时,值可以为不同…

从代码层面理解Transformer

跑通 代码使用的是 https://github.com/jadore801120/attention-is-all-you-need-pytorch, commit-id 为: 132907d 各模块粗览 Transformer 主要包括一堆参数, 以及encoder和decoder forward的时候主要做了如下操作. 先 pad_mask过encoder过decoder输出logit 从train.py …

C语言-【指针一】-【什么是指针/指针类型】

对于初学者来说,是不是一提到指针,大家就头疼啊,哈哈哈,当然,它都这么“吓人”了,那么在C语言中扮演的角色也很重要,当然,它也是C语言中的一个特色,如果我们把它拿下的话…

ESP32CAM,点亮一个LED(Arduino平台)

前言 (1)在此,吐槽一下乐鑫的函数介绍,真的难找。恶心的一批。气死我了。 (2)接下来我将会介绍我是如何找到ESP32的Arduino平台的函数库的。你将会知道为啥我这么大的戾气。 (3)同时…

linux系统中输入与输出重定向

什么是输入输出重定向 我们在日常工作中最常用的是输出重定向,输出重定向就是将原本要打印到屏幕中的信息重定向到一个文件中。而输入重定向呢就是指把文件导入到命令中去,听起来是不是有点抽象啊,后面看博主举例说明就很好理由啦。 输出重定…

通讯录信息管理系统

系列文章 任务50 通讯录信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试插入按编号查找按姓名查找按城市查找更新排序浏览删除统计…

超好玩C++控制台打飞机小游戏,附源码

我终于决定还是把这个放出来。 视频在这:https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg.html 具体信息主界面上都有写。 按空格暂停,建议暂停后再升级属性。 记录最高分的文件进行了加密。 有boss(上面视频2分47秒)。 挺好…

轻松转换CAJ文件为PDF格式:免费工具和技巧

在处理中国知网(CNKI)数据库中的CAJ文件时,将其转换为更常用的PDF格式可以提供更广泛的共享和便捷的阅读体验。本文将介绍一种免费的工具和一些技巧,帮助您轻松地将CAJ文件转换为PDF格式。我们将使用记灵在线工具进行操作。 记灵…

推荐几本提高程序员职业素养的书

如果你是一名程序员,想要提长自己,那么这几本书推荐给你。 1、好代码 ,坏代码 为了写出优良的代码,我们必须对手上的方案有合理的判断,并彻底想清楚特定方法的结果(好的和坏的)。为此&#xff…