SpringCloud之认识微服务
文章目录
- 一、传统项目转型
- 二、走进 SpringCloud
- 三、微服务项目搭建
- 3.1 创建一个 SpringBoot 项目
- 3.2 创建三个 Maven 子工程
- 3.3 为子工程创建 application.yml
- 3.4 引入依赖
- 3.5 数据库 建库建表
- 3.6 编写业务
提示:以下是本篇文章正文内容,SpringCloud系列学习将会持续更新
注意: 此阶段学习推荐的电脑配置,至少配备4核心CPU(主频3.0Ghz以上)+16GB内存,否则卡到你怀疑人生。
前面我们讲解了 SpringBoot 框架,通过使用 SpringBoot 框架,我们的项目开发速度可以说是得到了质的提升。同时,我们对于项目的维护和理解,也会更加的轻松。可见,SpringBoot 为我们的开发带来了巨大便捷。而这一部分,我们将基于 SpringBoot,继续深入到企业实际场景,探讨微服务架构下的 SpringCloud。这个部分我们会更加注重于架构设计上的讲解,弱化实现原理方面的研究。
一、传统项目转型
要说近几年最火热的话题,那还得是微服务,那么 什么是微服务 呢?
我们可以先从技术的演变开始看起: 在我们学习 JavaWeb 之后,一般的网站开发模式为 Servlet + JSP。后来我们在学习了 SSM 之后,进行了前后端分离。通过使用 SpringBoot,我们几乎可以很快速地开发一个高性能的单体应用,只需要启动一个服务端,我们整个项目就开始运行了,各项功能融于一体,开发起来也更加轻松。
但是随着我们项目的不断扩大,单体应用似乎显得有点乏力了。
随着越来越多的功能不断地加入到一个 SpringBoot 项目中,随着接口不断增加,整个系统就要在同一时间内响应更多类型的请求,显然,这种扩展方式是不可能无限使用下去的,总有一天,这个 SpringBoot 项目会庞大到运行缓慢。并且所有的功能如果都集成在单端上,那么所有的请求都会全部汇集到一台服务器上,对此服务器造成巨大压力。
传统单体架构应用随着项目规模的扩大,实际上会暴露越来越多的问题,尤其是一台服务器无法承受庞大的单体应用部署,并且单体应用的维护也会越来越困难,我们得寻找一种新的开发架构来解决这些问题了。
Martin Fowler 在2014年提出了“微服务”
架构,它是一种全新的架构风格。
- 微服务把一个庞大的单体应用拆分为一个个的小型服务。比如我们原来的图书管理项目中,有登录、注册、添加、删除、搜索等功能,那么我们可以将这些功能单独做成一个个小型的 SpringBoot 项目,独立运行。
- 每个小型的微服务都可以独立部署和升级。这样就算整个系统崩溃,那么也只会影响一个服务的运行。
- 微服务之间使用 HTTP 进行数据交互,不再是单体应用内部交互了。虽然这样会显得更麻烦,但是带来的好处也是很直接的,甚至能突破语言限制,使用不同的编程语言进行微服务开发,只需要使用 HTTP 进行数据交互即可。
- 我们可以同时购买多台主机来分别部署这些微服务。这样单机的压力就被分散到多台机器,并且每台机器的配置不一定需要太高,这样就能节省大量的成本,同时安全性也得到很大的保证。
甚至同一个微服务可以同时存在多个,这样当其中一个服务器出现问题时,其他服务器也在运行同样的微服务,这样就可以保证一个微服务的 高可用。
可见,采用微服务架构,更加能够应对当今时代下的种种考验,传统项目的开发模式,需要进行架构上的升级。
回到目录…
二、走进 SpringCloud
前面我们介绍了微服务架构的优点,那么同样也存在着诸多的问题:
- 要实现微服务并不是说只需要简单地将项目进行拆分,我们还需要考虑对各个微服务进行管理、监控等,这样我们才能够及时地寻找和排查问题。因此微服务往往需要的是一整套解决方案,包括
服务注册和发现
、容灾处理
、负载均衡
、配置管理
等。 - 它不像单体架构那种方便维护,由于部署在多个服务器,我们不得不去保证各个微服务能够稳定运行,在管理难度上肯定是高于传统单体应用的。
- 在分布式的环境下,单体应用的某些功能可能会变得比较麻烦,比如 分布式事务。
所以,为了更好地解决这些问题,SpringCloud 正式登场。
SpringCloud 是 Spring 提供的一套分布式解决方案,集合了一些大型互联网公司的开源产品,包括诸多组件,共同组成 SpringCloud 框架。并且,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册
、配置中心
、消息总线
、负载均衡
、熔断机制
、数据监控
等,都可以用 Spring Boot 的开发风格做到一键启动和部署。
由于中小型公司没有独立开发自己的分布式基础设施的能力,使用 SpringCloud 解决方案能够以最低的成本应对当前时代的业务发展。
可以看到,SpringCloud 整体架构的亮点是非常明显的,分布式架构下的各个场景,都有对应的组件来处理,比如基于 Netflix
(奈飞)的开源分布式解决方案提供的组件:
Eureka
- 实现服务治理(服务注册与发现),我们可以对所有的微服务进行集中管理,包括他们的运行状态、信息等。Ribbon
- 提供客户端的软件负载均衡算法(现在被SpringCloudLoadBalancer
取代)。Hystrix
- 断路器,保护系统,控制故障范围。暂时可以跟家里电闸的保险丝类比,当触电危险发生时能够防止进一步的发展。Zuul
- 具有api网关,路由,负载均衡等多种作用。就像我们的路由器,可能有很多个设备都连接了路由器,但是数据包要转发给谁则是由路由器在进行(已经被SpringCloudGateway
取代)。Config
- 配置管理,可以实现配置文件集中管理。
当然,这里只是进行简单的了解即可,实际上微服务的玩法非常多,我们后面的学习中将会逐步进行探索。
回到目录…
三、微服务项目搭建
现在我们重新设计一下图书管理系统项目,将原有的大型进行拆分 。一定要尽可能保证单一职责,相同的业务不要在多个微服务中重复出现。如果出现需要借助其他业务完成的服务,那么可以使用服务之间相互调用的形式来实现:
- 验证服务:用于处理用户注册、登录、密码重置等,反正就是一切与账户相关的内容,包括用户信息获取等。
- 图书管理服务:用于进行图书添加、删除、更新等操作,图书管理相关的服务,包括图书的存储等和信息获取。
- 图书借阅服务:交互性比较强的服务,需要和登陆验证服务和图书管理服务进行交互。
3.1 创建一个 SpringBoot 项目
①我们首先创建一个普通的SpringBoot项目:
②然后不需要勾选任何依赖,直接创建即可,项目创建完成并初始化后,我们删除父工程的无用文件,只保留必要文件,像下面这样:
3.2 创建三个 Maven 子工程
①接着我们就可以按照我们划分的服务,创建子工程了,创建一个新的 Maven 项目,注意父项目要指定为我们一开始创建的项目,子项目命名随意:
②子项目创建好之后,接着我们在子项目中创建 SpringBoot 的启动主类:
③接着我们点击运行,即可启动子项目了,实际上这个子项目就一个最简单的 SpringBoot web 项目,注意启动之后最下方有弹窗,我们点击 “Use service”,这样我们就可以在控制台的services
项实时查看大项目中的微服务了:
3.3 为子工程创建 application.yml
①接着我们以同样的方法,创建其他的子项目,注意我们最好将其他子项目的端口设置的不一样,不然会导致端口占用,我们分别为它们创建application.yml
文件:
②接着我们来尝试启动一下这三个服务,正常情况下都是可以直接启动的:
可以看到它们分别运行在不同的端口上,这样,就方便不同的程序员编写不同的服务了,提交当前项目代码时的冲突率也会降低。
③后续用需要连接数据库,添加数据源信息:
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/library?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456
回到目录…
3.4 引入依赖
父项目 pom.xml:
首先在父项目中添加 MySQL 驱动和 Lombok 依赖,因为这两个几乎所有项目都会用到。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>
由于不是所有的子项目都需要用到 Mybatis,我们在父项目中只进行版本管理即可:
<dependencyManagement><dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency></dependencies>
</dependencyManagement>
子项目 pom.xml:
我们在子项目中添加 web 和 mybatis 的依赖:(每个子项目各自添加自己需要的依赖)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
回到目录…
3.5 数据库 建库建表
①user 表:
②book 表:
③borrow 表:
添加外键:
添加唯一索引:
可以直接执行 sql 语句:
CREATE SCHEMA `library` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `library`.`user` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(45) NOT NULL,`age` INT NOT NULL,`sex` ENUM('男', '女') NOT NULL,PRIMARY KEY (`uid`));CREATE TABLE `library`.`book` (`bid` INT NOT NULL AUTO_INCREMENT,`title` VARCHAR(45) NOT NULL,`desc` VARCHAR(45) NOT NULL,PRIMARY KEY (`bid`));CREATE TABLE `library`.`borrow` (`id` INT NOT NULL AUTO_INCREMENT,`uid` INT NOT NULL,`bid` INT NOT NULL,PRIMARY KEY (`id`),INDEX `f_uid_idx` (`uid` ASC) COMMENT '外键连接user表中的uid',INDEX `f_bid_idx` (`bid` ASC) COMMENT '外键连接book表中的bid',UNIQUE INDEX `unique_bid_uid` (`uid` ASC, `bid` ASC) COMMENT '唯一索引:uid和bid的组合不重复',CONSTRAINT `f_uid`FOREIGN KEY (`uid`)REFERENCES `library`.`user` (`uid`)ON DELETE NO ACTIONON UPDATE NO ACTION,CONSTRAINT `f_bid`FOREIGN KEY (`bid`)REFERENCES `library`.`book` (`bid`)ON DELETE NO ACTIONON UPDATE NO ACTION);
回到目录…
3.6 编写业务
我们来写用户查询相关的业务:
实体类:
@Data
public class User {private int uid;private String name;private int age;private String sex;
}
持久层: mapper 接口
@Repository
@Mapper
public interface UserMapper {@Select("select * from user where uid = #{uid}")User getUserById(int uid);
}
service 业务层: 具体业务逻辑
public interface UserService {User getUserById(int uid);
}
@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic User getUserById(int uid) {return userMapper.getUserById(uid);}
}
Controller 控制层: 请求和响应
@RestController
public class UserController {@Resourceprivate UserService userService;@GetMapping("/user/{uid}")public User findUserById(@PathVariable("uid") int uid) {return userService.getUserById(uid);}
}
现在我们访问即可拿到数据:
其它子工程也是同样的逻辑编写业务。这样,我们一个完整项目的就拆分成了多个微服务,不同微服务之间是独立进行开发和部署的。
回到目录…
总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,认识什么是微服务、它的优缺点,并且认识了微服务架构SpringCloud,介绍了它的五大组件,还有微服务项目搭建的过程。之后的学习内容将持续更新!!!
相关文章:

