springcloud个别服务实例下线,导致的异常处理

/ 默认分类 / 没有评论 / 387浏览

当你使用eureka注册中心时,一定会遇到这种情况,就是请求的服务下线了,从而导致本次请求失败。

无论你是怎么终止服务的 kill -15 还是 docker stop 或者docker-compose stop,上述的问题都不能从根本解决,根本原因就是请求者不知道服务已经下线了,那这里就衍生出

第一个思路,就是应用软下线,下线之前通知其他服务自己下线了,可以使用mq,或者使用发送rest请求,其他应用对其订阅或者处理即可

第二种方法,在使用shell部署应用时调用需要更新应用主动发起下线

代码如下


/**
 * 服务主动上下线
 * @author xiatiao
 */
@Slf4j
@ConditionalOnClass({EurekaAutoServiceRegistration.class})
@RequestMapping("/application")
@RestController
public class ApplicationController {

    @Resource
    EurekaAutoServiceRegistration eurekaAutoServiceRegistration;

    @GetMapping("/online")
    public Result<?> online() {
        eurekaAutoServiceRegistration.start();
        return Result.OK();
    }

    @GetMapping("/offline")
    public Result<?> offline() {
        eurekaAutoServiceRegistration.stop();
        return Result.OK();
    }
}

主动下线后,shell可以sleep一段时间后,再执行真正的停止程序。

最后一种就是使用重试机制,当请求的服务出现500系错误以后,发起一次重试 ,可以在gateway的yml配置

          filters:
            - name: Retry
              args:
                retries: 1
                statuses: BAD_GATEWAY,INTERNAL_SERVER_ERROR,SERVICE_UNAVAILABLE
                series: SERVER_ERROR