详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:首期文章
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

在此之前,耗时半个月,我已经将Redis进行了一个原理上的速成以及项目的制作,整个项目我觉得还是很不错的,基本已经涵盖了单结点Redis能做的所有事。而且在学习的过程中,我也将mybatis-plus、docker、nginx的反向代理、负载均衡都速成了一遍,收获还是很大的。

当然Redis的哨兵机制、分片集群这些我都还没去怎么学习,为了快点将自己的技术栈叠高一点,我直接进军微服务架构。

微服务技术栈的学习内容主要涵盖了SpringCloud、RabbitMQ、Docker、Redis、ElasticSearch、分布式等,要花上一段时间去学习,并且做一个中小型的项目。

微服务技术栈导学

  • 服务架构演变
    • 单体架构
    • 分布式架构
    • 微服务
  • 微服务技术对比
  • SpringCloud
  • 服务拆分及远程调用
    • 服务拆分
    • Demo工程
    • 远程调用

服务架构演变

微服务架构学习之前,经常做的项目是一个单体架构的。

单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:架构简单、部署成本低
缺点:耦合度高
单体架构肯定是不适合进行大型项目的开发的。

分布式架构

分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点:降低服务的耦合度,有利于服务的升级拓展
缺点:不同的功能都做成了服务集群,方法之间不再那么方便互相调用了,因此我们需要进行服务的治理

分布式架构要考虑以下的问题:

1、服务的拆分粒度;
2、服务集群地址的维护
3、服务之间的远程调用
4、感知服务的健康状态

微服务

到目前为止,微服务是解决分布式架构考虑问题的最佳解决方案,它是一种经过良好架构设计的分布式架构方案,微服务架构的特征:

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

总之,微服务架构非常符合我们之前学习软件工程、设计模式这些理论课过程中反复提到的高内聚、低耦合

微服务技术对比

在这里插入图片描述
可以看到,Feign是基于http请求的,只要我们是restful风格,调用和之前就差不多,学习成本会相对低很多。
学习微服务架构,比较推荐的方式就是SpringCloud+Feign或者SpringCloudAlibaba+Feign。

SpringCloud

官网地址:SpringCloud官网地址
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验,这也是它这么火热的原因。
需要注意好版本号问题:
在这里插入图片描述

服务拆分及远程调用

服务拆分

注意事项:

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

Demo工程

想要模拟一下服务的拆分,可以先自己试一下demo,查看不访问其他服务的数据库,能否实现业务之间的调用。

demo的工程代码,以及两个数据库表tb_user、tb_order都可以看我的资源去自行下载并验证,也可以直接在下面的百度网盘中下载:demo
这个demo的来源出自于黑马程序员。

导入工程,并且创建2个数据库,分别是cloud_order与cloud_order,各包含一张表(tb_order与tb_user),2张表不要创建在同一个数据库下面,要做到数据独立性,体现分布式。

自行修改配置文件,运行代码调通,都是很简单的query操作,不做解析了。
在这里插入图片描述
在这里插入图片描述

远程调用

当我们的用户想要看到订单详情表的时候,这个详情表除了要有订单的信息,还需要有购买的用户的信息,在单体架构我们很好实现这一点,只要我们能访问到用户的相关信息,那么用注解开发是很容易增加字段去注入用户信息的。
然而现在数据库是分离的,也就是说order-service无法直接访问user-service的数据库,因此,只能让订单业务去向用户业务发出请求:
在这里插入图片描述
远程调用方式分析:

1、回顾一下http请求原理,简单来说无非就是浏览器发出http请求信息,而服务中利用@GetMapping去接受请求,查询数据库后返还相应的信息给前端
2、因此可以设想让订单模块发起http请求给用户模块,用户模块查询自己的数据库后将相应数据返还给订单模块,做出拼接后即可得到订单详情表。

因此,应该思考如何使得java代码发出http请求。

Spring提供了一个工具叫做RestTemplate,专门用于在java代码中发起http请求。
1、在order-service的启动类OrderApplication中用@Bean注解注册RestTemplate:

	@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}

