Spring Cloud Alibaba 大型互联网领域多场景实践 Study Notes
Kierke

慕课网实战课程《Spring Cloud Alibaba 大型互联网领域多场景实践》学习笔记

第1章 课程介绍

课程主题

  • 围绕电商高并发业务场景为主线,讲解了Spring Cloud Alibaba相关组件如何应用
  • 介绍了在大规模分布式集群下Spring Cloud Alibaba的最佳实战
  • 从源码角度深度剖析各个组件的实现思路与方案


课程目标

  • 掌握Spring Cloud Alibaba相关组件的高阶用法
  • 了解Spring Cloud Alibaba框架如何应对互联网电商业务的三高场景
  • 培养技术专家的思维方式
  • 掌握读源码的方法,学会触类旁通


解决了哪些痛点

  • 框架会用了,但是到工作当中无法结合
  • 只会HelloWorld,不知原理与框架设计思路
  • 框架之间没有联系,不够系统
  • 单机或者小规模服务应对自如,大规模分布式场景一概不知


课程亮点

  • 与实际工作场景相结合,避免纸上谈兵
  • 不仅仅会用,更要知其所以然
  • 学习过程中多问为什么,培养大牛思维
  • 课程独立性强,小白高工皆可受益


课程收获

  • 掌握基于Spring Cloud Alibaba的主流电商业务技术架构
  • 应对复杂的电商业务场景(双十一、秒杀 )
  • 掌握Spring Cloud Alibaba在大规模集群应用的最佳实践
  • 掌握Spring Cloud Alibaba组件核心设计思想和原理



第2章 基于Spring Cloud Alibaba的微服务电商解决方案

Spring Cloud是什么

  • 简单来说,Spring Cloud提供了一些可以让开发者快速构建微服务应用的工具,比如配置管理、服务发现、熔断、智能路由等,这些服务可以在任何分布式环境下很好的工作


Spring Cloud解决方案

Spring Cloud Netflix与Spring Cloud Alibaba对比

Spring Cloud Netflix Spring Cloud Alibaba
服务注册与发现 Eureka Nacos
熔断限流 hystrix Sentienl
REST Client Feign
客户端负载均衡 Ribbon
微服务网关 zuul
分布式消息中间件 RocketMQ
分布式事务中间件 Seata
RPC服务框架 Dubbo

由Netflix停更引发的升级惨案

  • 2018年12月,Spring官方宣布Netflix的相关项目(Eureka,hystrix,zuul)进入维护模式;停更不停用(被动修复BUG,不再接受合并请求,不再发布新版本)
Netflix 推荐替代品
Hystrix Sentinel
Eureka Nacos
Ribbon Spring CloudLoadbalancer
Zuul Spring Cloud Gateway
  • Spring Cloud Alibaba 成为业界主流的微服务解决方案


版本选择与兼容性

版本不兼容诱发的问题

  • 线上BUG频出
  • 通过日志无法快速定位
  • 遭遇未知问题且不容易复现

版本选择(Spring Boot,Spring Cloud,Spring Cloud Alibaba)



电商行业与电商微服务架构

电商行业技术特性

  • 业务复杂度高(双十一大促,秒杀活动)
  • 技术选型新(前后端分离,使用新技术)
  • 具备三高特性(高并发,高性能,高可用)
  • 海量数据

电商行业模式介绍

  • B2B模式(Business To Business)
    • 企业与企业之间进行营销活动的一种模式
    • 例如:慧聪网,1688阿里巴巴采购批发网
  • C2C模式(Customer To Customer)
    • 个人与个人之间的电子商务活动
    • 例如:淘宝,ebay
  • B2C模式(Business To Customer)
    • 商户与个人之间的电子商务活动
    • 例如:京东,天猫

基于SpringCloud Alibaba电商微服务架构

image


微服务的设计和拆分原则

AKF扩展拆分

  • 微服务拆分方式:以图Y轴所示方式,即按照不同的服务功能进行拆分
  • 微服务拆分要点
    • 低耦合、高内聚:一个服务完成一个独立的功能
    • 按团队结构,小规模团队维护,快速迭代