SpringCloud之认识微服务
文章目录一、传统项目转型二、走进 SpringCloud三、微服务项目搭建3.1 创建一个 SpringBoot 项目3.2 创建三个 Maven 子工程3.3 为子工程创建 application.yml3.4 引入依赖3.5 数据库 建库建表3.6 编写业务提示:以下是本篇文章正文内容,SpringCloud系列学…...
【go语言之thrift协议二之server端分析】
go语言之thrift协议二serverthrift.TProtocolFactoryTTransportReadWriteCloserContextFlusherReadSizeProviderTProtocolrunServerNewTServerSocketNewCalculatorHandlerNewCalculatorProcessorNewTSimpleServer4server.ServeListenAcceptLoopprocessRequests在上一篇文章分析…...

【办公类05-03】Python批量修改文件名前面的序号(已有的序号错了,需要改成正确的号码)
背景需求下载教程,手动输入编号,有一个编号错误,导致后面所有编号都错了。30实际是29,以此类推怎样才能快速修改编号数字?前期考虑到可能要改编号,所以在每个编号后面加“ ”(空格)&…...
定向模糊测试工具Beacon基本用法
Beacon是一个定向模糊测试工具,给定行号,能够定向探索行号附近的代码区域。主要思想是采用静态分析的方法获取到与目标有关的变量的最弱前置条件(weakest precondition)的信息,并在相关位置插入断言,来提前…...
《程序员面试金典(第6版)》面试题 02.01. 移除重复节点
题目描述 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] -示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2] 提示: 链表长度在[0, 20000]范…...

