当你使用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
本文由 转啊转 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2023/03/09 15:57