Service chain背景:
帶在請求的header上的信息,用來標記當前請求所屬環(huán)境。支持Dubbo,消息隊列,Rest。
比如A調(diào)用B,如果A,B都在環(huán)境1中,那么走環(huán)境1中的A,B實例。如果環(huán)境1中沒有B實例,走基礎環(huán)境的B實例,以此來做環(huán)境隔離。
prj環(huán)境:
相互隔離的項目環(huán)境。
StockCenter、trade-core:應用名稱。
etcd:注冊中心,類似Zookeeper。
sc-context:存儲Service chain上下文。
初步現(xiàn)象:ZanProxy配置prj環(huán)境,prj環(huán)境StockCenter部署成功,扣減一直走到StockCenter的基礎環(huán)境。
初步診斷:
1. StockCenter扣減的請求走到了基礎環(huán)境。
2. 懷疑是Service Chain標識中途丟失,查看StockCenter扣減日志,確實沒有prj的標。其他環(huán)境過來的請求是有prj的標的。
3. 通過調(diào)用鏈排查,在扣減之前的調(diào)用鏈是完整的,到trade-core調(diào)用StockCenter調(diào)用鏈丟失。調(diào)用鏈丟失的問題是另外一個問題。
4. debug prj環(huán)境的trade-core,可以走到,說明到trade-code是正常的,問題出現(xiàn)trade-code調(diào)用StockCenter。
5. 查看etcd接口注冊信息,發(fā)現(xiàn)StockCenter扣減接口注冊正常,排除接口注冊問題。
進階診斷:
1. 找框組同學排查,走遠程debug trade-core排查.
2. 遠程debug效率較低,先通過調(diào)用鏈找線索。
3. trade-core鏈路中沒有異步邏輯,排除異步造成的sc-context丟失。
3. trade-core在調(diào)用StockCenter之前有一系列的調(diào)用,在進行了有贊云調(diào)用之后,sc-context信息丟失,懷疑這一步出現(xiàn)問題。
4. 使用抓包工具到prj環(huán)境的trade-core中進行抓包,定位到修改sc-context的代碼位置。
5. 打開有贊云相應類源碼,發(fā)現(xiàn)確實有讀取sc-context進行修改的操作,并且丟失了部分信息。
解決:
1. 找到有贊云同學,修改代碼,重新打包并發(fā)布了trade-core,問題解決。
總結(jié):
1. 一開始就應該懷疑是Service Chain問題,定位sc-context丟失的地方。
2. 抓包工具要學好,看框架組排查問題效率很高。