当前位置: 首页 > news >正文

微服务系列一:基础拆分实践

目录

前言

一、认识微服务

1.1 单体架构 VS 微服务架构 

1.2 微服务的集大成者:SpringCloud

1.3 微服务拆分原则

1.4 微服务拆分方式

二、微服务拆分入门步骤 :以拆分商品模块为例

三、服务注册订阅与远程调用:以拆分购物车为例

3.1 拆分模块、发现问题

3.2 问题分析、解决方法

3.3 实现远程调用:RestTemplate工具,实现端到端请求发送

四、微服务基础拆分总结

五、微服务基础追问巩固


前言

1. 微服务的基础入门篇,读完本文让你对微服务有一个基本的了解,与此同时通过两个微服务的模块拆分实验,发现微服务拆分面临的难题。并尝试去解决它。

2. 介绍微服务与单体架构的区别、微服务的拆分原则;解决跨微服务请求问题

一、认识微服务

        我觉得既然能看到这篇笔记,想必大家对微服务都是有一定的概念的。本篇文章是笔者在学习微服务、拆分微服务、解决拆分微服务中遇到的问题总结而来。是面向实践的。


参考下面这张项目架构演变图。微服务就是随着项目规模不断扩大,为了减轻服务器的压力、维持提高项目团队的高效协作、加快项目部署打包等功能提出的技术。

它将业务代码按照业务模块的不同,划分成多个小项目或是小模块,确保了每一个模块的职责明确,且分别部署到不同的一台或多台服务器上,减少服务器压力。

1.1 单体架构 VS 微服务架构 

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

优点:(小规模下的优势)

  • 架构简单
  • 部署难度低 
  • 维护成本低

