一、SpringCloud Alibaba微服务实战一 - 基础环境准备
Spring Cloud Alibaba
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Spring Cloud Netflix
目前市场上主流的 第一套微服务架构解决方案:Spring Boot + Spring Cloud Netflix
Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用 Spring Cloud 开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及 Cloud Foundry 等托管平台。
目前业界对 Spring Cloud 使用最广的就是 Spring Cloud Netflix 了
项目已经进入维护模式
【官方新闻】Spring Cloud Greenwich.RC1 available now
2018 年 12 月 12 日,Netflix 宣布 Spring Cloud Netflix 系列技术栈进入维护模式(不再添加新特性)
最近,Netflix 宣布 Hystrix 正在进入维护模式。自 2016 年以来,Ribbon 已处于类似状态。虽然 Hystrix 和 Ribbon 现已处于维护模式,但它们仍然在 Netflix 大规模部署。
Hystrix Dashboard 和 Turbine 已被 Atlas 取代。这些项目的最后一次提交分别是 2 年前和 4 年前。Zuul1 和 Archaius1 都被后来不兼容的版本所取代。
以下 Spring Cloud Netflix 模块和相应的 Starter 将进入维护模式:
- spring-cloud-netflix-archaius
- spring-cloud-netflix-hystrix-contract
- spring-cloud-netflix-hystrix-dashboard
- spring-cloud-netflix-hystrix-stream
- spring-cloud-netflix-hystrix
- spring-cloud-netflix-ribbon
- spring-cloud-netflix-turbine-stream
- spring-cloud-netflix-turbine
- spring-cloud-netflix-zuul
什么是维护模式
将模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我们也会考虑并审查社区的小型 pull request
替代品
我们建议对这些模块提供的功能进行以下替换:
CURRENT |
REPLACEMENT |
Hystrix |
Resilience4j |
Hystrix Dashboard / Turbine |
Micrometer + Monitoring System |
Ribbon |
Spring Cloud Loadbalancer |
Zuul 1 |
Spring Cloud Gateway |
Archaius 1 |
Spring Boot external config + Spring Cloud Config |
2018 年 10 月 31 日的凌晨,这个伟大的日子里,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。
Spring Cloud for Alibaba 0.2.0 released
主要功能
服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
组件
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
版本管理规范
项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
- 2.2.x 版本适用于 Spring Boot 2.2.x
- 2021.x 版本适用于 Spring Boot 2.4.x
特别注意:
Spring Cloud Alibaba 项目都是基于 Spring Cloud,而 Spring Cloud 项目又是基于 Spring Boot 进行开发,所以三者之间的版本关系特别重要,一旦选错版本,项目就没法运行
版本说明 遵循这个官方的版本说明解决版本冲突的问题(课件下面的版本仅供参考)
组件版本关系
Spring Cloud Alibaba Version |
Sentinel Version |
Nacos Version |
RocketMQ Version |
Dubbo Version |
Seata Version |
2.2.6.RELEASE |
1.8.1 |
1.4.2 |
4.4.0 |
2.7.8 |
1.3.0 |
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE |
1.8.0 |
1.4.1 |
4.4.0 |
2.7.8 |
1.3.0 |
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE |
1.8.0 |
1.3.3 |
4.4.0 |
2.7.8 |
1.3.0 |
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE |
1.7.1 |
1.2.1 |
4.4.0 |
2.7.6 |
1.2.0 |
2.2.0.RELEASE |
1.7.1 |
1.1.4 |
4.4.0 |
2.7.4.1 |
1.0.0 |
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE |
1.7.0 |
1.1.4 |
4.4.0 |
2.7.3 |
0.9.0 |
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE |
1.6.3 |
1.1.1 |
4.4.0 |
2.7.3 |
0.7.1 |
毕业版本依赖关系(推荐使用)
Spring Cloud Version |
Spring Cloud Alibaba Version |
Spring Boot Version |
Spring Cloud 2020.0.1 |
2021.1 |
2.4.2 |
Spring Cloud Hoxton.SR9 |
2.2.6.RELEASE |
2.3.2.RELEASE |
Spring Cloud Greenwich.SR6 |
2.1.4.RELEASE |
2.1.13.RELEASE |
Spring Cloud Hoxton.SR3 |
2.2.1.RELEASE |
2.2.5.RELEASE |
Spring Cloud Hoxton.RELEASE |
2.2.0.RELEASE |
2.2.X.RELEASE |
Spring Cloud Greenwich |
2.1.2.RELEASE |
2.1.X.RELEASE |
Spring Cloud Finchley |
2.0.4.RELEASE(停止维护,建议升级) |
2.0.X.RELEASE |
Spring Cloud Edgware |
1.5.1.RELEASE(停止维护,建议升级) |
1.5.X.RELEASE |
二、基础环境准备
根据版本说明中的推荐,我们这里选择SpringBoot的版本为2.4.2,SpringCloud Alibaba的版本则为2021.1,组件对应关系如下
内容主要基于三个微服务:用户服务AccountService,订单服务OrderService,产品服务ProductService
用到的组件有:
- 注册中心、配置中心 Nacos
- 限流 Sentinel
- 分布式事务 Seata
- 网关 SpringCloud Gateway
- 认证授权 Spring Cloud Oauth2
- docker、docker-compose
由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器,所以在开发过程中我会逐渐将一些组件使用docker-compose部署
本篇内容就是使用Dokcer-compose部署Nacos,Sentinel,MySQL,作为后面的文章的基础环境
容器化
MySQL
由于nacos需要依赖于MySQL作为资源存储,所以在编写完整docker-compose之前我会先用docker启动临时的mysql容器,然后准备好nacos需要的数据库
启动临时容器
docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=123456 -v /app/cloud/mysql/data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
此处需要挂载宿主机目录,在启动docker-compse后就不需要再次初识化数据。
用mysql客户端连接你的容器,然后导入nacos的数据表
https://github.com/alibaba/nacos/tree/develop/distribution/conf/nacos-mysql.sql
停止容器,由于加了--rm参数,所以容器会自动删除
docker stop containerID
Nacos
我们来看看NACOS的环境变量,如下表所示:
配置项 |
描述 |
可选参数 |
默认值 |
MODE |
模式 cluster/standalone |
cluster/standalone |
cluster |
PREFER_HOST_MODE |
是否支持 hostname |
hostname/ip |
ip |
NACOS_SERVER_PORT |
服务端口号 |
8848 |
|
SPRING_DATASOURCE_PLATFORM |
单机模式支持 mysql |
mysql / empty |
empty |
MYSQL_MASTER_SERVICE_HOST |
mysql 主节点 host |
||
MYSQL_MASTER_SERVICE_PORT |
mysql 主节点 port |
3306 |
|
MYSQL_MASTER_SERVICE_DB_NAME |
mysql 主节点数据库名 |
||
MYSQL_MASTER_SERVICE_USER |
mysql 主节点用户名 |
||
MYSQL_MASTER_SERVICE_PASSWORD |
mysql 主节点密码 |
||
MYSQL_SLAVE_SERVICE_HOST |
mysql 从节点 host |
||
MYSQL_SLAVE_SERVICE_PORT |
mysql 从节点 port |
3306 |
Nacos支持主从配置,考虑到资源问题,我们只配置一台单独的mysql服务器,有资源的同学可以搭建主从环境
Sentinel
sentinel比较简单,直接配置sentinel-dashboard镜像即可 (在系列的开始不需要引入sentinel组件,为了后面不再单独介绍,本次我也把他加到我的docker-compose中)
Seata
seata由于一些原因,还没发布官方镜像,暂时搁浅。
docker-compose
以下是我编写的docker-compse文件,大家可以自行修改
version: "3"
services:
mysql:
container_name: mysql
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /app/cloud/mysql/data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
nacos:
image: nacos/nacos-server:1.4.1
container_name: nacos
hostname: nacos
restart: always
environment:
- MODE=standalone
- TZ=Asia/Shanghai
- NACOS_SERVER_PORT=8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=120.78.224.108
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
- PREFER_HOST_MODE=hostname
volumes:
- /app/cloud/nacos/logs:/home/nacos/logs
ports:
- "8848:8848"
sentinel:
image: bladex/sentinel-dashboard:1.8.0
container_name: sentinel
ports:
- "8858:8858"
restart: always
seata-server:
image: seataio/seata-server:1.3.0
hostname: seata-server
ports:
- 8091:8091
environment:
- SEATA_PORT=8091
expose:
- 8091
将其上传至你的服务器,执行 docker-compose up -d 命令启动
# 这里尽量开放一下服务器的端口
查看防火墙状态:
systemctl status firewalld
systemctl stop firewalld
systemctl start firewalld
开启端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
查询端口号8080是否开启:
firewall-cmd --query-port=3306/tcp
重启防火墙:
firewall-cmd --reload
查询有哪些端口是开启的:
firewall-cmd --list-port
环境验证
nacos
访问nacos http://192.168.136.129:8848/nacos,使用账号密码nacos/nacos登录
在服务配置中添加一条数据
查看数据库是否有对应的记录
sentinel
访问 http://192.168.203.129:8858/#/login使用账号sentinel/sentinel登录
sentinel安装成功!
至此前期所需要的组件都安装成功,那么本期的“SpringCloud Alibaba微服务实战 - 基础环境准备”篇也就该结束啦
总结
以上就是今天要讲的内容,本文仅仅简单介绍了SpringCloudAlibaba的基础环境,后续功能请转到下一章