微服务的认识与拆分

微服务架构通过将应用分解为一组小的、独立的服务来实现,每个服务围绕特定业务功能构建,并能独立部署与扩展。这种架构增强了开发灵活性、提高了系统的可维护性和扩展性,使得团队可以更快地响应变化和市场需求。

目录

认识微服务

单体架构

微服务架构

微服务拆分

服务拆分原则

拆分时机

拆分细则

微服务工程结构

服务拆分实现

服务调用


认识微服务

单体架构

单体架构:顾名思义,整个项目中所有功能模块都在一个工程中开发;项目部署时需要对所有模块一起编译、打包;项目的架构设计、开发模式都非常简单。

适用场景;当项目规模较小时,这种模式上手快,部署、运维也都很方便,因此早期很多小型项目都采用这种模式。

项目的业务规模越来越大,团队开发人员也不断增加,单体架构就呈现出越来越多的问题

  • 团队协作成本高:试想一下,你们团队数十个人同时协作开发同一个项目,由于所有模块都在一个项目中,不同模块的代码之间物理边界越来越模糊。最终要把功能合并到一个分支,你绝对会陷入到解决冲突的泥潭之中。

  • 系统发布效率低:任何模块变更都需要发布整个系统,而系统发布过程中需要多个模块之间制约较多,需要对比各种文件,任何一处出现问题都会导致发布失败,发布耗时

  • 系统可用性差:单体架构各个功能模块是作为一个服务部署,相互之间会互相影响,一些热点功能会耗尽系统资源,导致其它服务低可用。

此时如果我们对系统做水平扩展,增加更多机器,资源还是会被这样的热点接口占用,从而影响到其它接口,并不能从根本上解决问题。这也就是单体架构的扩展性差的一个原因。

微服务架构

为了解决单体架构因为带来的问题,于是微服务出现了。

微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。同时要满足下面的一些特点:

  • 单一职责:一个微服务负责一部分业务功能,并且其核心数据不依赖于其它模块。

  • 团队自治:每个微服务都有自己独立的开发、测试、发布、运维人员,团队人员规模不超过10人(2张披萨能喂饱)

  • 服务自治:每个微服务都独立打包部署,访问自己独立的数据库。并且要做好服务隔离,避免对其它服务产生影响

问题解决:

问题一:由于服务拆分,每个服务代码量大大减少,参与开发的后台人员在1~3名,协作成本大大降低

问题二:每个服务都是独立部署,当有某个服务有代码变更时,只需要打包部署该服务即可

问题三:每个服务独立部署,并且做好服务隔离,使用自己的服务器资源,不会影响到其它服务

当然,对于Java领域开发者来说,SpringCloud框架可以说是目前最全面的微服务组件的集合。

微服务拆分

服务拆分原则

拆分时机

在项目初期,尤其是初创项目,通常优先考虑敏捷开发以快速产出可投入市场的最小可行产品(MVP),以便尽早验证项目的可行性。此时,采用简单的单体架构较为常见,因其开发成本低、部署快速,即便项目最终不被市场接受,损失也相对较小。随着用户量增长和业务复杂度提升,再逐步向微服务架构迁移,尽管这可能会导致后期因代码耦合面临拆分难题。

相反,对于从立项就目标明确的大型项目,考虑到长期发展和扩展性,初期即选择复杂的微服务架构进行设计。这种方式虽然前期需要更多的资源投入,但有利于后续的维护与扩展,避免了日后服务拆分的困扰。简而言之:

初创小项目:先用单体架构快速上线测试市场反应,之后视情况转向微服务(前易后难)。

大型明确项目:直接采用微服务架构规划长远发展,减少后期重构麻烦(前难后易)。

拆分细则

拆分目标角度:

高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。

耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖,或者依赖接口的稳定性要强。

拆分方式角度:

纵向拆分:依据项目功能模块进行拆分。例如,在一个电商应用中,可以将用户管理、订单管理、购物车、商品管理和支付等功能各自独立为单独的服务。这种方式提高了每个服务的内聚性,使得各服务专注于特定业务领域。