如何对web系统开展无障碍测试
Accessibility test(无障碍测试)是一种测试方法,旨在评估软件、网站或其他数字产品的可访问性,以确保它们能够被身体残障或其他特殊需求的用户使用。这些测试通常包括使用辅助技术,如屏幕阅读器和放大器,以…...

使用vite+vue3.0 创建一个cesium基础应用 ----01 项目搭建
使用vitevue3.0 创建一个cesium基础应用 ----01 项目搭建 1.使用yarn创建一个vite项目 我们可以在vite官网找到vite创建项目的命令 https://cn.vitejs.dev/ 可以使用yarn创建项目选择使用vue3.0框架,语言使用js 创建完成后结构如下: 2.找到vite社区中的…...

【Python学习笔记】第二十七节 Python 多线程
一、进程和线程进程:是程序的一次执行,每个进程都有自己的地址空间、内存、数据栈及其他记录运行轨迹的辅助数据。线程:所有的线程都运行在同一个进程当中,共享相同的运行环境。线程有开始、顺序执行和结束三个部分, …...
【id:18】【20分】B. DS顺序表--连续操作
题目描述建立顺序表的类,属性包括:数组、实际长度、最大长度(设定为1000)该类具有以下成员函数:构造函数:实现顺序表的初始化。插入多个数据的multiinsert(int i, int n, int item[])函数,实现在…...

