Spring Cloud Alibab快速上手
共 19053字,需浏览 39分钟
·
2021-04-10 10:49
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
一、Spring Cloud Alibaba简介
1.1 什么是Spring Cloud Alibaba?
Spring Cloud Alibaba 是阿里提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。马老师左手双十一,右手阿里开源组件,不仅占据了程序员的购物车,还要攻占大家的开发工具。
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式系统。
依托 Spring Cloud Alibaba,需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
官方文档地址:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
1.2 主要模块
服务注册和发现:实例可以在Nacos中注册,客户可以使用Spring管理的bean发现实例。支持通过Spring Cloud Netflix的客户端负载均衡器Ribbon。
流量控制和服务降级:使用Sentinel进行流量控制,断路和系统自适应保护。
分布式配置中心:使用Nacos作为数据存储
消息总线:使用Spring Cloud Bus RocketMQ链接分布式系统的节点
Dubbo RPC:通过Dubbo RPC扩展Spring Cloud服务到服务调用的通信协议
分布式事务:支持高性能且易于使用的Seata分布式事务解决方案
阿里云对象存储:OSS的Spring资源抽象。阿里云对象存储服务(OSS)是一种加密,安全,经济高效且易于使用的对象存储服务,可让您在云中存储,备份和存档大量数据
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
1.3 模块对应组件
1、阿里开源组件
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。
2、阿里商业化组件
作为一家商业公司,阿里巴巴推出 Spring Cloud Alibaba,很大程度上市希望通过抢占开发者生态,来帮助推广自家的云产品。所以在开源社区,夹带了不少私货,这部分组件整体易用性和稳定性还是很高的。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的云存储服务。
Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
3、集成 Spring Cloud 组件
Spring Cloud Alibaba 作为整套的微服务解决组件,只依靠目前阿里的开源组件是不够的,更多的是集成当前的社区组件,所以 Spring Cloud Alibaba 可以集成 Zuul,OpenFeign等网关,也支持 Spring Cloud Stream 消息组件。
1.4 与Spring版本对应关系
我们统一使用 2.1版本的与前面的springcloud对应
二、注册中心+配置中心Nacos
2.1 什么是Nacos?
Nacos诞生于2019年
一句话概括:它既是 注册中心 也是 配置中心,也就是类似Eureka+config的微服务管理平台!
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
官网地址:https://nacos.io/zh-cn/docs/what-is-nacos.html
2.2 Nacos的安装启动
2.2.1. 环境要求
Nacos 依赖 Java 环境来运行。请确保是在以下版本环境中安装使用:
1、支持 Linux/Unix/Mac/Windows,64 位操作系统
2、支持JDK 1.8及以上,64 位版本;
3、Maven必须是3.2.x及以上版本;
2.2.2. 下载地址
https://github.com/alibaba/nacos/releases
2.2.3. 启动Nacos服务
启动命令:或者双击startup.cmd运行文件,(如果cmd窗口闪一下就没有了,请检查JAVA_HOME)。
startup.cmd
启动成功如下图:
2.2.4. 访问Nacos服务
浏览器访问http://localhost:8848/nacos/
输入默认用户名:nacos 密码:nacos
登陆成功界面如下
2.2.5. Nacos关闭
关闭命令:或者双击shutdown.cmd运行文件。
shutdown.cmd
2.3. 注册中心使用
1、在pom.xml中,添加SpringCloud和Nacos相关依赖
<!--版本号配置定义-->
<properties>
<java.version>1.8</java.version>
<!--SpringCloud阿里巴巴版本-->
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
<!--SpringCloud版本-->
<spring.cloud.version>Greenwich.SR4</spring.cloud.version>
</properties>
<dependencies>
<!-- 省略部分坐标... -->
<!--nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!--BOM 依赖管理清单列表-->
<dependencyManagement>
<dependencies>
<!--SpringCloud的所有依赖坐标清单-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Alibaba的相关所有依赖坐标清单-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、配置Nacos注册中心地址,提供者、消费者都配
#注册到nacos注册中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、启动引导类中添加@EnableDiscoveryClient注解,提供者、消费者都加
@SpringBootApplication
@EnableDiscoveryClient//开启注册中心客户端
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
4、消费者服务中,配置开启负载均衡,加@LoadBanlancer注解。
@SpringBootApplication
@EnableDiscoveryClient//开启注册中心客户端
public class ConsumerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class, args);
}
//配置RestTemplate对象,注入Spring容器
@Bean
@LoadBalanced//开启负载均衡器
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
5、将访问地址改为服务名称
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RestTemplate restTemplate;
@Override
public User findUserByIdWithUserService(Integer id) {
// 使用ribbon负载均衡器,同时配置了注册中心
// 才可以使用服务名称访问对应服务
String url = "http://user-service/user/findById/" + id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
6、查看nacos管控台服务列表,测试服务负载均衡访问效果
2.4、配置中心使用
2.4.1、目标:
将提供者服务的配置文件,提取到nacos配置中心中管理
2.4.2、实现步骤:
(1)在Nacos管控台的配置管理中,添加提供者服务配置文件
(2)在pom.xml中,添加Nacos配置中心依赖坐标
(3)删除application.properties配置文件,使用bootstrap.properties配置文件
(4)bootstrap.properties配置文件中,添加Nacos配置中心地址
(5)启动服务测试访问
2.4.3、实现过程:
1、在Nacos管控台的配置管理中,添加提供者服务配置文件
在pom.xml中,添加Nacos配置中心依赖坐标
<!--nacos配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、删除application.properties配置文件,使用bootstrap.properties配置文件
3、bootstrap.properties配置文件中,添加Nacos配置中心地址
#配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定配置中心的文件格式,默认properties,如果使用yml需显示声明
#spring.cloud.nacos.config.file-extension=yml
4、启动服务测试访问
注意:
Data-ID名称一旦填写发布不可修改
Data-ID中,应用名称要与对应服务应用名称一致:{应用名称}-{环境名称}.properties
Data-ID中,环境名称可以不写
默认加载properties格式配置文件,如果使用yml格式,则需要在配置文件中声明文件格式。
扩展1:配置自动刷新
提供者服务,配置信息无法自动刷新配置
可添加personName=肖战 ,在controller中获取进行测试。
解决办法:
1、需要刷新的controller上添加@RefreshScope
@RestController
@RequestMapping("user")
@RefreshScope//自动刷新配置
public class UserController {
@Autowired
private UserService userService;
@Value("${server.port}")
private String port;
//获取配置文件中personName
@Value("${personName}")
private String name;
@RequestMapping("/findById/{id}")
public User findById(@PathVariable("id") Integer id){
User user = userService.findById(id);
//设置端口信息,设置PersonName
user.setNote("端口 : "+port+" ; personName :"+name);
return user;
}
}
2、修改配置,再次测试
注意:无需第三方消息队列中间件
扩展2:多环境配置使用
1. 方式一:文件名称命名
我们在Nacos界面新建配置时可以通过文件名来区分环境,当多环境时可以将名称填写为:user-service-dev.properties,但是需要在生产者的配置文件中声明:spring.profiles.active=dev
nacos配置文件:
bootstrap.properties:
#指定配置文件环境
spring.profiles.active=dev
2. 方式二:Group分组
除了使用配置文件命名方式,我们还可以使用group分组的方式来实现相同效果。
新建配置文件时,默认是DEFAULT_GROUP。
我们可以通过设置不同的group和在bootstrap.prperties中指定分组来区别不同的环境。
nacos配置文件:
bootstrap.properties:
#指定配置中心分组
spring.cloud.nacos.config.group=PROD_GROUP
三、流量防卫兵Sentinel
3.1 Sentinel简介
Sentinel: 分布式系统的流量防卫兵
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。
2012 年,Sentinel 诞生,主要功能为入口流量控制。
2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
2018 年,Sentinel 开源,并持续演进。
1、主要特征
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
2、Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
3.2 Sentinel控制台安装
1、下载jar
https://github.com/alibaba/Sentinel/releases
2、启动:
java -jar 启动 默认端口8080,可以通过 -Dserver.port=8086 来修改
# 第一种
java -jar -Dserver.port=8086 sentinel-dashboard-1.6.3.jar
# 第二种
java -jar sentinel-dashboard-1.6.3.jar --server.port=8086
3、访问测试:
http://127.0.0.1:8086 默认账密:sentinel/sentinel
3.3 服务集成Sentinel
**目标:**提供者服务和消费者服务,集成至Sentinel
实现步骤:
1、在pom.xml添加sentinel依赖坐标
2、配置文件添加sentinel地址
3、必须访问服务接口,
http://localhost:9091/user/findById/1,http://localhost:8081/consumer/1
4、然后在http://127.0.0.1:8086,sentinel中才能看到对应服务
实现过程:
1、在pom添加sentinel依赖
<!--sentinel客户端依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、生产者配置文件添加sentinel地址
#sentinel注册地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8086
#服务接收sentinel的配置端口
spring.cloud.sentinel.transport.port=8719
3、访问服务接口
http://localhost:9091/user/findById/1,http://localhost:8081/consumer/1
4、然后在http://127.0.0.1:8086,sentinel中才能看到对应服务
3.4 演示:服务降级和限流
**目标:**消费者服务降级和限流效果演示
实现步骤:
1、在消费者服务中,添加服务降级和限流处理方法
2、在sentinel控制台中,添加服务降级配置
3、测试服务降级
4、在sentinel控制台中,添加服务限流配置
5、测试服务限流
实现过程:
1、在消费者服务中,添加服务降级和限流处理方法
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RestTemplate restTemplate;
/**
* @SentinelResource 注解作用:设置服务降级处理方法和服务限流处理方法
* value属性 设置被降级或限流方法
* fallback属性 设置服务降级处理方法
* blockHandler属性 设置服务限流处理方法
*/
@Override
@SentinelResource(value = "findUserByIdWithUserService",fallback = "fallbackMethod",blockHandler = "blockMethod")
public User findUserByIdWithUserService(Integer id) {
// 使用ribbon负载均衡器,同时配置了注册中心
// 才可以使用服务名称访问对应服务
String url = "http://user-service:9091/user/findById/" + id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
//创建服务降级方法,与被降级方法返回值保持一致,参数保持一致
public User fallbackMethod(Integer id) {
User user = new User();
user.setNote("服务降级处理了~");
return user;
}
//创建服务限流方法,与被降级方法返回值保持一致,参数保持一致,除了参数保持一致,还需要加一个参数blockexception
public User blockMethod(Integer id) {
User user = new User();
user.setNote("服务限流处理了~");
return user;
}
}
2、在sentinel控制台中,添加服务降级配置
3、测试服务降级
4、在sentinel控制台中,添加服务限流配置
5、测试服务限流
注意:
服务降级处理方法,返回值与参数必须与被降级方法保持一致
服务限流处理方法,返回值与参数必须与被降级方法保持一致,参数除保留原来之外,还需添加BlockException参数。
服务降级设置资源:findUserByIdWithUserService
服务降级设置资源:findUserByIdWithUserService,/consumer/1
四、配置中心Apollo
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。
Apollo配置中心应运而生!
4.1 Apollo简介
Apollo(阿波罗)是携程框架部门研发的配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
项目地址:https://github.com/ctripcorp/apollo
Apollo支持4个维度管理Key-Value格式的配置:
1、application (应用)
2、environment (环境)
3、cluster (集群)
4、namespace (命名空间)
基础模型图:
1、用户在配置中心对配置进行修改并发布
2、配置中心通知Apollo客户端有配置更新
3、Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
4.2 Apollo安装启动
环境要求:
Jdk1.8+
MySQL5.6.5+,版本不对,使用docker快速安装mysql!
1. 下载Apollo安装包
下载地址:https://github.com/nobodyiam/apollo-build-scripts
2. 启动配置中心Apollo服务
启动步骤:
1、解压安装包,找到服务数据库SQL文件
(1)apolloportaldb.sql (管理台sql)
(2)apolloconfigdb.sql(配置中心sql)
2、修改启动脚本demo.sh,配置脚本中连接mysql数据库账户密码
(1)默认本地可以不改!
3、执行启动命令,注意:使用Git Bash命令窗口启动
(1)启动3个服务端口,8080【注册中心Eureka】,8070【门户站点】,8090【管理服务】
4、启动成功结果,然后访问http://localhost:8070/进行测试
启动过程:
1、解压安装包,找到服务数据库SQL文件
(1)apolloportaldb.sql (管理台sql)
(2)apolloconfigdb.sql(配置中心sql)
2、修改启动脚本demo.sh,配置脚本中连接mysql数据库账户密码
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
3、执行启动命令,注意:使用Git Bash命令窗口启动
#分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
#启动命令
./demo.sh start
#停止命令
./demo.sh stop
4、启动成功结果:当看到如下图时,即可访问8070端口
5、进入登录界面http://localhost:8070/,输入默认账密:apollo/admin
4.3Apollo详解
1. 服务端设计
(1)用户在Portal【门户站点】操作配置发布
(2)Portal【门户站点】调用Admin Service【管理服务】的接口操作发布
(3)Admin Service【管理服务】发布配置后,发送消息给各个Config Service【配置中心服务】
(4)Config Service【配置中心服务】收到消息后,通知对应的客户端
2. 客户端设计
上图简要描述了Apollo客户端的实现原理:
1、客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
2、客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
(1)这是一个fallback【兜底】机制,为了防止推送机制失效导致配置不更新
(2)客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
(3)定时频率默认为每5分钟拉取一次,可以修改:apollo.refreshInterval,单位分钟!
3、客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
4、客户端会把从服务端获取到的配置在本地文件系统缓存一份
(1)在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
5、应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知
4.4 配置中心比较:
————————————————
版权声明:本文为CSDN博主「用生命研发技术」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/qq_37242720/article/details/115125033
粉丝福利:Java从入门到入土学习路线图
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