横向拆分:识别并提取各个功能模块中的共通业务逻辑作为通用服务。比如,无论是用户登录还是下单过程,都涉及到发送消息通知和记录风控数据的操作。这些共用的功能可以被抽取出来,形成独立的消息中心服务和风控管理服务。这样做不仅提高了代码复用性,减少了重复开发工作,而且由于接口相对稳定,不会造成服务间的过度耦合。

微服务工程结构

一般微服务项目有两种不同的工程结构:

完全解耦

  • 描述:每个微服务是一个独立工程,可使用不同语言开发。
  • 优点:服务间耦合度低。
  • 缺点:各自独立仓库,管理复杂。

Maven聚合

  • 描述:整个项目作为一个Project,各微服务为Module。
  • 优点:代码集中,便于管理和运维。
  • 缺点:服务间存在耦合,编译时间较长。

服务拆分实现

按照Maven聚合实现拆分对于小型项目更为合适。

针对于已经完成开发的项目,我们拆分一般按照以下步骤:

1.对于拆分服务的精确划分,应尽量符合服务拆分原则

2.新建对于模块,并且引入依赖,配置application.yaml等配置文件

3.正确引入实体类,controller,service,mapper等业务代码

事实上,往往服务内都会需要进行,对于服务的调用,我们该如何跨服务调用?

服务调用

RestTemplate

Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。

先将RestTemplate注册为一个Bean

@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

利用RestTemplate发送http请求

        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",// 请求URL,包含占位符{ids}HttpMethod.GET,// 使用GET方法null,// 不使用请求体或请求头new ParameterizedTypeReference<List<ItemDTO>>() {}, // 指定响应类型为List<ItemDTO>Map.of("ids", CollUtil.join(itemIds, ","))// 替换URL中的{ids}为逗号分隔的itemIds字符串);// 2.2.解析响应if(!response.getStatusCode().is2xxSuccessful()){// 查询失败,直接结束return;}List<ItemDTO> items = response.getBody();

测试完毕:实现服务之间进行远程调用

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

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

相关文章

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…

项目中同时使用Redis(lettuce)和Redisson的报错

温馨提示&#xff1a;图片有点小&#xff0c;可以放大页面进行查看... 问题1&#xff1a;版本冲突 直接上图&#xff0c;这个错表示依赖版本不匹配问题&#xff0c;我本地SpringBoot用的是2.7&#xff0c;但是Redisson版本用的3.32.5。 我们通过点击 artifactId跟进去 发现它…

Jackson 详解

目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一&#xff0c;广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能&#xff0c;支持注解、模块化设计和多种数据格式&#xff08;如 XML、YAML&#xff09;。本文将详细介…

H.264,H.265,H.266标准技术改进

关于H.264,H.265,H.266相关资料链接&#xff1a; 标准及中文资料链接 视频编码中的主要技术 视频编码的目标是在保证视频质量的前提下&#xff0c;尽可能减少数据量。以下是视频编码中的核心技术&#xff1a; 块划分&#xff08;Block Partitioning&#xff09; 将视频帧划分…

clickhouse安装路径

《ClickHouse安装路径指南》 大家好&#xff0c;今天我们将一起学习如何在电脑上找到和理解ClickHouse的安装路径。这将帮助学生、科研人员以及任何对数据库技术感兴趣的人更好地管理他们的数据查询工作。 ClickHouse是一款列式存储数据库管理系统&#xff08;DBMS&#xff09…

时序数据库 InfluxDB 3.0 版本性能实测报告:写入吞吐量提升效果验证

亮点总结&#xff1a; TSBS 测试表明&#xff0c;对于少于 100 万台设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入速度实际上比 InfluxDB OSS 1.8 更慢。 对于 100 万台及以上设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入性能才开始超过 InfluxDB OSS 1.8。…

AS32X601双核锁步MCU技术优势分析