vi编辑器操作指令分享
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方…...
OSPF与BFD联动配置
13.1.1BFD概念 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制,有以下两大优点: 对相邻转发引擎之间的通道提供轻负荷、快速故障检测。 用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个系统之间建立BFD会…...
jQuery基础
> 🥲 🥸 🤌 🫀 🫁 🥷 🐻❄️🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 …...
day39|139.单词拆分 背包问题ending
139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode",…...

Shell脚本编程
Shell编程 视频地址https://www.bilibili.com/video/BV1hW41167NW/?p1&vd_source977d52a6b92ce8b6ae67c16fc61f0428 第一章 Shell概述 大数据程序员为什么要学习Shell呢? 需要看懂运维人员编写的Shell程序偶尔会编写一些简单的Shell程序来管理集群…...

ChatGPT解答:JavaScript保存当前网页页面图片为pdf文件或者word文件,前端用vue2,给出详细的方案和代码
ChatGPT解答:JavaScript保存当前网页页面图片为pdf文件或者word文件,前端用vue2,给出详细的方案和代码 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). JavaScript保存当前网页页面图片为pdf文件或者word文件,前端用vue2&am…...
Python基础学习11——文件
我们可以利用python对本电脑文件夹里的文件进行处理,python中提供了一系列相关的方法和函数供我们使用。 读取文件 我们现在在本python文件中有一个txt文件名为Lego,那么我们就可以利用python打开该文件 with open(Lego.txt) as file_text:contents …...

外网用户打不开公司的网站?web服务器端口映射到公网
我们经常会遇到这样的情景,在公司内部可以打开公司的网站,在家里或者外网却打不开,按照网上的做法,重新启动了服务器和iis,还是不行。许多用户设置了路由器端口映射功能,但是端口映射不成功怎么办ÿ…...

【CS224W】(task9)图神经网络的表示能力(更新中!!)
note 基于图同构网络(GIN)的图表征网络。为了得到图表征首先需要做节点表征,然后做图读出。GIN中节点表征的计算遵循WL Test算法中节点标签的更新方法,因此它的上界是WL Test算法。 在图读出中,我们对所有的节点表征&…...

binlog找回误删数据
1、检查当前是否开启binlog存储 输入命令show variables like %log_bin%;,结果如下 可以看到log_bin的值是ON,说明binlog开启了。 2、查找binlog的存储位置 这个去到数据库的my.cnf配置文件中寻找,有一个log_bin的配置 切换到log_bin的目…...
《程序员面试金典(第6版)》面试题 02.03. 删除中间节点
题目描述 若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如: 传入节点 c(…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...