spring cloud 微服务架构基础知识
Spring cloud alibaba
1.概述
微服务结构(MSA)就是将单个应用程序开发为一组小型的独立的服务组件,这些独立的服务在自己的进程中运行,独立部署和开发,便于维护与更新。
Spring Cloud Alibaba 是Spring Cloud的一个子项目,致力于提供微服务开发的一站式解决方案。该项目中包含开发分布式微服务的必需组件,便于开发者调用。依托该项目只需要使用少量的配置或注解就可以使用阿里巴巴提供的微服务解决方案,通过阿里的中间组件来完成分布式系统的搭建,提高了开发效率。
2.核心组件
- 服务限流降级
- 服务注册与发现
- 分布式配置管理
- 消息驱动能力
- 分布式事务
- 分布式任务调度
Nacos
1.概述
nacos是一个应用于服务注册与发现,配置管理的平台。
2.环境使用要求:
jdk 1.8
mysql 5.7以上
3.初始化
使用下列命令创建nacos_config数据库
source E:/nacos-mysql.sql
在sql文件中上部添加一些语句,保证正常执行
DROP DATABASE IF EXISTS `nacos_config`;
CREATE DATABASE `nacos_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `nacos_config`;
在nacos/conf/application.properties设置配置信息
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
nacos服务单机模式启动
startup.cmd -m standalone
4.使用说明
服务注册与调用
服务注册与调用:核心为通过pom文件配置来调用声明要使用nacos服务平台管理,之后在application.yml文件中来设置服务器的端口号port,名称地址等。
配置依赖如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
使用nacos服务注册是为了更好的查找与管理服务,并且nacos中提供5秒心跳的续约刷新。对于服务消费方可以通过RestTemplate来调用服务提供端的产品。
服务负载均衡:
- 负载均衡设计通过loadBalancerClient应用来实现
- 可使用@LoadBalanced对构建的RestTemplate方法进行修饰来实现拦截,进而实现负载均衡分配
nacos负载均衡策略:(默认是轮训策略)
-
RoundRobinRule 轮训策略
-
RandomRule 随机策略
-
BestAvailableRulr 过滤故障机之后,选择并发性小的服务器
-
WeightedResponseTimeRule 根据响应时间加权轮训
-
AvailabilityFilteringRule 先过滤故障机,在以线性轮训方式从过滤后的实例清单中选择
-
ZoneAvoidanceRule 从最佳区选择一个最优服务器
-
RetryRule 选择一个server,失败则重新选择
nacos均衡负载的底层实现:通过Ribbon来实现的,Ribbon中定义了许多负载均衡的算法,然后从这些算法中选取一个使用。负载均衡也可以自定义实现策略,基于IRule接口来定义即可。
Feign
概述
Feign是一种声明式的web service客户端,它的目的就是让web service调用更加简单,整合了Ribbon和Hystrix,使用时只需要在接口上添加一个@FeignClient注解,方便远程服务的调用。
使用
-
在pom文件中添加Feign依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
在启动类添加注解**@EnableFeignClients**开启Feign扫描支持
-
在接口添加**@FeignClient**注解,可以配置name,contextId,fallbackFactory等属性信息
-
在controller类@Autowired注入即可使用调用远程服务
Feign工作原理
- 在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients 注解开启对 Feign Client 扫描加载处理。根据 Feign Client 的开发规范,定义接口并加 @FeignClient 注解。
- 当程序启动时,会进行包扫描,扫描所有 @FeignClient 的注解的类,并将这些信息注入 Spring IOC 容器中。当定义的 Feign 接口中的方法被调用时,通过JDK的代理的方式,来生成具体的 RequestTemplate。当生成代理时,Feign 会为每个接口方法创建一个 RequetTemplate 对象,该对象封装了 HTTP 请求需要的全部信息,如请求参数名、请求方法等信息都是在这个过程中确定的。
- 然后由 RequestTemplate 生成 Request,然后把 Request 交给 Client 去处理,这里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最后 Client 被封装到 LoadBalanceclient 类,这个类结合 Ribbon 负载均衡发起服务之间的调用。
@FeignClient注解说明
- name:指定 Feign Client 的名称,如果项目使用了 Ribbon,name 属性会作为微服务的名称,用于服务发现。
- url:url 一般用于调试,可以手动指定 @FeignClient 调用的地址。
- decode404:当发生404错误时,如果该字段为 true,会调用 decoder 进行解码,否则抛出 FeignException。
- configuration:Feign 配置类,可以自定义 Feign 的 Encoder、Decoder、LogLevel、Contract。
- fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口。
- fallbackFactory:工厂类,用于生成 fallback 类实例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
- path:定义当前 FeignClient 的统一前缀。
Nacos配置中心
Nacos配置中心
概述
配置中心是储存配置信息的一个服务。通过nacos配置中心可以用来动态调整和控制系统的运行时态,集中管理配置信息,动态发布配置信息。
配置中心一般用来配置经常变化的信息,如连接池、日志、线程池、限流熔断等信息;一般如端口服务、服务名,服务注册地址不会写在配置中心。
使用(以日志级别配置为例)
-
在pom文件中添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
修改application.yml为bootstrap.yml文件并添加配置文件设置格式
因为bootstrap.yml文件的读取优先级比较高,可以在服务启动时读取配置中心的数据。
config: server-addr: 127.0.0.1:8848 file-extension: yml
-
在nacos配置中心可以进行添加配置
logging: level: com.jt: debug
注:日志生成默认级别:infor
trace<debug<info<warn <error
@RefreshScope
添加到所在的controller层类名上,在相关配置中心的值发生改变以后,能够及时的看到类中的属性的更新。实现原理是配置改变之后对controller的对象重新进行了初始化配置。
nacos配置管理
配置管理模型:
-
namespace命名空间
-
group分组
-
service/dataId管理实例
config:
#命名空间
namespace: a8ac8456-2daa-4e16-b46c-31c7e28075fe
#分组
group: DEFAULT_GROUP_51
#共享配置
shared-configs[0]:
data-id: app-public.yml
refresh: true
Tips
在多个线程抢占资源的时候要进行安全锁同步,以保证线程的安全。
sentinel限流熔断
概述:
sentinel(分布式系统的流量防卫兵)是阿里开源的一款服务容错的综合性解决方案。它可以通过在服务负载过高时,采用限流、降级、熔断策略来维护服务系统的稳定运行。
使用:
-
下载sentinel.jar包,使用cmd命令行打开
下载地址:https://github.com/alibaba/Sentinel/releases
启动命令:java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
-
localhost:8180访问,进入sentinel服务
-
在提供方应用sentinel,向其中添加其sentinel的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
在bootstrap.yml中添加sentinel的配置
spring: cloud: sentinel: transport: dashboard: localhost:8180 # 指定sentinel控制台地址。
-
在控制层添加方法启动后,访问时可以实时监控。在sentinel的客户端可以在簇点链路中设置流控、降级、热点,授权等操作。
-
设置新增后可以再次访问,限流等操作设置生效。
流控规则
sentinel默认规则是:直接----快速失败
可选:关联(关联资源)、链路(入口资源)等
注:如要对单独指定链路限流,则需要在sentinel配置中添加配置来关闭URL PATH聚合
sentinel:
web-context-unify: false
降级规则
最大RT:最大响应时长ms
比例阀值:超时所占比例
熔断时长:熔断多少秒,然后恢复
最小请求数:在统计时长内超过的次数限时,超过则进行熔断
统计时长:统计请求数的时长
扩展:sentinel异常处理,在内部有默认的异常处理BlockExceptionhandler接口,也可以自定义异常处理
热点规则
热点限流主要针对的是一些访问量较高的数据进行限流,最常用的为通过id作为热点参数进行限制。在参数例外项中可以设置某个参数的特定阀值。出现限流后后台底层异常为ParamFlowException。
授权规则
根据调用方法校验限制资源是否通过,使用授权规则中的黑白名单控制功能。
使用可以RequestOriginParaer接口实现类,在接口方法中解析请求参数并返回,底层会基于此返回值进行授权应用。
网关GateWay
概述
网关本质上是提供一种各种服务访问的入口,提供服务接收并转发所有内外部的客户端调用,还有就是权限认证、限流控制等。spring cloud gateway 是一个spring开发的一个网关组件,旨在为微服务架构提供一种简单有效的api入口,负责路由、组合与协议转换,并基于Filter链的方式提供了权限认证、监控、限流。
使用
-
配置依赖模块
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
创建application.yml配置网关
server: port: 9000 spring: application: name: sca-gateway cloud: gateway: routes: #配置网关路由规则 - id: route01 #路由id,自己指定一个唯一值即可 uri: http://localhost:8081/ #网关帮我们转发的url predicates: ###断言(谓此):匹配请求规则 - Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源 filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理 - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
-
创建项目启动类GateWayApplication,注释启动项@SpringBootApplication
-
访问测试
负载均衡
-
依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
修改配置,添加nacos负载均衡策略
spring: cloud: nacos: discovery: server-addr: localhost:8848 gateway: discovery: locator: enabled: true #开启通过服务注册中心的serviceId创建路由 routes: - id: route01 ##uri: http://localhost:8081/ uri: lb://sca-provider # lb为服务前缀(负载均衡单词的缩写),不能随意写 predicates: ###匹配规则 - Path=/nacos/provider/echo/** filters: - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
注:lb指的是nacos中获取微服务遵循负载均衡策略,建议可以开启gateway调试日志。
logging: level: org.springframework.cloud.gateway: debug
-
访问测试,实现负载均衡访问服务器。
限流设计
-
在网关配置的基础上,在其中添加sentinel依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
-
添加sentinel路由规则
routes: - id: route01 uri: lb://sca-provider predicates: ###匹配规则 - Path=/provider/echo/** sentinel: transport: dashboard: localhost:8180 #Sentinel 控制台地址 eager: true #取消Sentinel控制台懒加载,即项目启动即连接
-
在gateway网关的配置里面,添加vm参数。这样可以使得网关在sentinel中显示不一样的菜单。添加以后会在其中看到有请求链路、API管理等
-Dcsp.sentinel.app.type=1
- 在sentinel中设置流控规则,api名称与配置文件中的路由id相同,burst size为应对突发情况下额外允许的请求数目
- 在浏览器通过url访问测试,实现限流操作
基于针对请求的限流
在网关流控规则中,可以设置针对请求属性,在其中进行相关配置。
可以通过postman进行测试分析
自定义API维度限流
自定义可以使用sentinel提供的API,将请求路径进行分组,在分组上进行限流设计。
- 路径新建分组group01,配置匹配模式为精准,并添加匹配串即url
- 新增分组流控规则
- 访问测试