新聞中心
在 HTTP 請求中,我們發(fā)送請求的時候,可以設(shè)置一個請求超時時間-connectTimeout,即在指定的時間內(nèi),如果請求沒有到達(dá)服務(wù)端,為了避免客戶端一直進(jìn)行不必要的等待,就會拋出一個請求超時異常。

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)十多年經(jīng)驗(yàn)成就非凡,專業(yè)從事成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)頁制作,軟文推廣,一元廣告等。十多年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:028-86922220,我們期待您的來電!
但是在微服務(wù)系統(tǒng)中,我們卻很少設(shè)置請求超時時間,一般都是用另外一個概念代替,那就是請求截止時間。
這是什么原因呢?今天我們就來簡單聊一聊這個話題。
在微服務(wù)中我們客戶端的請求在服務(wù)端往往會有比較復(fù)雜的鏈條,我想起來 Spring Cloud Sleuth 官方給的一個請求鏈路追蹤的圖,我們直接拿來看下:
這張圖中,請求從客戶端發(fā)起之后,在服務(wù)端一共經(jīng)歷了四個 SERVICE,對于這樣的請求,如果我們還是按照之前發(fā)送普通 HTTP 請求的方式,設(shè)置一個 connectTimeout 顯然是不夠的。
我舉個例子:
假設(shè)我們發(fā)送一個請求,為該請求設(shè)置 connectTimeout 為 5s,那么這個時間只對第一個服務(wù) SERVICE1 有效,也就是請求在 5s 之內(nèi)沒有到達(dá) SERVICE1,那么就會拋出連接超時異常;請求如果在 5s 之內(nèi)到達(dá) SERVICE1,那么就不會拋出異常,但是?。。?,請求到達(dá) SERVICE1 并不意味著請求結(jié)束,后面從 SERVICE1 到 SERVICE2,從 SERVICE2 到 SERVICE3,從 SERVICE3 到 SERVICE4,還有四個 HTTP 請求待處理,這些請求超時了怎么辦?很明顯,connectTimeout 屬性對于后面幾個請求就鞭長莫及了。
所以,對于這種場景,我們一般使用截止時間來處理。
截止時間相當(dāng)于設(shè)置整個請求生命周期的時間,也就是這個請求,我要多久拿到結(jié)果。很明顯,這個時間應(yīng)該在客戶端發(fā)起請求的時候設(shè)置。
gRPC 中提供了對應(yīng)的方法,我們可以非常方便的設(shè)置請求的截止時間 DeadLineTime,如下:
public class LoginClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
LoginServiceGrpc.LoginServiceStub stub = LoginServiceGrpc.newStub(channel).withDeadline(Deadline.after(3, TimeUnit.SECONDS));
login(stub);
}
private static void login(LoginServiceGrpc.LoginServiceStub stub) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
stub.login(LoginBody.newBuilder().setUsername("javaboy").setPassword("123").build(), new StreamObserver() {
@Override
public void onNext(LoginResponse loginResponse) {
System.out.println("loginResponse.getToken() = " + loginResponse.getToken());
}
@Override
public void onError(Throwable throwable) {
System.out.println("throwable = " + throwable);
}
@Override
public void onCompleted() {
countDownLatch.countDown();
}
});
countDownLatch.await();
}
} 服務(wù)端通過 Thread.sleep 做個簡單的休眠就行了,超時之后,客戶端的 onError 方法會被觸發(fā),拋出如下異常:
throwable = io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: deadline exceeded after 2.939621462s. [closed=[], open=[[buffered_nanos=285550823, remote_addr=localhost/127.0.0.1:50051]]]
好啦,一個簡單的小細(xì)節(jié),感興趣的小伙伴不妨去試試?yán)病?/p>
當(dāng)前文章:gRPC為什么使用截止時間而不是超時時間?
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/dhhcgoo.html


咨詢
建站咨詢
