截至上一篇博文,我们已经把之前所有的单工程服务合并到多模块工程中,接下来我们继续。

openfeign实现了服务间调用,如果被调用的服务没有响应应该怎么办?这就是我们这片博文中要介绍的熔断器 resilience4j,这是spring官方推荐的熔断器,可以在服务不可用时进行自定义处理。

上干货

在microservices的build.gradle中加入依赖:

implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'

完整依赖结构如图

Spring Cloud 6: 熔断器 resilience4j_resilience4j

接下来改造service1远程调用service2的方法:

package com.hao1st.service1.biz.rpcdemo.controller;

import com.hao1st.service1.biz.rpcdemo.rpc.Service2Rpc;
import jakarta.annotation.Resource;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/rpc")
public class RpcController {

    @Resource
    private Service2Rpc service2Rpc;

    /**
     * 熔断工厂类
     */
    @Resource
    private CircuitBreakerFactory cbFactory;

    @GetMapping("/invoke")
    public String rpcService2() {

        // 调用接口访问service2
        return cbFactory.create("rpcService2").run(() -> service2Rpc.rpcService2(), throwable -> "service2的服务不可用");
    }
}

1.声明熔断工厂对象cbFactory;

2.调用create方法创建"会话",参数可以理解成"会话"的ID;

3.在run方法中传递一个无参的接口函数,函数中第一个参数就是我们正常对service2的调用,第二个参数是调用不成功时我们的处理方法,框架会把错误对象(throwable)作为参数返回回来,我们在实际业务场景中可以根据需要自行处理。

到这,一个简单的熔断就写完了。

接下来我们依次启动eureka、gateway、service1和service2,确保service2可访问后,停止service2服务,再在service1中调用service2,成功的话会出现下图内容:

Spring Cloud 6: 熔断器 resilience4j_resilience4j_02

同理,service2调service1也是这么写。