微服务组件

5

微服务有五大组件

  1. 网关 Gate Way

  2. 注册中心/配置中心 Nacos

  3. 服务调用 Open Feign

  4. 负载均衡 Ribbon

  5. 服务保护 Sentinel

服务注册与发现

Nacos作为注册中心

服务注册:服务提供者将自己信息注册到Nacos,比如服务名称,IP,端口。

服务发现:消费者通过Nacos拉取服务列表信息,如果服务提供者有集群,则消费者利用负载均衡算法,选择一个发起调用。

服务监控:服务提供者分为临时实例与非临时实例,临时实例与Nacos有心跳机制,定期报告健康状态,如果Nacos认为临时实例挂了,就会把它剔除。非临时实例会被Nacos主动检测,如果挂了不会被剔除。另外服务列表如果更新了,Nacos会主动推送到消费者。

负载均衡

如何实现负载均衡

再feign远程调用时候,底层负载均衡就用了Ribbon

负载均衡策略有哪些

  1. Ribbon的负载均衡主要有以下几种:

  2. RoundRobinRule 轮询

  3. WeightedResopseTimeRule 按权重选择

  4. RandomRule 随机

  5. ZoneAvoidanceRule 区域敏感策略。Zone堆服务器进行分类,Zone当作一个机房一个机架,对Zone内的多个服务做轮询(默认)

自定义负载均衡

有2种方式

  1. 实现IRule接口,指定负载均衡策略(全局),需要交给Spring进行IOC容器管理

  2. 在客户端配置文件中,可以配置一哥服务调用的负载均衡策略(局部)

服务雪崩

服务雪崩是指一个服务失败,导致整条链路的服务都失败的情形,可以通过服务降级,服务熔断解决,限流可以预防。

服务降级

  • 服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与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 // 统计窗口(毫秒)
  }
]