SpringCloud之认识微服务

news2025/1/8 5:44:49

文章目录

  • 一、传统项目转型
  • 二、走进 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.Driver
    url: jdbc:mysql://127.0.0.1:3306/library?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 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 ACTION
			ON UPDATE NO ACTION,
	CONSTRAINT `f_bid`
        FOREIGN KEY (`bid`)
            REFERENCES `library`.`book` (`bid`)
            ON DELETE NO ACTION
            ON 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 {
    @Resource
    private UserMapper userMapper;

    @Override
    public User getUserById(int uid) {
        return userMapper.getUserById(uid);
    }
}

Controller 控制层: 请求和响应

@RestController
public class UserController {
    @Resource
    private UserService userService;

    @GetMapping("/user/{uid}")
    public User findUserById(@PathVariable("uid") int uid) {
        return userService.getUserById(uid);
    }
}

现在我们访问即可拿到数据:
在这里插入图片描述

其它子工程也是同样的逻辑编写业务。这样,我们一个完整项目的就拆分成了多个微服务,不同微服务之间是独立进行开发和部署的。

回到目录…


总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,认识什么是微服务、它的优缺点,并且认识了微服务架构SpringCloud,介绍了它的五大组件,还有微服务项目搭建的过程。之后的学习内容将持续更新!!!

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

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

相关文章

Vim笔记

文章目录VIM四种模式命令模式编辑模式末行模式可视化模式扩展内容VIM四种模式 1、命令模式 2、编辑模式 3、末行模式 4、可视化模式 5、VIM四种模式的关系 命令模式 1、命令模式下我们能做什么&#xff1a;① 移动光标 ② 复制 粘贴 ③ 剪切 粘贴 删除 ④ 撤销与恢复 2、进…

【分布式】分布式唯一 ID 的 8 种生成方案

文章目录前言正文什么是分布式ID&#xff1f;分布式ID的特性&#xff1f;分布式ID的生成方案1. UUID2. 数据库自增ID3. 批量生成ID4. Redis生成ID5. Twitter的snowflake算法6. 百度UidGenerator7. 美团Leaf8.滴滴&#xff08;Tinyid&#xff09;小结前言 在互联网的业务系统中…

Leaflet基础入门教程(一)

leaflet是一个前端的轻量的gis框架,为什么说它轻量呢。因为相比于传统的“庞大的”GIS框架比如openlayers和mapbox,leaflet不仅代码体积小,而且API构成也极为简单。是GIS行业小白入门级别学习的最好的框架,没有之一。 那么话不多说我们首先来学习一下如何使用leaflet搭建一…

Vue3中hook的使用及使用中遇到的坑

目录前言一&#xff0c;什么是hook二&#xff0c; hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候&#xff0c;我们开始使用类与对象&#xff0c;开始模块化管理&#xff1b;在Vue中我们可以使用mixin进行模块化管理&#xff1b;Vu…

2023-03-03干活小计

今天见识了 归一化的重要性&#xff1a;归一化 不容易爆炸 深度了解了学习率&#xff1a;其实很多操作 最后的结果都是改变了lr 以房价预测为例&#xff1a;一个点一个点更新 比较 矩阵的更新&#xff1a; 为什么小批量梯度下降 优于随机梯度下降 优于批量梯度下降&#xff…

Kubernetes 中 Deployment 使用

Deployment的使用 之前我们了解了Replication Controller和Replica Set两种资源对象&#xff0c;RC和RS的功能基本上是差不多的&#xff0c;唯一的区别就是RS支持集合的selector。也了解到了用RC/RS来控制Pod副本的数量&#xff0c;也实现了滚动升级Pod的功能。现在看上去似乎…

【面试题】前端路由分类

0. 前言 在Web开发中&#xff0c;路由是指根据用户请求的URL地址&#xff0c;确定用户访问的页面资源、参数等&#xff0c;是前端开发中不可缺少的重要部分。Vue router中提供了两种路由模式&#xff0c;一种是hash模式&#xff0c;另一种是history模式。 1. Hash模式路由 H…

爆款升级!新系列南卡Neo最强旗舰杀到,业内首款无线充骨传导耳机!

中国专业骨传导耳机品牌NANK南卡于近日发布了全新南卡Neo骨传导运动耳机&#xff0c;打造一款佩戴最舒适、音质体验最好的骨传导耳机。推出第2代声学響科技技术&#xff0c;提供更优质的开放式骨传导听音体验&#xff0c;透过不一样的音质体验&#xff0c;打造更好的骨传导耳机…

MySQL基础(二)排序与分页、多表查询、单行函数

