成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 微服務框架 go-micro 使用客戶端 RPC 調用服務端方法返回 408 怎么解決?

開發 前端
本文我們介紹怎么解決客戶端 RPC 調用服務端的方法,返回錯誤碼 408 的問題,我們使用 go-micro 和 gin 構建了示例代碼,并通過修改示例代碼,分析出現返回錯誤碼 408 問題的原因。

1、介紹

本文我們使用 go-micro 構建微服務的服務端和客戶端,并使用 gin 集成客戶端構建 HTTP Api,在代碼中模擬客戶端 RPC 調用服務端方法返回 408 的問題,以及怎么解決?

客戶端輸出日志:

{"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}

2、使用 go-micro 構建服務端和客戶端

關于 proto 和 consul 的相關內容,不是本文的重點,將不再贅述,感興趣的讀者朋友們可以查閱公眾號的歷史文章。

創建服務端服務的代碼:

func main() {
registry := consul.NewRegistry(func(options *registry.Options) {
options.Addrs = []string{"127.0.0.1:8500"}
options.Timeout = 5 * time.Second
})
// create a new service
service := grpc.NewService(
micro.Name("go.micro.srv.user"),
micro.Registry(registry),
)
// handler
user.RegisterUserHandler(service.Server(), new(user_handler.User))
// initialise flags
service.Init()
// start the service
service.Run()
}

服務端方法:

type User struct{}

func (u *User) Login(ctx context.Context, req *user.LoginRequest, rsp *user.LoginResponse) error {
time.Sleep(10 * time.Second) // 模擬超時響應
rsp.Username = "Welcome " + req.Email
return nil
}

客戶端代碼:

func main() {
r := NewRouter()
server := &http.Server{
Addr: ":8080",
Handler: r,
ReadTimeout: time.Second * 20,
WriteTimeout: time.Second * 20,
MaxHeaderBytes: 1 << 20,
}
if err := server.ListenAndServe(); err != nil {
log.Fatal(err)
}
}

// 省略 User.Login 相關代碼

func NewRouter() *gin.Engine {
r := gin.New()
userHandler := new(User)
r.GET("/login", userHandler.Login)
return r
}

func NewClient() user.UserService {
registry := consul.NewRegistry(func(options *registry.Options) {
options.Addrs = []string{"127.0.0.1:8500"}
options.Timeout = 5 * time.Second
})
client := grpc.NewClient(
client.DialTimeout(15*time.Second),
client.RequestTimeout(15*time.Second),
client.Registry(registry),
)
userClient := user.NewUserService("go.micro.srv.user", client)
return userClient
}

分別啟動服務端和客戶端, 然后使用 curl 請求 Api:

?  /Users/frank curl http://127.0.0.1:8080/login
{"data":"Welcome gopher@88.com"}%

閱讀上面的運行結果,可以發現我們構建的服務端和客戶端運行正常。

3、模擬返回 408 的問題

我們在服務端的方法中使用 time.Sleep(10 * time.Second) 模擬延長響應時長,我們修改客戶端代碼,將客戶端超時時間也設置為 10s。

修改客戶端代碼:

client.DialTimeout(10*time.Second),
client.RequestTimeout(10*time.Second),

閱讀上面這段代碼,我們將客戶端超時時間改為 10s,然后重啟客戶端應用,使用 curl 請求 Api:

/Users/frank curl http://127.0.0.1:8080/login

運行 curl,沒有返回響應結果,我們查看客戶端的日志發現:

{"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}

原因是服務端方法中,我們在代碼中使用 time.Sleep(10 * time.Second) 模擬響應需要 10s,而在客戶端中,我們定義的客戶端超時時間由原來的 15s 改為 10s,所以導致返回 408 的問題。

需要注意的是,go-micro 中 client 的默認超時時間是 5s。

4、解決方法

我們在了解完問題出現的原因之后,聰明的讀者朋友們可能已經有了解決問題的方法。

解決該問題,有兩種解決方法,第一種是修改 client 的超時時間,延長超時時間至足夠接收到響應結果的時長,但是需要注意的是,http server 的讀寫時間也要滿足可以接收到響應結果的時長,本文我們設置為 20s,如下所示:

server := &http.Server{
Addr: ":8080",
Handler: r,
ReadTimeout: time.Second * 20,
WriteTimeout: time.Second * 20,
MaxHeaderBytes: 1 << 20,
}

而且還需要注意其上下游服務之間的超時時間,避免出現雪崩等問題。

第二種是優化服務端方法的響應時間,將其響應時間縮短至客戶端的超時時間以內。具體如何優化,要根據實際情況決定,比如是否因為數據庫讀寫耗時太長,代碼的時間復雜度太高等。

5、總結

本文我們介紹怎么解決客戶端 RPC 調用服務端的方法,返回錯誤碼 408 的問題,我們使用 go-micro 和 gin 構建了示例代碼,并通過修改示例代碼,分析出現返回錯誤碼 408 問題的原因。

讀者朋友們在遇到該問題時,建議優先采用第二種方法解決,如果使用第一種方法,需要特別注意避免分布式系統的雪崩問題。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2021-07-26 11:19:43

微服務開發技術

2021-10-19 08:58:48

Java 語言 Java 基礎

2024-01-02 12:17:44

Go傳統遠程

2024-03-06 14:58:52

客戶端微服務架構

2025-01-13 00:00:07

Go語言微服務

2015-01-13 10:32:23

RestfulWeb框架

2025-01-20 00:10:00

Go語言Kratos

2023-04-03 08:13:05

MySQLCtrl + C

2009-08-21 16:14:52

服務端與客戶端通信

2011-09-09 09:44:23

WCF

2009-08-21 15:59:22

服務端與客戶端通信

2024-12-23 00:22:55

2009-08-21 15:36:41

服務端與客戶端

2009-08-21 15:54:40

服務端與客戶端

2010-03-18 17:47:07

Java 多客戶端通信

2023-03-06 08:01:56

MySQLCtrl + C

2021-10-14 08:39:17

Java Netty Java 基礎

2022-03-22 09:22:21

Go kitgRPC網絡傳輸

2021-01-14 09:55:21

Java微服務Go

2018-05-08 16:33:31

中間件RPC企業
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品乱码一区二三区小蝌蚪 | 欧美又大粗又爽又黄大片视频 | wwwsihu| 国产精品久久久久一区二区三区 | 精品二| 久久99精品久久久久久 | 中文字幕视频一区 | 亚洲精品日韩精品 | 欧美性猛交一区二区三区精品 | 亚洲国产成人久久综合一区,久久久国产99 | 精品亚洲二区 | 国产综合久久 | 亚洲成人一区 | 99在线视频观看 | 日韩精品在线免费观看 | 91精品国产91久久久 | 免费一区二区三区在线视频 | 亚洲一区亚洲二区 | 亚洲国产精久久久久久久 | 在线观看国产wwwa级羞羞视频 | 亚洲精品小视频在线观看 | 国产真实精品久久二三区 | av一区二区三区四区 | 伊人久操| 中文在线视频 | 日韩在线视频播放 | 看av网址 | 国产精品久久九九 | 成人精品鲁一区一区二区 | 中文字幕欧美一区 | 成人性视频免费网站 | 中文字幕1区2区 | 国产欧美精品一区二区三区 | 午夜免费福利影院 | 欧美日韩国产免费 | 中文字幕一区二区三区日韩精品 | 国产一区二区av | 久久精品亚洲精品国产欧美 | 国产区在线免费观看 | www成人免费视频 | 国产午夜三级一区二区三 |