截至上一篇博文,我们已经把之前所有的单工程服务合并到多模块工程中,接下来我们继续。
openfeign实现了服务间调用,如果被调用的服务没有响应应该怎么办?这就是我们这片博文中要介绍的熔断器 resilience4j,这是spring官方推荐的熔断器,可以在服务不可用时进行自定义处理。
上干货
在microservices的build.gradle中加入依赖:
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-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,成功的话会出现下图内容:
同理,service2调service1也是这么写。