目录
一,什么是单体架构
二,什么是集群和分布式架构
三,什么是微服务架构
四,解决微服务难题的方案Spring-cloud
Spring Cloud Alibaba是阿里巴实现的方案,基于SpringCloud的规范。如果说Spring Cloud Netflix 是 Spring Cloud 的第⼀代实现, 那么Spring Cloud Alibaba 也可以看做是 Spring Cloud 的第⼆代实现, 主要由 Nacos、Sentinel、Seata等组件组成.
五,创建一个微服务项目
单体架构,集群和分布式架构,微服务架构
一,什么是单体架构
在java初学阶段,当自己独立做完一个项目,这个项目的业务功能 控制层 配置层 中间件等等所有的功能集中在一个jar包中,那么这个项目就是单体架构的。
二,什么是集群和分布式架构
1.当一个单体架构的项目的流量和需求逐渐增多时,这个时候单体架构就容易崩溃,为解决这个问题。就可以将个别涉及流量大的功能部署在多个服务器上,多个服务器共同完成这个功能。每个服务器的负载按照负载均衡来调度完成任务。这共同完成一个功能的多个服务器共称为集群。
2.将一个系统拆分为多个小子系统,并且部署在多个服务,不同的服务器承担的任务不同。这个就是分布式
集群和分布式区别与联系?
1.概念上:集群是多个计算机做同样的事情,分布式是多个计算机做不同的事情。
2.功能上:集群的每个节点的功能是相同的,并且有一个节点挂了其他节点可以分担它的工作,整个业务依然可以访问。分布式每个节点的功能不同,一个挂了整个业务将不可访问。
3.关系上:分布式的节点可以是一个集群组成,集群与分布式相互搭配使用。一般不会将两者单独区分。而是统称:分布式架构
三,什么是微服务架构
在一个电商系统中有很多业务代码是重复的。调用的关系也有很多重复的。可以把一些通用的功能封装起来形成独立的基础服务供别人调用,组成一个微小的服务,这就是微服务。
更加通俗地说,把一个微小的服务封装起来独立部署起来。
微服务和分布式架构?
分布式讲究流量压力拆分,流量大的拆开。
微服务讲究功能的拆分,拆成一个个独立功能的整体。
微服务通常是分布式架构,选择微服务就意味着要解决分布式架构的难题。
四,解决微服务难题的方案Spring-cloud
Spring-cloud是分布式微服务架构的一站式解决方案。微服务架构落地的多种技术集合。
虽然SpringCloud包含微服务架构的多种技术,但这些技术大多不是SpringCloud团队开发的,SpringCloud像管家一样把多种技术以SpringCloud规范和SpringBoot风格进行整合起来。但这些技术还是由各个公司维护。
SpringCloud的实现方案主要有以下两种
1.Spring Cloud Netflix
2.Spring Cloud Alibaba
Netflix一直是SpringCloud的默认实现方案,但是在2018年以后Netflix公司宣布停止维护。SpringCloud也给出了替代技术。
Spring Cloud Alibaba是阿里巴实现的方案,基于SpringCloud的规范。如果说Spring Cloud Netflix 是 Spring Cloud 的第⼀代实现, 那么Spring Cloud Alibaba 也可以看做是 Spring Cloud 的第⼆代实现, 主要由 Nacos、Sentinel、Seata等组件组成.
五,创建一个微服务项目
1.服务拆分原则:明确一个服务的最小不可拆分的功能。以便于我们在做一个项目的时不会迷惑到底要拆分哪些服务独立部署。
2.服务自治:每个拆分出来的独立服务都可以独立的开发,测试,运行,部署。
以一个电商系统为例,对于商品的服务应该如何拆分呢,我们平时使用的网购软件关于商品的功能有很多,在订单中,首页中,推荐中等等。这里为演示如何使用SpringCloud解决微服务架构问题,我们不是要做出来一个电商系统为例而是建立项目的架构去模拟项目之间的关系。
一个商品可以出现在订单上,也可以出现在商品的例表上。并且这个业务的功能是独立且可以通过商品的ID联系起来,那么这两个业务就可以使用微服务架构独立部署起来。
3.首先准备模拟数据建立订单表和产品表。
-- 建库
CREATE DATABASE IF NOT EXISTS cloud_order DEFAULT CHARACTER SET utf8mb4;
CREATE DATABASE IF NOT EXISTS cloud_product DEFAULT CHARACTER SET utf8mb4;-- 订单表
DROP TABLE IF EXISTS order_detail;
CREATE TABLE order_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '订单id',`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',`product_id` BIGINT(20) NULL COMMENT '产品id',`num` INT(10) NULL DEFAULT 0 COMMENT '下单数量',`price` BIGINT(20) NOT NULL COMMENT '实付款',`delete_flag` TINYINT(4) NULL DEFAULT 0,`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '订单表';-- 数据初始化
INSERT INTO order_detail (user_id, product_id, num, price)
VALUES
(2001, 1001, 1, 99), (2002, 1002, 1, 30), (2001, 1003, 1, 40),
(2003, 1004, 3, 58), (2004, 1005, 7, 85), (2005, 1006, 7, 94);-- 产品表
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '产品id',`product_name` VARCHAR(128) NULL COMMENT '产品名称',`product_price` BIGINT(20) NOT NULL COMMENT '产品价格',`state` TINYINT(4) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '产品表';-- 数据初始化
INSERT INTO product_detail (id, product_name, product_price, state)
VALUES
(1001, "T恤", 101, 0), (1002, "短袖", 30, 0), (1003, "短裤", 44, 0),
(1004, "卫衣", 58, 0), (1005, "马甲", 98, 0), (1006, "羽绒服", 101, 0),
(1007, "冲锋衣", 30, 0), (1008, "袜子", 44, 0), (1009, "鞋子", 58, 0),
(10010, "毛衣", 98, 0);
4.创建一个父项目Spring-cloud-demo
红框里的parent标签内指定SpringBoot的版本为3.1.6,代表这个项目的父项目的版本,切记不能随便使用SpringBoot版本,因为SpringBoot版本和SpringCloud版本是严格对应的。SpringBoot父项目可以让当前项目继承父项目的默认配置以方便管理。
以下是SpringBoot版本和SpringCloud版本对应关系:
Spring Cloud 版本 | Spring Boot 版本范围 | 备注 |
---|---|---|
2023.0.x (Eureka SRx) | Spring Boot 3.2.x | 最新的 Spring Cloud 版本,适配 Spring Boot 3.2。 |
2022.0.x (Gateway SRx) | Spring Boot 3.1.x | 适配 Spring Boot 3.1。 |
2021.0.x (Jubilee) | Spring Boot 2.6.x ~ 2.7.x | 支持 JDK 17,适配 Spring Boot 2.x。 |
2020.0.x (Ilford) | Spring Boot 2.4.x ~ 2.5.x | 开始支持 JDK 15。 |
Hoxton | Spring Boot 2.2.x | 经典稳定版本,支持 JDK 8 和 11。 |
Greenwich | Spring Boot 2.1.x | 与 Spring Boot 2.1 完美搭配。 |
Finchley | Spring Boot 2.0.x | Spring Boot 2.0 的标准配置。 |
Dalston | Spring Boot 1.5.x | 适配较老的 Spring Boot 版本。 |
在properties中加入可能会用到的各个依赖的版本,方便以后统一管理父项目和子项目中的依赖版本。
<dependencyManagement>这个标签是声明可能会用到的依赖,这里的依赖不会直接引入到项目中而是以后再<dependency>中声明后才会真正的引用。如果子项目中引用的依赖没有指定版本号则会从父项目中读取<version>
红框里的标签制定了打包方式是pom不是jar这需要手动调节。
import
作用域是一个特殊的范围,它只与pom
类型的依赖一起使用。当使用import
范围时,Maven会将依赖的POM文件中定义的所有依赖、插件和其他配置导入到当前项目的POM文件中,就像这些配置是直接在当前项目的POM文件中定义的一样
<type>pom</type>:在Maven默认依赖类型是jar,pom表示这是一个父pom文件,需要时,Maven会将父项目依赖和配置导入到子项目中。
5.创建子项目product-service 和 order-service
在这个子项目中引入这些依赖,由于这些依赖在父项目的<dependencyManagement>中都存在,所有子项目会自动导入<dependencyManagement>的依赖,如果已经制定版本号则用子项目自己导入的具体版本号的依赖。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency></dependencies>
创建product-sevice项目
关于pom.xml文件的配置与order-service一样。
6.配置yml文件