image
  • 上图来自《重构的艺术》
    • Y轴:按照不同的服务应用进行微服务拆分
    • X轴:水平复制(单体系统运行多个实例,成为集群+负载均衡的模式),平等的复制应用和数据,来解决容量可用性问题,可以解决三高问题
    • Z轴:基于请求者或者用户独特的需求来进行系统的划分,并使得划分出来的系统是相互隔离但又是完整的

前后端分离原则

  • 未分离:Servlet +Jsp
  • 部分分离:SSM/SSH
  • 完全分离:Vue、Angular、React

无状态服务

  • 一笔数据需要多个服务共享,才能完成一笔交易,这个数据就称为状态,依赖这个数据的服务就叫做有状态服务,不依赖则称之为无状态服务
image
  • 如上图:服务A的实例X和服务B的实例Y就实现了无状态,它们将有状态的数据通过Redis共享。(这样就可以动态增加服务A的节点甚至无限制扩展,来达到服务A水平扩展能力,并不需要每一个请求过来去关心服务的状态是什么

Restful通信风格

image


电商微服务划分

业务分析

  • 一个电商服务中,应该是具有以下微服务模块:

广告服务、购物车服务、库存服务、商品服务、用户服务、积分服务、搜索服务、订单服务、秒杀服务


微服务工程搭建

image
  • 搭建5个微服务
1
2
3
4
5
6
7
<modules>
<module>order-server</module>
<module>product-server</module>
<module>user-server</module>
<module>stock-server</module>
<module>shop-cart-server</module>
</modules>


Nacos实现电商微服务拆分

Nacos介绍

  • 服务发现和健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理
image
  • Nacos使用场景如上图

Nacos版本选择


Nacos环境搭建

  • 环境准备:jdk1.8
1
2
3
4
5
wget -P /usr/local/src/ https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz

tar -zxvf /usr/local/src/nacos-server-1.4.1.tar.gz -C /usr/local/

sh /usr/local/nacos/bin/startup.sh -m standalone

微服务配置Nacos

image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 <dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1
2
3
4
5
6
7
8
spring:
application:
name: stock-server
cloud:
nacos:
discovery:
service: ${spring.application.name}
server-addr: 192.168.58.220:8848
1
2
//主配置类加上如下注解,表示启用服务发现
@EnableDiscoveryClient

Dubbo与Nacos整合

  • 略(放到其它课程继续深入学习)



第3章 Nacos Config 如何动态切换的开发环境

配置中心介绍与对比

微服务中配置文件的问题

  • 配置文件的数量会随着服务的增加持续递增
  • 单个配置文件无法区分多个运行环境
  • 配置文件内容无法动态更新,需要重启服务

配置中心解决了什么问题

  • 统一配置文件管理
  • 提供统一标准接口,服务根据标准接口自行拉取配置
  • 支持动态更新的到所有服务

业界常见配置中心

  • Appllo(携程开源,配置更新后实时生效,灰度发布,对所有的配置进行版本管理和操作审计的功能,提供开发平台API,网络社区资料全)
  • Disconf(百度开源分布式配置中心,基于zookeeper来实现配置变更后实时通知和生效)
  • SpringCloud Config(没有可视化界面,配置更新后不能实时生效,需要重启或手动触发)
  • Nacos(提供服务注册发现和配置)


Nacos集成springboot实现统一配置管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?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>com.stu</groupId>
<artifactId>shop-config</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

</project>
1
2
3
4
5
6
7
8
9
10
11
12
13

@RestController
@RefreshScope//Nacos config动态刷新
public class TestController {

@Value("${testStr}")
private String testStr;

@GetMapping("/test")
public String getStr() {
return testStr;
}
}
1
2
3
4
5
6
7
8
9
10


spring:
application:
name: shop-config-server
cloud:
nacos:
config:
server-addr: 192.168.58.220:8848
file-extension: yaml


Nacos config动态刷新实现原理解析



使用Nacos config整合电商项目切换开发环境




Reference




Remark

  1. 基于SpringCloud Alibaba电商微服务架构需要再学习一下
  2. nacos服务发现流程架构图还需要学习
  3. maven待好好学习
  4. dubbo待学习
1
2
3
4
5
<font color=red></font>
![]()
<img src="" title="图片名称" alt="图片无法正常加载展示!" width="100%" height="100%" >
<center><img src="" width="50%"></center>
****