一、什么是Spring Cloud Alibaba
1.1 概述
- 是阿里巴巴旗下结合自身微服务开发实践,开源的微服务全家桶解决方案。
- 在微服务Spring Cloud项目中进行孵化和诞生,在未来可能会成为第二代标准的微服务架构。
- 现在在很多的大企业里流行使用,比如:百度、爱奇艺、阿里、虎牙直播、平安科技、贝壳找房等。
1.2 应用场景
- 大型分布式架构系统,比如大型电商、金融
- 高并发的系统,比如:门户、直播、秒杀等系统
- 需求不明确,需要更新迭代的创业性公司的系统
- 新零售、微信小程序的后台电商架构
二、Spring Cloud和Spring Cloud Alibaba的关系
Spring Cloud Alibaba 其实是对Spring Cloud 微服务的最佳实践,也就是Srping Cloud的一个子项目,不过它在Spring Cloud的基础上完成了很多新组件和优化的工作,因为在Spring Cloud 2.x以后官网很多的产品都即将停更或已停更,Spring Cloud Alibaba在这基础上做了很多的替代解决方案,如下:
三、什么是单体架构与微服务架构
3.1 单体架构概述
把所有的业务模块都堆砌在一个系统中,然后把系统打成一个war包或者jar包运行在应用服务器中
3.1.1 单体架构的优点
- 架构单一、容易维护
- 开发、测试、部署比较便捷
3.1.2 单体架构的缺点
- 复杂度高
- 部署慢,体积大,不利于发布
- 占用服务器资源过大
- 阻碍新的技术创新
3.2 微服务架构概述
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制,通常用http资源的api来实现,这些服务围绕业务能力构建并且可通过全自动部署机制独立部署,这些服务公用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
3.2.1 微服务架构的特征
- 每个微服务可独立运行在自己的进程里
- 一系列独立运行的微服务共同构建起整个系统
- 每个微服务可独立开发,在开发过程中只关注一个业务模块的特定功能,比如支付服务,订单管理,用户管理等等
- 可使用不同的语言与数据存储技术(契合项目情况和团队实力)
- 为服务器直接通过轻量级的通信机制进行通信,比如:Rest API进行调用
- 全自动的部署机制
3.2.2 微服务架构的优点
- 单个服务更易于开发、维护
- 单个服务启动比较快,部署也快,消耗的服务器资源更少
- 技术栈不受限制
3.2.2 微服务架构的缺点
- 运维要求高
- 分布式服务固有的复杂度
3.3 什么样子的场景适合用微服务
- 大型项目
- 有快速迭代的要求
- 访问压力过大的网站
3.4 什么样子的网站不适合微服务
- 业务稳定
- 迭代周期长
3.5 微服务拆分的方法论
- DDD领域驱动设计
- 面向对象驱动设计
- 按照职责划分,比如订单模块、搜索模块等
- 通用性划分。把一些通用功能做成微服务,比如用户中心,支付中心,消息中心等。比如阿里流行的大中台和小中台的概念,一个中台其实是由若干个微服务组成的。
3.6 微服务设计的合理性
- 满足业务的后续的扩展和延展
- 满足团队的成员的职业和技术的发展
- 可以稳步的迭代和更新你的业务
- 可以持续的更新或者调整你的技术架构,以及完全的可靠和抽离
四、构建微服务项目
4.1 创建工程
4.1.1 新建父工程[mallcloud]
4.1.2 新建一个[user-service]工程
选中mallcloud项目,选择新建module
4.1.3 新建一个[order-service]工程
和创建user-service一样创建order-service
创建完成后的项目结构
4.2 添加相关依赖
4.2.1 父工程[mallcloud]添加依赖
在父工程 [mallcloud] pom.xml中引入SpringBoot、Spring Cloud 和Spring Cloud Alibaba相关依赖,如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.alanchen</groupId>
<artifactId>mallcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>users-service</module>
<module>order-service</module>
</modules>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<mysql.version>8.0.17</mysql.version>
<mybatis.plus.version>3.2.0</mybatis.plus.version>
<druid.version>1.1.10</druid.version>
<boot.version>2.2.4.RELEASE</boot.version>
<alibaba.cloud.version>2.1.0.RELEASE</alibaba.cloud.version>
</properties>
<!-- 管理子类所有的jar包的版本,这样的目的是方便去统一升级和维护 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 所有的子工程都会自动加入下面的依赖 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- SpringBoot 工程编译打包的插件,放在父pom中就直接给所有子工程继承 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2.2 [order-service]添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mallcloud</artifactId>
<groupId>org.alanchen</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-service</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
4.2.3 [user-service]添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mallcloud</artifactId>
<groupId>org.alanchen</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>users-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>