缺点:(大规模下的缺陷)

  • 团队协作难(就好像1个人盖楼100天、100人盖楼1天、100万人盖楼1分钟 可能吗? 人越多,在一个单体中开发、维护越来越困难)
  • 发布效率低 (单体打包几个G、几十个G甚至更大,浪费多少时间
  • 系统可用性差(对服务器压力大,别的业务请求量大的时候会影响其他正常的业务


微服务架构:是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。

优点:(大规模下谈、小规模都不用)

  • 粒度小、发布效率高
  • 团队协调效率高
  • 单台服务器压力小

缺点:(大规模下谈、小规模都不用)

  • 需要解决不同业务之间的服务调用问题 (涉及到不同服务器之间的通信请求
  • 需要更多的部署成本 (服务器多了、项目的部署更加讲究

1.2 微服务的集大成者:SpringCloud

简单来说,微服务的概念很早就有了,但是家家不同。SpringCloud的出现,就像统一度量衡制定了一系列行业标准。

SpringCloud是目前国内使用最广泛的微服务框架。 SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

官网学习Spring Cloud

这张图可重要啦,对应着我们在拆分微服务项目的时候会遇到的各种问题,SpringCloud都给出了相应的解决措施。


SpringCloud 与 SpringBoot的版本对照

由于目前企业使用jdk8、jdk11比较多,所有本次实验采用2021版Spring Cloud进行微服务搭建

1.3 微服务拆分原则

1. 单一职责原则

每个微服务应专注于执行单一的功能或业务领域。

2. 高内聚、低耦合

把相关的行为都聚集在一起,把不相干的行为放到其他地方。这样,当他们要修改某个行为的时候,只需要在一个地方修改即可,然后就能对该修改及早地进行发布。同时也有利于降低模块与模块之间的耦合性,提高每个模块的独立性。

如果要在很多不同的地方做修改,那么就需要同时发布多个微服务才能交付这个功能。修改进度不统一、测试工作不线性、部署工作不集中。从而大大降低开发效率。

3. 独立有边界

微服务应有明确定义的边界和功能。

1.4 微服务拆分方式

纵向拆分:按业务模块进行拆分,并遵循微服务拆分原则

横向补充:对于大家都会用到的公共服务,还可以在纵向基础上补充横向拆分,抽取公共服务,提高代码复用

目前广泛应用的两种微服务架构

1. 拆分独立若干project,分项目管理

这种拆分适合于超大规模的团队协调开发,项目完全解耦。

  • 优点:服务之间耦合度低

  • 缺点:每个项目都有自己的独立仓库,管理起来比较麻烦

2. 拆分依赖于主模块的若干子模块,统一Maven管理

这种拆分相对我们学习来说比较容易,一个项目内用不同的模块代表不同的服务

  • 优点:项目代码集中,管理和运维方便

  • 缺点:服务之间耦合,编译时间较长

二、微服务拆分入门步骤 :以拆分商品模块为例

本次实验以黑马商城的项目拆分为例,采用拆分模块的方式来进行微服务的学习:

2.1 入门拆分微服务步骤 

  • 第一步:新建微服务模块
  • 第二步:拷贝父工程的依赖坐标
  • 第三步:搭建基本框架,编写启动类
  • 第四步:拷贝配置文件,修改相关配置
  • 第五步:拷贝业务代码,遵循从 domain -- mapper -- service -- controller,注意检查导包
  • 第六步:连接数据库,确认微服务数据库
  • 第七步:测试项目 访问 接口文档 进行代码请求测试http://localhost:8081/doc.htmlicon-default.png?t=O83Ahttp://localhost:8081/doc.html

<!--来自父工程--><dependencies><!--common--><dependency><groupId>com.heima</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--mybatis--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

2.2 解决商品模块的请求 500 问题

原因】 数据库连接失败,配置文件加载失败

解决措施】修改配置文件名即可

三、服务注册订阅与远程调用:以拆分购物车为例

3.1 拆分模块、发现问题

前面的拆分步骤照常,以下是拆分购物车模块遇到的问题

购物车微服务需要依赖商品微服务模块的方法,因此产生了报错,对此我们先采取注释的方式。先确保购物车微服务模块搭建运行成功后,后续我们再来通过SpringCloud的技术来解决这个问题。

接着配置数据库、将微服务部署到8082端口,启动访问测试:http://localhost:8082/doc.html

3.2 问题分析、解决方法

我们发现,拆分微服务的项目往往会面临这样一个问题:一个微服务需要注入另外一个微服务的方法或属性。

可是拆分微服务需要遵循一个原则:独立性、单一职责。也就是说我们不应该在购物车的微服务业务中注入过多的商品微服务模块的方法。

因此,我们需要思考如何让购物车微服务获取到商品微服务的方法同时又不破坏拆分原则呢?我们知道实际上我们发送的请求是一个完整的URL,可不可以这样做:我们模仿前端向后端发送请求的格式,让购物车发送获取商品信息的请求,这样一来不就解决问题了嘛

3.3 实现远程调用:RestTemplate工具,实现端到端请求发送

服务拆分之后,不可避免的会出现跨微服务的业务,此时微服务之间就需要进行远程调用。微服务之间的远程调用被称为RPC,即远程过程调用。

RestTemplate介绍

java开发中,使用http连接访问第三方网络接口,通常使用工具HttpClient和OKHttp。(后面讲)

如果使用spring框架,可以使用Spring给我们提供了一个RestTemplate工具,可以方便的实现Http请求的发送。

restTemplate默认的连接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP连接方式。

【使用步骤】

1. 在springboot项目中,需要使用RestTemplate的模块【cartcart-service】新建config配置

2. 注入RestTemplate对象

3. 使用RestTemplate方法进行代码修改

private void handleCartItems(List<CartVO> vos) {// 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品// 2.1 构建请求、发送请求ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));//2.2 解析响应对象if(!response.getStatusCode().is2xxSuccessful()) {// 查询失败return;}// 2.3 获取查询商品对象List<ItemDTO> items = response.getBody();if(CollUtils.isEmpty(items)) {return;}// 3.构建商品id与商品对象的映射Map<Long,ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));//4. 写入VO对象返回前端for(CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if(item == null) {continue;}v.setNewPrice(item.getPrice()); // 最新价格v.setStock(item.getStock()); // 库存v.setStatus(item.getStatus()); // 状态}}

功能测试

四、微服务基础拆分总结

到此为止,事实上你已经可以搭建一个简易的微服务项目了。尽管这个微服务项目还有诸多问题和挑战。

例如你发现没有?在我们使用RestTemplate工具发送请求的时候,url是我们写死的。而且开发者需要非常清楚有这么一个方法,有这么一个方法的提供者,并且要知道提供者的具体地址。与此同时,如果服务的提供者宕机了,服务调用者也无法得知。这样的限制太大了。所以后期我们一定会寻求这方面的突破的。

在基础篇中,我们了解了微服务架构和单体架构的区别、学习了微服务拆分的模式和需要遵循的原则、尝试进行简单微服务模块的拆分并调试成功、成功发现跨微服务请求问题并初步尝试使用强大的RestTemplate去解决它......通过以上内容,相信你已经入门微服务了,接下来也能更好地去深入微服务项目的学习。

五、微服务基础追问巩固

1. 谈谈什么是微服务?什么时候要用微服务?目前主流的微服务技术有哪些?

2. 谈谈拆分微服务应该遵守哪些原则?你认为其中最有挑战性的是什么?

3. 详细讲解微服务的拆分步骤是什么?

4. 如果拆分过程中遇到要使用其他微服务提供的方法是,如何实现请求的远程调用?

5. 了解过RestTemplate没有?请谈谈你对RestTemplate的看法,具体的使用步骤是什么?

相关文章:

微服务系列一:基础拆分实践

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …...

leetcode 1470.重新排列数组

1.题目要求: 2.题目代码: class Solution { public:vector<int> shuffle(vector<int>& nums, int n) {vector<int> x_array(nums.begin(),nums.begin() n);vector<int> y_array(nums.begin() n,nums.end());int x_index 0;int y_index 0;for…...

windows在两台机器上测试 MySQL 集群实现实时备份

在两台机器上测试 MySQL 集群实现实时备份的基本步骤&#xff1a; 一、环境准备 机器配置 确保两台机器&#xff08;假设为服务器 A 和服务器 B&#xff09;能够互相通信&#xff0c;例如它们在同一个局域网内&#xff0c;并且开放了 MySQL 通信所需的端口&#xff08;默认是 …...

点晴模切ERP系统助力模切企业转型升级之路

随着我国制造业规模不断扩大&#xff0c;中国制造业已经从高速扩张转向深入挖潜的关键阶段。数字化转型不仅有助于提升企业的生产效率和管理水平&#xff0c;还能有效应对市场竞争&#xff0c;实现可持续发展。在数字化转型的过程中&#xff0c;企业资源规划&#xff08;ERP&am…...

redis修改配置文件配置密码开启远程访问后台运行

编辑 Redis 配置文件 编辑 /etc/redis/redis.conf&#xff0c;设置必要的参数。 sudo vim /etc/redis/redis.conf设置后台运行&#xff1a; 找到以下行&#xff0c;将 no 改为 yes&#xff1a; daemonize yes设置密码&#xff1a; 找到以下行&#xff0c;取消注释并设置密码为…...

市场分化!汽车零部件「变天」

全球汽车市场的动荡不安&#xff0c;还在持续。 本周&#xff0c;全球TOP20汽车零部件公司—安波福&#xff08;Aptiv&#xff09;发布2024年第三季度财报显示&#xff0c;三季度公司经调整后确认收入同比下降6%&#xff1b;按照区域市场来看&#xff0c;也几乎是清一色的下滑景…...

SCSS在Vue中的用法

SCSS在Vue中的用法 一、安装相关依赖1、安装sass - loader和node - sass&#xff08;或dart - sass&#xff09; 二、在组件中使用SCSS1、单文件组件&#xff08;.vue&#xff09;中的样式使用2、**全局样式使用SCSS**3、在组件中使用变量和混入&#xff08;Mixins&#xff09;…...

CPU用户时间百分比

在计算机系统中&#xff0c;"CPU用户时间百分比&#xff08;CPU User Time&#xff09;"是一个性能监控指标&#xff0c;它描述了CPU在用户模式下执行的累积时间与总的CPU时间的比例。这个指标可以帮助我们了解系统在执行用户态程序时的负载情况。下面是一些关于CPU用…...

RN中的StyleSheet

一、RN中样式的特点 RN的样式和前端的CSS的样式有一些区别。主要如下&#xff1a; RN中的样式 前端的CSS 继承性 没有继承性 有继承性 命名 fontSize&#xff08;小驼峰命名&#xff09; font-size 尺寸单位 with: 100 With: 100px 特殊的样式名 marginHorizontal…...

Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置

在开始开发 Swift 应用之前&#xff0c;了解 Swift 语言的背景和设置开发环境非常重要。接下来&#xff0c;我们将逐步介绍 Swift 的基本概念&#xff0c;并带你完成开发环境的安装和项目创建。 1.1 Swift 简介 Swift 是由 Apple 开发的一种现代化编程语言&#xff0c;于 201…...

躺平成长-下一个更新的数据(躺平成长数据显示核心)

旭日图&#xff08;Sunburst Chart&#xff09;是一种用于展示具有层次结构数据的可视化图表。 开源竞争&#xff1a; &#xff08;当你无法掌握技术的时候&#xff0c;就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多的人帮助你完善你的技术&#xff0c;那…...

你们接口怎么测?有没有完完整整的把一个接口测下来?

面试官在问到这道问题的时候&#xff0c;我们应该这么去回答&#xff0c;根据自己技术掌握的水准进行由浅入深的回答。 基础&#xff1a; 我们接口测试之前&#xff0c;开发都会有一份接口文档给到我们&#xff0c;我们要分析接口中的入参和响应。 针对入参的参数类型和参数…...

Pinia-状态管理

Pinia-状态管理 特点&#xff1a; 1. 轻量和模块化 Pinia 是一个轻量级的状态管理库&#xff0c;支持模块化管理&#xff0c;即可以将应用的状态分成多个 store 以实现更好的组织。使用 Pinia&#xff0c;可以定义多个 store&#xff0c;每个 store 都是一个独立的模块&#x…...

IP系列之bscan讨论

1、做Bcan前首先要确定ip_vender是否已经在phy_level做好了bscan_chian&#xff1f;&#xff1f;&#xff1f; 若已经做好&#xff0c;那么vender会给一个XXX.bsdl文件&#xff0c;结合详细的ip文档指导手册&#xff0c;确定bscan_chain是在内部的tap下挂着&#xff0c;还是单…...

Centos安装配置Jenkins

下载安装 注意&#xff1a;推荐的LTS版本对部分插件不适配&#xff0c;直接用最新的版本&#xff0c;jenkins还需要用到git和maven&#xff0c;服务器上已经安装&#xff0c;可查看参考文档[1]、[2]&#xff0c;本次不再演示 访问开始使用 Jenkins 下载jenkins 上传至服务器…...

创新医疗突破:新型穿刺器显著提高手术安全性与效率

据QYResearch调研团队最新报告“中国穿刺器市场报告2023-2029”显示&#xff0c;预计2029年中国穿刺器市场规模将达到18.5亿美元&#xff0c;未来几年年复合增长率CAGR为18.1%。 如上图表/数据&#xff0c;摘自QYResearch最新报告“中国穿刺器市场研究报告2023-2029. 如上图表/…...

【MySQL】可重复读级别下基于Next Key Lock解决幻读

昨天读到了一篇文章[1]&#xff0c;里面讲&#xff0c;面试官说mysql的可重复读级别下有解决幻读的方式&#xff0c;最后公布了答案&#xff0c;是在sql后面加for update。这么说倒是没错&#xff0c;但是这种问法给我一种奇怪的感觉&#xff0c;因为for update无论在哪个隔离级…...

【安全性分析】正式安全分析与非正式安全分析

安全性分析-系列文章目录 第一章 【安全性分析】正式安全分析与非正式安全分析 第二章 【安全性分析】BAN逻辑 (BAN Logic) 文章目录 安全性分析-系列文章目录前言一、正式安全分析1. 理想化模型(如随机预言机模型)2. 标准模型(Standard Model)3. 形式化验证4. 数学证明二…...

【项目开发】高校思政课程实践任务平台—数据库设计

未经许可,不得转载。 文章目录 1、项目需求2、数据库选型3、概念数据模型设计3.1、实体及属性3.2、实体关系3.3、补充说明4、数据库语句4.1、数据库对象创建语句4.2、功能实现的SQL语句4.3、视图创建语句4.4、触发器创建语句5、安全性考虑5.1、用户认证和授权5.2、数据传输安全…...

计算机网络安全应该学习哪些知识?

计算机网络安全是一个广泛而深入的领域&#xff0c;要成为一名专业的网络安全专家&#xff0c;需要系统地学习多个方面的知识。以下是一些关键的学习方向&#xff1a; 一、基础知识计算机网络&#xff1a;学习OSI、TCP/IP模型&#xff0c;网络协议&#xff0c;网络设备工作原理…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

关于疲劳分析的各种方法

疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数&#xff0c;可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础&#xff0c;采用雨流法取出一个个相互独立、互不相关的应力循环&…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景&#xff1a;为什么需要代理&#xff1f;​​ 最近在技术社区看到这样的求助&#xff1a; "公司服务器在国内&#xff0c;但业务需要调用OpenAI接口&#xff0c;直接访…...