download:基于SpringCloud+Kubernetes ,微服务的容器化持续交付实战
目前微服务和容器是业界很火的技术。此课程是专注于微服务的容器化持续交付实战课程。通过课程,你不仅可以理解Spring Cloud的基础,还能掌握微服务的搭建,持续集成,持续测试,持续部署,深入理解容器化的实现原理,学会用Helm Chart把多个微服务一键部署到Kubernetes。获得普通开发者蜕变为全栈架构师的核心技能。
适合人群
具备有1年以上Java开发经验
希望晋升为架构师的开发者 / DevOps 工程师
技术储备要求
Java语言基础, 有Jenkins,Kubernetes经验更佳
func AsyncAdd(run func() error) {
//TODO: 扔進異步協程池
go run()
}
func GetInstance(ctx context.Context,id uint64) (string, error) {
data,err := GetFromRedis(ctx,id)
if err != nil && err != redis.Nil{
return "", err
}
// 沒有找到數據
if err == redis.Nil {
data,err = GetFromDB(ctx,id)
if err != nil{
return "", err
}
AsyncAdd(func() error{
return UpdateCache(ctx,id,data)
})
}
return data,nil
}
func GetFromRedis(ctx context.Context,id uint64) (string,error) {
// TODO: 從redis獲取信息
return "",nil
}
func GetFromDB(ctx context.Context,id uint64) (string,error) {
// TODO: 從DB中獲取信息
return "",nil
}
func UpdateCache(ctx context.Context,id interface{},data string) error {
// TODO:更新緩存信息
return nil
}
func main() {
ctx,cancel := context.WithTimeout(context.Background(), 3 * time.Second)
defer cancel()
_,err := GetInstance(ctx,2021)
if err != nil{
return
}
}
剖析
我們先简單剖析一下,這一段代码要幹什麼?其實很简單,我們想要獲取一段信息,首先會從緩存中獲取,假如緩存中獲取不到,我們就從DB中獲取,從DB中獲取到信息後,在協程池中放入更新緩存的辦法,異步去更新緩存。整個設計是不是很圆滿,但是在實践工作中,異步更新緩存就沒有勝利過?
招致失敗的缘由就在這一段代码:
AsyncAdd(func() error{
return UpdateCache(ctx,id,data)
})
錯誤的缘由只要一個,就是這個ctx,假如改成這樣,就啥事沒有了。
AsyncAdd(func() error{
ctxAsync,cancel := context.WithTimeout(context.Background(),3 * time.Second)
defer cancel()
return UpdateCache(ctxAsync,id,data)
})