由于我最近在研究 envoy 這個(gè)項(xiàng)目,這是個(gè)cpp的項(xiàng)目,對(duì)于我這種cpp新人來(lái)說(shuō)還是比較有壓力的,感覺(jué)處處都是坑,開(kāi)個(gè)引導(dǎo)文章記錄一下。
如果要研究 envoy 項(xiàng)目源碼,那肯定是需要代碼跳轉(zhuǎn)的,但是如果用 clion 打開(kāi),那么你會(huì)發(fā)現(xiàn) envoy 是用bazel 構(gòu)建的,沒(méi)有.txt無(wú)法跳轉(zhuǎn),bazel- 這個(gè)工具也已經(jīng)幾年都沒(méi)迭代了,根本用不了。所以按照官方推薦的使用 來(lái)進(jìn)行構(gòu)建開(kāi)發(fā)。
在 envoy 這個(gè)項(xiàng)目里面,由于運(yùn)行環(huán)境是基于的環(huán)境跑的,所以提供了 這種模式給我們開(kāi)發(fā)者進(jìn)行開(kāi)發(fā)調(diào)試。
看了一下 envoy 的開(kāi)發(fā)文檔,感覺(jué)貌似使用起來(lái)是很簡(jiǎn)單的,但是有些地方踩坑也讓我浪費(fèi)了不少時(shí)間。
開(kāi)發(fā)環(huán)境的構(gòu)建創(chuàng)建 dev 環(huán)境
首先,我們需要在我們的機(jī)器上安裝好 ,然后用打開(kāi)我們的envoy項(xiàng)目,打開(kāi) envoy/./.json 文件,這個(gè)時(shí)候 會(huì)彈出如下提示:
然后我們點(diǎn)擊 in 即可加載構(gòu)建 開(kāi)發(fā)環(huán)境。但是有些小伙伴說(shuō),不小心把這個(gè)提示關(guān)了,怎么手動(dòng)打開(kāi)呢?
在mac里我們可以按下:+shift+p,然后輸入 :
生成相應(yīng)的依賴文件
然后進(jìn)入到容器內(nèi)部之后,需要 ,也就是運(yùn)行 tools//.sh腳本,這個(gè)腳本會(huì)幫我們生成代碼完成的所有依賴項(xiàng),例如 生成的代碼、外部依賴項(xiàng)。
但是直接運(yùn)行的話,會(huì)報(bào)錯(cuò):
然后我去看官方文檔 - ,文檔里面和我說(shuō)一般需要把.json 的里面的 設(shè)置為 root, 然后我又重新構(gòu)建了幾次,都是直接卡死,原因不明。
然后我跑到宿主機(jī)給 這個(gè)用戶加權(quán)限,結(jié)果是找不到這個(gè)用戶。后面我幡然醒悟,這個(gè)權(quán)限命令應(yīng)該在容器內(nèi)部執(zhí)行才可以:
#?這個(gè)命令需要在容器內(nèi)部執(zhí)行
sudo?chown?-R?vscode?/workspaces
然后再運(yùn)行 tools//.sh腳本vs 調(diào)試 找不到dll,ok了vs 調(diào)試 找不到dll,沒(méi)有報(bào)錯(cuò)。然后檢查生成的 .json文件也沒(méi)有問(wèn)題。
我們?cè)贆z查一下代碼可以正常跳轉(zhuǎn),并且沒(méi)有報(bào)錯(cuò)了。
開(kāi)發(fā)環(huán)境進(jìn)行envoy調(diào)試
當(dāng)然,除了讓我們的開(kāi)發(fā)環(huán)境的代碼能夠跳轉(zhuǎn)其實(shí)還不夠,最好是可以進(jìn)行代碼的調(diào)試,下面我們就看看怎么調(diào)試 envoy。
配置一個(gè)demo yaml
在代碼的 下面其實(shí)有很多 yaml 模板,可以隨便拿一個(gè)出來(lái)放到envoy根目錄下面,我這里也給一個(gè) yaml 例子:
admin:
??access_log_path:?/tmp/admin_access.log
??address:
????socket_address:
??????protocol:?TCP
??????address:?0.0.0.0
??????port_value:?9901
static_resources:
??listeners:
??-?name:?listener_0
????address:
??????socket_address:
????????protocol:?TCP
????????address:?0.0.0.0
????????port_value:?10001
????filter_chains:
????-?filters:
??????-?name:?envoy.filters.network.http_connection_manager
????????typed_config:
??????????"@type":?type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
??????????scheme_header_transformation:
????????????scheme_to_overwrite:?https
??????????stat_prefix:?ingress_http
??????????route_config:
????????????name:?local_route
????????????virtual_hosts:
????????????-?name:?local_service
??????????????domains:?["*"]
??????????????routes:
??????????????-?match:
??????????????????prefix:?"/"
????????????????route:
??????????????????host_rewrite_literal:?www.envoyproxy.io
??????????????????cluster:?service_envoyproxy_io
??????????http_filters:
??????????-?name:?envoy.filters.http.router
??clusters:
??-?name:?service_envoyproxy_io
????connect_timeout:?30s
????type:?LOGICAL_DNS
????#?Comment?out?the?following?line?to?test?on?v6?networks
????dns_lookup_family:?V4_ONLY
????lb_policy:?ROUND_ROBIN
????load_assignment:
??????cluster_name:?service_envoyproxy_io
??????endpoints:
??????-?lb_endpoints:
????????-?endpoint:
????????????address:
??????????????socket_address:
????????????????address:?www.envoyproxy.io
????????????????port_value:?443
????transport_socket:
??????name:?envoy.transport_sockets.tls
??????typed_config:
????????"@type":?type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
????????sni:?www.envoyproxy.io
生成 調(diào)試文件
在根目錄下運(yùn)行下面命令:
tools/vscode/generate_debug_config.py?//source/exe:envoy-static?--args?"-c?envoy.yaml"
上面 --args 參數(shù)里面填的就是我們上面的 yaml 文件,這個(gè)編譯等待的過(guò)程是十分漫長(zhǎng)的,我 8C16G 的機(jī)器差不多花了我1個(gè)小時(shí)才弄好。
運(yùn)行好之后,可以看到幫我們生成好了 .json 文件:
調(diào)試
然后我們按 F5 發(fā)現(xiàn)可以進(jìn)入到我們的 mian 函數(shù)的斷點(diǎn)中,沒(méi)有什么問(wèn)題:
到此為止,我們的 envoy 開(kāi)發(fā)調(diào)試為一體的集成環(huán)境就打造好了,小伙伴們可以快樂(lè)的閱讀源碼了。
原文鏈接: