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

目录

前言

一、认识微服务

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.获取商品id
        Set<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的看法,具体的使用步骤是什么?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学简要介绍

密码学是研究编制密码和破译密码的技术科学&#xff0c;它研究密码变化的客观规律&#xff0c;主要包括编码学和破译学两大部分。 一、定义与起源 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;在现代特别指对信息以及其传输的数学性研究&#xff0c;常被…

苄基异喹啉类生物碱的微生物合成-文献精读77

苄基异喹啉类生物碱的微生物合成研究进展及挑战 摘要 微生物发酵是一种经济高效、可持续的生产方式&#xff0c;可替代植物种植和化学合成来生产多种植物来源的药物。苄基异喹啉类生物碱作为植物来源生物碱的典型代表&#xff0c;具有多种重要的生理活性&#xff0c;已成为极具…

Centos安装配置Jenkins

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

【进度猫-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【前端基础】盒子模型

目标&#xff1a;掌握盒子模型组成部分&#xff0c;使用盒子模型布局网页区域 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

Webserver(2.8)守护进程

目录 守护进程案例 守护进程案例 每隔2s获取系统时间&#xff0c;将这个时间写入到磁盘文件中 #include<stdio.h> #include<sys/stat.h> #include<sys/types.h> #include<unistd.h> #include<fcntl.h> #include<sys/time.h> #include<…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

Windows 10 安装使用Docker踩过的坑和解决-31/10/2024

目录 环境版本 一、Docker Desktop双击启动没反应&#xff0c;open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified. 二、Docker Desktop运行run命令时显示错误HTTP code 500 并且错误大意是服务器拒绝访问 三、Docker Engine stopped/启动…

AG32( MCU + FPGA)实现多串口(15个UART)的应用

AG32 的引脚定义 AG32只有模拟相关的IO是固定的&#xff0c;其它数字IO接口可以任意分配。 QFN-32Pin nameAG32VFxxxKAGRV2KQ321PIN_1IO/RTCIO_GB2PIN_2IO/OSC_INIO3PIN_3IO/OSC_OUTIO4NRSTNRSTNRST5PIN_5IO_ADC_IN12IO6VDDA33VDDA33VDDA337PIN_7IO_WKUP_ADC_IN0_CMP_PA0IO8PI…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 解决方案三&#xff1a; 1.浮动高度塌陷概念 在CSS中&#xff0c;高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

014:无人机遥控器操作

摘要&#xff1a;本文详细介绍了无人机遥控器及其相关操作。首先&#xff0c;解释了油门、升降舵、方向舵和副翼的概念、功能及操作方式&#xff0c;这些是控制无人机飞行姿态的关键部件。其次&#xff0c;介绍了美国手、日本手和中国手三种不同的操作模式&#xff0c;阐述了遥…

GitHub | 发布到GitHub仓库并联文件夹的方式

推送到Github 推送步骤如果你只想更新单个文件&#xff0c;只需在第 4 步中指定该文件的路径即可。可能问题一 效果 推送步骤 更新 GitHub 仓库中的文件通常涉及以下步骤&#xff1a; 克隆仓库&#xff1a; 首先&#xff0c;你需要将 GitHub 上的仓库克隆到本地。使用 git …

qt QCloseEvent详解

1、概述 QCloseEvent 是 Qt 框架中用于处理窗口关闭事件的一个类。当用户尝试关闭一个窗口&#xff08;例如&#xff0c;通过点击窗口的关闭按钮&#xff0c;或者通过调用窗口的 close() 方法&#xff09;时&#xff0c;Qt 会生成一个 QCloseEvent 对象&#xff0c;并将其发送…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff0c;简称JVM栈&#xff0c;又称Java方法栈&#xff09;是 JVM 运行时数据区的一部分&#xff0c;主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

数据迁移: 安全高效转移数据, 满足企业业务需求和技术改进

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

w~自动驾驶~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12451789 #基于深度学习的端到端自动驾驶 最新的端到端自动驾驶综述刚刚出炉&#xff0c;话说论文一作卡内基梅隆大学的Apoorv Singh今年产出了七篇综述&#xff0c;都和自动驾驶相关&#xff0c;推荐给大家。就一个字&…

【解决办法】无法使用右键“通过VSCode打开文件夹”

个人博客&#xff1a;苏三有春的博客 前言 作者的编程环境为VScode&#xff0c;工作时常使用VScode打开整个工程文件夹。如果先打开VScode再从VScode中选择文件夹打开效率太慢&#xff0c;作者一般使用的方式是右键文件夹&#xff0c;直接选择"通过code打开文件夹"…

ubuntu20.04 加固方案-设置限制su命令用户组

一、编辑/etc/pam.d/su配置文件 打开终端。 使用文本编辑器&#xff08;如vim&#xff09;编辑/etc/pam.d/su文件。 vim /etc/pam.d/su 二、添加配置参数 在打开的配置文件的中&#xff0c;添加以下参数&#xff1a; auth required pam_wheel.so 创建 wheel 组 并添加用户 …

MySQL之JDBC入门详解

01-JDBC入门 一、JDBC概念 jdbc : java database connection , java数据库连接 jdbc是sun公司定义的java程序访问数据库的规范。 二、JDBC操作需要6步 三、入门程序 1、使用eclipse打开一个新的工作空间 2、切换到java视图界面 3、创建java工程&#xff1a;01-jdbc-helloworl…

Ansible常用命令(Ansible Common Commands)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…