2、对订单的业务做修改:

@Service
public class OrderService {@Resourceprivate OrderMapper orderMapper;@Resourceprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.查询用户,利用RestTemplate发起http请求String url = "http://localhost:8081/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);//getForObject默认是返回json格式,如果指定返还的内容,则会自动反序列化//将用户注入到order中order.setUser(user);// 4.返回return order;}
}

现在已经成功查询到详情页了:
在这里插入图片描述
这篇文章就当洒洒水了,今天太累了,就摆烂了,明天调整回来。

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

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

相关文章

数据结构之bool类

bool类 bool 是布尔类。它是最简单的一个类,其取值有两种,1和O,即 True 和 False。可以这样简单地理解,除了1和0以及 True 和 False 的情况之外,但凡有值(非空)即为真,但凡无值&…

linux DHCP和DNS

DHCP dhcp 动态主机配置协议 dhcp工作原理 客户端 ------------------------------------------------->dhcp服务器 客户端会发送dhcp discover广播报文&#xff0c;寻找dhcp服务器 客户端 <-------------------------------------------------dhcp服务器 服务器收…

Java中的包机制、final和super关键字

一、包机制 关于java语言当中的包机制&#xff1a; 1.包又被称为package,java中引入package这种语法机制主要是为了方便程序的管理。 不同功能的类被分门别类放到不同的软件包当中&#xff0c;查找比较方便&#xff0c;管理比较方便&#xff0c;易维护。 2.怎么定义package呢…

第 7 章 排序算法

文章目录 7.1 排序算法的介绍7.3 算法的时间复杂度7.3.1 度量一个程序(算法)执行时间的两种方法7.3.2 时间频度7.3.3 时间复杂度7.3.4 常见的时间复杂度7.3.5 平均时间复杂度和最坏时间复杂度 7.4 算法的空间复杂度简介7.4.1 基本介绍 7.5 冒泡排序7.5.1 基本介绍7.5.2 演示冒泡…

Spring的纯注解配置

1、带改造的问题 我们发现&#xff0c;之所以我们现在离不开xml配置文件&#xff0c;是因为我们有一处很关键的配置&#xff0c;如果他要也能用注解配置&#xff0c;那么我们就可以脱离xml文件了&#xff1a; jdbc的配置 改造前&#xff1a; <context:property-placehol…

Redis的主从配置,哨兵模式,集群模式

目录 什么是主从复制&#xff1f; 主从复制的作用&#xff1f; 主从复制的流程&#xff1f; 搭建Redis的主从复制 安装Redis 环境准备 修改内核参数 安装Redis 定义systemd服务管理脚本 修改Redis配置文件&#xff08;Master节点操作&#xff09;192.168.17.25 修改Re…

js通过用 splice() 方法将一个数组插入到另一个数组的指定位置

在 JavaScript 中&#xff0c;可以使用 splice() 方法将一个数组插入到另一个数组的指定位置。splice() 方法用于向数组中添加或删除元素&#xff0c;并返回被删除的元素。 以下是一个示例代码&#xff1a; const array1 [1, 2, 3]; const array2 [4, 5, 6];const deletedE…

【数据库】聊聊MVCC机制与BufferPool缓存机制

上一篇文章&#xff0c;介绍了隔离级别&#xff0c;MySQL默认是使用可重复读&#xff0c;但是在可重复读的级别下&#xff0c;可能会出现幻读&#xff0c;也就是读取到另一个session添加的数据&#xff0c;那么除了配合使用间隙锁的方式&#xff0c;还使用了MVCC机制解决&#…

Linux重点

Linux命令的组成&#xff1f; a. 命令本身&#xff0c;选项&#xff0c;参数。查看的两个操作 a. cat 适合小文件 b. more分页查询适合中文件创建文件的选项有啥&#xff1f;创建文件的小技巧 a. 选项有-p b. 不管是否创建创建递进的文件&#xff0c;先给-p加上&#xff0c;加上…

DSL查询文档--查询结果处理

