timeout

2024-02-23 199点热度 0人点赞 0条评论

超时是一种机制,使程序在指定时间内完成操作,以防止永久阻塞或请求超时。设置超时可以确保程序在预定时间内返回结果或执行下一步操作。过长的超时可能导致用户等待过久,而过短的超时可能导致程序未能完成必要的操作。

linux 设置超时时间

如不熟悉 linux ,慎重操作。(可忽略)

# 在Linux系统中,可以通过修改以下几个内核参数来设置TCP连接超时时间:

#1. tcp_syn_retries:指定连接建立超时时间,默认值为5,即最多等待5次SYN响应,每次等待时间为2秒。
#可以使用以下命令查看当前值:cat /proc/sys/net/ipv4/tcp_syn_retries
#可以使用以下命令修改当前值:echo 3 > /proc/sys/net/ipv4/tcp_syn_retries

#2. tcp_fin_timeout:指定连接关闭超时时间,默认值为60秒。
#可以使用以下命令查看当前值:cat /proc/sys/net/ipv4/tcp_fin_timeout
#可以使用以下命令修改当前值:echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

#3. tcp_keepalive_time:指定TCP连接的空闲超时时间,默认值为7200秒。
#可以使用以下命令查看当前值:cat /proc/sys/net/ipv4/tcp_keepalive_time
#可以使用以下命令修改当前值:echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time

# 修改重试n次 配置
vim /etc/sysctl.conf   # 编辑 
net.ipv4.tcp_syn_retries = 6 # (针对于ipv4) 次数是6 表示6*21 即 timeout是127秒;同理 =4 => timeout是31秒。
sysctl -p /etc/sysctl.conf  # 加载设置(-p后如果不跟文件名,默认从 /etc/sysctl.conf文件加载)

nginx 设置超时时间

如不熟悉 nginx ,慎重操作。(可忽略)


# nginx 超时时间设置
# 1.修改nginx配置文件
vim /etc/nginx/nginx.conf
# 2.修改超时时间 demo
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;

# 在location中设置即可 demo:
proxy_connect_timeout 60; # 连接到主机超时时间,单位秒
proxy_read_timeout 300; # 从主机读取数据超时时间,单位秒

# 3.重启nginx
nginx -t
nginx -s reload

java 设置超时时间

springBoot 3.1.0 设置当前服务 http接口超时时间. ps:jdk21可以使用虚拟线程

@Slf4j
@Aspect
@Component
@Order(1)
public class TimeoutAspect {

    /**
     * 自行 初始化一个线程池
     */
    @Resource(name = "threadPoolTaskExecutor")
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Pointcut("execution(public * com.xxx.web.controller..*.*(..))")
    private void aspectController() {
    }

    @Around("aspectController()")
    public Object controllerLog(ProceedingJoinPoint pjp) throws Throwable {
        final Future<Object> future = threadPoolTaskExecutor.submit(() -> {
            try {
                return pjp.proceed();
            } catch (Throwable throwable) {
                throw new RuntimeException(throwable);
            }
        });
        //为了自测方便 设置超时时间 为 1秒
        try {
            return future.get(1, TimeUnit.SECONDS);
        } catch (TimeoutException e) {
            return Response.responeCodeMes(HttpStatus.REQUEST_TIMEOUT.value(), "service timeout");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

springBoot 3.1.0 使用 HttpClient 请求其他接口

import java.net.http.HttpClient;
HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10))

springBoot 3.1.0 使用 RestTemplate 请求其他接口

import org.springframework.web.client.RestTemplate;
@Bean(name = "restTemplate")
@ConditionalOnMissingBean(name = {"restTemplate"})
public RestTemplate restTemplate() {
    RestTemplate restTemplate = restTemplateBuilder
            //连接超时为10秒
            .setConnectTimeout(Duration.ofSeconds(10))
            //请求超时为10秒
            .setReadTimeout(Duration.ofSeconds(10))
            .build();
    return restTemplate;
}

java 中Grpc 设置超时时间。 (stub 为 proto文件生成的代理类)

# java 中Grpc 设置超时时间。 (stub 为 proto文件生成的代理类)
stub.withDeadlineAfter(10, TimeUnit.SECONDS)

golang 设置超时时间

echo 接口设置超时时间

# echo 接口设置超时时间
//timeout
    e.Use(mdl.TimeoutWithConfig(mdl.TimeoutConfig{
        Skipper:                    mdl.DefaultSkipper,
        ErrorMessage:               "{\"code\":408,\"msg\":\"service timeout\"}",
        OnTimeoutRouteErrorHandler: func(err error, c echo.Context) {},
        Timeout:                    10 * time.Second,
    }))

gin 接口设置超时时间

import (
    "github.com/gin-contrib/timeout"
    "github.com/gin-gonic/gin"
)
r := gin.New()
r.Use(Timeout())

func Timeout() gin.HandlerFunc {
    return timeout.New(
        //超时时间
        timeout.WithTimeout(common.TimeoutSecond),

        timeout.WithHandler(func(c *gin.Context) {
            c.Next()
        }),

        timeout.WithResponse(func(context *gin.Context) {
            context.JSON(http.StatusOK, map[string]interface{}{
                "code": http.StatusRequestTimeout,
                "msg":  "service timeout",
            })
        }),
    )
}

golang 中Grpc 设置超时时间。

    //超时设置
    ctx, cancel := context.WithTimeout(context.Background(),10 * time.Second)
    defer cancel()
    //执行
    res, err := *BaseServiceClient.Execute(ctx, req)
    if err != nil {
        var errRes fb_pb.ByteResult
        errRes.Code = -1
        errRes.Msg = err.Error()

        //获取错误状态
        errState, ok := status.FromError(err)
        //判断是否为调用超时
        if ok && errState.Code() == codes.DeadlineExceeded {
            errRes.Code = http.StatusRequestTimeout
            errRes.Msg = "System timeout"
        }

        return &errRes
    }

    return res

mylomen

本人从事 JAVA 开发10多年,将之前整理的笔记分享出来,希望能够帮助到努力的你。

文章评论