AS32X601是国科安芯公司研制的一系列基于32位RISC-V指令集车规级MCU处理器芯片。主频高达180MHz&#xff0c;支持双核锁步架构&#xff0c;基于软错误防护技术加持&#xff0c;显著提高芯片安全性能。产品具有高安全、低失效、多IO、低成本、抗辐照等特点。 一、功能安全与可靠…

基于 LeNet 网络的 MNIST 数据集图像分类

1.LeNet的原始实验数据集MNIST 名称&#xff1a;MNIST手写数字数据集 数据类型&#xff1a;灰度图 &#xff08;一通道&#xff09; 图像大小&#xff1a;28*28 类别数&#xff1a;10类&#xff08;数字0-9&#xff09; 1.通过torchvision.datasets.MNIST下载并保存到本地…

电池综合测试仪:科技赋能,精准守护能源安全

在当今这个科技日新月异的时代&#xff0c;电池作为众多电子设备的心脏&#xff0c;其性能的稳定与高效直接关系到设备的运行质量与使用安全。随着电动汽车、可穿戴设备、储能系统等领域的快速发展&#xff0c;对电池性能的检测与评估提出了更高要求。在此背景下&#xff0c;电…

【Linux 22.4 ubuntu 安装cuda12.1 完整方案】

下载cuda12.1 官网网址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已经安装驱动&#xff0c;则不要选择dirver那项 添加环境变量 vim ~/.b…

实战案例分享:Android WLAN Hal层移植(MTK+QCA6696)

本文将详细介绍基于MTK平台&#xff0c;适配高通&#xff08;Qualcomm&#xff09;QCA6696芯片的Android WLAN HAL层的移植过程&#xff0c;包括HIDL接口定义、Wi-Fi驱动移植以及wpa_supplicant适配过程&#xff0c;涵盖STA与AP模式的常见问题与解决方法。 1. HIDL接口简介 HID…

Greenplum6.19集群搭建

一&#xff0c;安装说明 1.1环境说明 1、首先确定部署的环境&#xff0c;确定下服务器的端口&#xff0c;一般默认是22的端口&#xff1b; 2、当前这份文档是服务器处于10022端口下部署的&#xff08;现场生产环境要求&#xff0c;22端口在生产环境存在安全隐患&#xff09;&…

电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀

一、 防止恶意刷单解决 在生产场景下&#xff0c;可能会有一些人会恶意访问当前网站&#xff0c;来进行恶意的刷单。这样会造成当前系统出现一些业务上的业务混乱&#xff0c;出现脏数据&#xff0c;或者造成后端访问压力大等问题。 一般要解决这个问题的话&#xff0c;前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件&#xff1a; uniapp-v8-release.aar 2.提供uniapp调用的接口&#xff0c;新建类文件继承UniModule&#xff0c; package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用户相关

Android 多用户相关 本文主要记录下android 多用户相关的adb 命令操作. 1: 获取用户列表 命令: adb shell pm list users 输出如下: Users:UserInfo{0:机主:c13} running默认只有一个用户, id为0 &#xff0c;用户状态为运行 2: 创建新用户 命令&#xff1a; adb shell …

基于Spring Boot的高校就业招聘系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

前端安全面试题汇总及参考答案

目录 简述 XSS 攻击的原理及三种常见类型(存储型、反射型、DOM 型) 如何在前端防御 XSS 攻击?列举编码、过滤、CSP 策略的具体实现方式 富文本编辑器场景下如何安全处理用户输入的 HTML 内容? 如何通过 HttpOnly 属性增强 Cookie 安全性?它与 XSS 防御的关系是什么? …

Linux驱动开发(1.基础创建)

序言&#xff1a;从高层逻辑到底层硬件的回归 在当今的软件开发中&#xff0c;我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增&#xff0c;却也逐渐模糊了我们对计算机本质的认知&#xff1a;一切代码终将落地为…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 纯新手教学&#xff0c;手把手5分钟带你在本地部署一个私有的deepseek&#xff0c;再也不用受网络影响。流畅使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超详细教程 &#xff0…