三个 case,分工明确,一个用来拿服务输出的结果并计算,一个用来做最终的完成输出,一个是超时输出。
同时我们将这个循环监听,也作为协程运行。
至此,所有的主要代码都完成了。下面是完全版
package main
import (
"context"
"fmt"
"net/http"
"sync"
"time"
"github.com/gin-gonic/gin"
)
// 一个请求会触发调用三个服务,每个服务输出一个 int,
// 请求要求结果为三个服务输出 int 之和
// 请求返回时间不超过3秒,大于3秒只输出已经获得的 int 之和
func calHandler(c *gin.Context) {
var resContainer, sum int
var success, resChan = make(chan int), make(chan int, 3)
ctx, _ := context.WithTimeout(c, 3*time.Second)
go func() {
for {
select {
case resContainer = <-resChan:
sum += resContainer
fmt.Println("add", resContainer)
case <- success:
fmt.Println("result:", sum)
return
case <- ctx.Done():
fmt.Println("result:", sum)
return
}
}
}()
wg := sync.WaitGroup{}
wg.Add(3)
go func() {
resChan <- microService1()
wg.Done()
}()
go func() {
resChan <- microService2()
wg.Done()
}()
go func() {
resChan <- microService3()
wg.Done()
}()
wg.Wait()
success <- 1
return
}
func main() {
r := gin.New()
r.GET("/calculate", calHandler)
http.ListenAndServe(":8008", r)
}
func microService1() int {
time.Sleep(1*time.Second)
return 1
}
func microService2() int {
time.Sleep(2*time.Second)
return 2
}
func microService3() int {
time.Sleep(10*time.Second)
return 3
}
上面的程序只是简单描述了一个调用其他微服务超时的处理场景。
实际过程中还需要加很多很多调料,才能保证接口的对外完整性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。