上接 MySQL基础&#xff08;一&#xff09;SQL分类、导入、SELECT语句&#xff0c;运算符_独憩的博客-CSDN博客 目录 排序与分页 排序 二级排序 分页 多表查询 基础多表查询 等值连接vs非等值连接 自连接vs非自连接 内连接vs外连接 自然连接 单行函数 数值函数 …

信息系统基本知识(四)新技术

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.5 新一代技术 1.5.1 物联网 概念&#xff1a;&#xff08;The Internet of Things&#xf…

你只会说MVC模型是什么但是不会实现?今天带你走通Web、Servlet、MVC、SpringMVC。代码演示很清晰

文章目录HTTP请求和HTTP响应从0手写一个Web服务器&#xff0c;看看能有多累人使用Servlet实现一个服务器&#xff0c;看看多简单Serlvet的创建Servlet的运行Servlet的其他问题Servlet这么爽&#xff0c;我们简单地探索一下它的原理JSP跟Servlet合作啦&#xff0c;我们来看一下他…

学习ROS时针对gazebo相关的问题(重装与卸载是永远的神)

ResourceNotFound:gazebo_ros 错误解决 参考:https://blog.csdn.net/weixin_42591529/article/details/123869969 当将机器人加载到gazebo时,运行launch文件出现如下错误 这是由于缺少gazebo包所导致的。 解决办法:

Linux 学习 挂载、卸载光盘和实现虚拟机时间同步

/media&#xff1a;挂载光盘使用的 挂载光盘命令&#xff1a;mount /dev/cdrom /media 卸载光盘命令&#xff1a;umount /dev/cdrom 挂载光盘 使用挂在光盘命令挂载光盘&#xff0c;如图所示 卸载光盘 初次卸载光盘可能会出现问题 [rootlocalhost media]# umount /dev/cd…

linux定时任务打包提权docker组提权

定时任务有打包命令&#xff0c;这个命令有参数调用可以执行其他命令&#xff0c;定时任务因为是root用户执行的&#xff0c;所以就会造成提权。一、linux定时任务打包提权复现环境&#xff1a;ubuntun14.041.创建定时任务&#xff1a;在最下面写入&#xff1a;* * * * * …

CK-GW208-EIP与汇川5UPLC走EtherNET_IP通讯指南

CK-GW208-EIP是一款支持标准工业Ethernet/IP协议的IO-LINK主站网关&#xff0c;方便用户快速便捷的集成到PLC等控制系统中。CK-GW208-EIP主站网关集成8路IO-LINK通信端口&#xff0c;采用即插即用模式&#xff0c;无需繁琐的配置&#xff0c;减轻现场安装调试的工作量。为了满足…

几何算法——6.曲线曲面求交的方法总结(国内外文献调研、思考和总结)

几何算法——6.曲线曲面求交的方法总结&#xff08;国内外文献调研、思考和总结&#xff09;1 曲线曲线1.1 直线/二次曲线1.2 二次曲线/二次曲线1.3 其他类型2 曲线曲面2.1 直线/二次曲面&#xff0c;二次曲线/平面2.2 二次曲线/二次曲面2.3 其他类型3 曲面曲面3.1 平面/二次曲…

文件传输协议的五种安全文件传输替代方案

对安全文件传输协议的需求,过去&#xff0c;文件传输协议&#xff08;FTP&#xff09;是发送文件的常用协议。这是一个更简单的时期&#xff0c;安全性比今天要少得多。 但是随着黑客变得越来越复杂&#xff0c;他们发现FTP缺乏安全性。他们知道FTP可以通过有限的方式来确保访…

【IoT】压力式电子脉搏器设计

脉搏是指单位时间内心脏跳动的次数,一般指每分钟的心跳次数,它是衡量人体健康指数的重要指标之一。然而&#xff0c;传统的诊脉手段受到人为因素影响较多&#xff0c;在一定程度上降低了判断病情的准确性&#xff0c;随着电子科学技术的迅猛发展&#xff0c;就出现了电子脉搏计…

# 技术详解: 利用CI同步文章以及多端发布

技术详解: 利用CI同步文章以及多端发布 技术详解: 利用CI同步文章以及多端发布 前言文章的同步实现的细节 思路文章元数据的定义和提取修改文章的优化本地图片资源上传CDN并替换本地link 终于到了 CI 的部分了最后来一些碎碎念 前言 前几天我更新了一篇简单技术总结之后&am…

用C语言写一个自己的shell-Part Ⅲ--built-in commands

Part Ⅲ–Built-in commands Just as we have mentioned in part Ⅱ&#xff0c;the exec family of functions can’t perform built-in commands like cd. It’s like The reason for this is that cd is not a system command like ls or pwd.We need to write and inv…