微服务组件
微服务有五大组件
网关 Gate Way
注册中心/配置中心 Nacos
服务调用 Open Feign
负载均衡 Ribbon
服务保护 Sentinel
服务注册与发现
Nacos作为注册中心
服务注册:服务提供者将自己信息注册到Nacos,比如服务名称,IP,端口。
服务发现:消费者通过Nacos拉取服务列表信息,如果服务提供者有集群,则消费者利用负载均衡算法,选择一个发起调用。
服务监控:服务提供者分为临时实例与非临时实例,临时实例与Nacos有心跳机制,定期报告健康状态,如果Nacos认为临时实例挂了,就会把它剔除。非临时实例会被Nacos主动检测,如果挂了不会被剔除。另外服务列表如果更新了,Nacos会主动推送到消费者。
负载均衡
如何实现负载均衡
再feign远程调用时候,底层负载均衡就用了Ribbon
负载均衡策略有哪些
Ribbon的负载均衡主要有以下几种:
RoundRobinRule 轮询
WeightedResopseTimeRule 按权重选择
RandomRule 随机
ZoneAvoidanceRule 区域敏感策略。Zone堆服务器进行分类,Zone当作一个机房一个机架,对Zone内的多个服务做轮询(默认)
自定义负载均衡
有2种方式
实现IRule接口,指定负载均衡策略(全局),需要交给Spring进行IOC容器管理
在客户端配置文件中,可以配置一哥服务调用的负载均衡策略(局部)
服务雪崩
服务雪崩是指一个服务失败,导致整条链路的服务都失败的情形,可以通过服务降级,服务熔断解决,限流可以预防。
服务降级
服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与feign接口整合,编写降级逻辑。(比如有update、save,降级不要save了,但是update还是可以在的)
Sentinel + Feign 实现降级
(1)添加依赖
<!-- Spring Cloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)定义 Feign 客户端,指定降级类
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable Long id);
}
(3)编写降级逻辑
@Component
public class UserServiceFallback implements UserServiceClient {
@Override
public User getUser(Long id) {
// 返回降级数据(如默认用户、缓存数据)
return new User(-1L, "fallback-user", "网络故障,稍后重试");
}
}
(4)配置 Sentinel 支持 Feign
spring:
cloud:
sentinel:
enabled: true
# 启用 Sentinel 对 Feign 的支持
feign:
enabled: true
服务熔断
服务熔断:默认关闭,需要手动打开,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求
(1)动态规则(代码方式)
@PostConstruct //标记一个方法在对象初始化后立即执行
public void initRules() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule("GET:/user/{id}")
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) // 按异常比例熔断
.setCount(0.5) // 失败率阈值 50%
.setTimeWindow(10) // 熔断恢复时间(秒)
.setMinRequestAmount(10) // 10秒内最少请求数
.setStatIntervalMs(10000); // 统计窗口 10秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
(2)配置文件方式
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: sentinel-degrade-rules
groupId: DEFAULT_GROUP
rule-type: degrade
Nacos 配置 sentinel-degrade-rules
:
[
{
"resource": "GET:/user/{id}",
"grade": 0, // 0=慢调用比例, 1=异常比例, 2=异常数
"count": 0.5, // 阈值(50%)
"timeWindow": 10, // 熔断时长(秒)
"minRequestAmount": 10, // 最小请求数
"statIntervalMs": 10000 // 统计窗口(毫秒)
}
]