排序 elasticsearch默认是根据相关度算分&#xff08;_score&#xff09;来排序&#xff0c;但是也支持自定义方式对搜索结果排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 普通字段排序 keyword、数值、日期类型排序的语法基本一…

Android 实现获取集合中出现重复数据的值和数量

方法一&#xff1a;使用HashMap和HashSet 创建一个HashMap&#xff0c;用于存储集合中的元素及其出现次数。 Map<String, Integer> map new HashMap<>();遍历集合&#xff0c;将每个元素作为键&#xff0c;将其出现次数作为值添加到HashMap中。 for (String it…

【grid】pytorch中的Flow_filed,MES,affine_gridHGRID,GRID_SAMPLE详解

grid in Pytorch 官方链接&#xff1a; https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html#torch.nn.functional.grid_sample https://pytorch.org/docs/stable/generated/torch.nn.functional.grid_sample.html#torch-nn-functional-grid-sa…

SSH远程访问与控制

ssh优点 数据传输是加密的&#xff0c;可以防止信息泄露 数据传输是压缩的&#xff0c;可以提高传输速度 作用 sshd 服务使用 SSH 协议可以用来进行远程控制&#xff0c;或在计算机之间传送文件。 ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务&#xff08;文件传…

对C语言的理解

1.计算机语言 就是我们人类与计算机进行交流的媒介。我们可以使用编程语言对计算机下达命令&#xff0c;从而让计算机完成我们所需要的功能。 语言 语法 逻辑 计算机语言有很多种。如&#xff1a;C 、C、Java、Go、JavaScript、Python&#xff0c;Scala等。 2.计算机语言简史…

宠物空气净化器品牌推荐哪个牌子好?五款猫用空气净化器高质量推荐品牌

养宠人家里除了猫粮、猫砂和罐头等必备的日常用品外&#xff0c;宠物空气净化器也是必需的。它可以在我们不方便开窗通风的日子里&#xff0c;有效净化室内空气&#xff0c;并且能够有效减少动物皮屑引起的过敏反应。然而&#xff0c;面对市场上琳琅满目的新款空气净化器、功能…

嵌入式简历填写的相关注意事项

嵌入式简历 最近无聊在看咋写嵌入式简历的相关视频&#xff0c;这里就总结下。 嵌入式简历注意方法 自己的联系方式&#xff0c;包括姓名&#xff0c;性别&#xff0c;住在哪里&#xff08;大概外置就行&#xff09;&#xff0c;电话号码&#xff0c;邮箱&#xff08;最好不是…

Webpack模块打包工具

目录 Webpack模块打包工具知识点自测01.Webpack 简介以及体验目标讲解小结 02.Webpack 修改入口和出口目标讲解小结 03.案例-用户登录-长度判断目标讲解小结 04.Webpack 自动生成 html 文件目标讲解小结 05.Webpack-打包 css 代码目标讲解小结 06.优化-提取 css 代码目标讲解小…

浅谈对Maven的理解

一、什么是Maven Maven——是Java社区事实标准的项目管理工具&#xff0c;能帮你从琐碎的手工劳动中解脱出来&#xff0c;帮你规范整个组织的构建系统。不仅如此&#xff0c;它还有依赖管理、自动生成项目站点等特性&#xff0c;已经有无数的开源项目使用它来构建项目并促进团队…

C++ Webserver从零开始:基础知识(三)——Linux服务器程序框架

目录 前言 一.服务器编程基础框架 C/S模型 主要框架 二.I/O模型 阻塞I/O 非阻塞I/O 异步I/O 三.两种高效的事件处理模式 Reactor Proactor 四.模拟Proactor模式 五.半同步/半异步的并发模式 六.有限状态机 七.其他提高服务器性能的方法 池 数据复制 上下文切换…

浅谈缓存最终一致性的解决方案

浅谈缓存最终一致性的解决方案 作者&#xff1a;clareguo&#xff0c;腾讯 CSIG 后台开发工程师 来源&#xff1a;腾讯技术工程open in new window 到底是更新缓存还是删除缓存? 到底是先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存&#xff0c;再更新数据…