Shell腳本實(shí)戰(zhàn):Consul 服務(wù)注冊(cè)和注銷(xiāo)的最佳實(shí)踐
業(yè)務(wù)爸爸需求: 寫(xiě)一個(gè)腳本用于向 Consul 注冊(cè)或注銷(xiāo)服務(wù)。
(資料圖片僅供參考)
Consul API 實(shí)現(xiàn)服務(wù)的注冊(cè)和注銷(xiāo)功能
拿到這個(gè)需求,我第一時(shí)間想到是用 curl 調(diào)用 Consul API 實(shí)現(xiàn)服務(wù)的注冊(cè)和注銷(xiāo)功能。 如下:
#!/bin/bashCONSUL_TOKEN="<your_token_here>"CONSUL_URL="http://localhost:8500"function?register_service?{??curl?\????--request?PUT?\????--header?"Content-Type:?application/json"?\????--header?"X-Consul-Token:?${CONSUL_TOKEN}"?\????--data?"@-?${CONSUL_URL}/v1/agent/service/register"?<<EOF{??"ID":?"${1}",??"Name":?"${2}",??"Address":?"${3}",??"Port":?${4}}EOF}function?deregister_service?{??curl?\????--request?PUT?\????--header?"X-Consul-Token:?${CONSUL_TOKEN}"?\????"${CONSUL_URL}/v1/agent/service/deregister/${1}"}#?example?usageregister_service?"my-service"?"My?Service"?"localhost"?8080deregister_service?"my-service"
在這個(gè)實(shí)現(xiàn)中,我們將認(rèn)證token存儲(chǔ)在CONSUL_TOKEN變量中,并在curl請(qǐng)求中使用--header "X-Consul-Token: ${CONSUL_TOKEN}"來(lái)添加它。
這個(gè)是可以實(shí)現(xiàn)業(yè)務(wù)爸爸的需求, 但是,這種實(shí)現(xiàn)有以下幾個(gè)問(wèn)題:
1.?不能批量添加相同的類(lèi)型的指標(biāo)。
2.?唯一ID需要手動(dòng)維護(hù)。
3.?沒(méi)有配置文件留底,雖然三節(jié)點(diǎn)的consul集群很小概率同時(shí)出問(wèn)題, 但是有留底還是一個(gè)很好習(xí)慣。
基于這個(gè)幾個(gè)點(diǎn), 寫(xiě)入下面實(shí)現(xiàn)腳本。
register 和 deregister實(shí)現(xiàn)
#!/bin/bash#?author?小毛驢#?SHELL_DIR=$(cd?$(dirname?$0);pwd)BACKUP_DIR=${SHELL_DIR}"/consulbackup"SOURCEFILE=${SHELL_DIR}"/origin.json"LOGFILE=${SHELL_DIR}"/add.log"BASESVCRIR=/data/consul/config/TOKENFILE=/data/consul/consul_token.yaml?OPTION=${OPTION:="1"}ENV=${ENV:="prod"}PROJECT=${PROJECT:="fb"}MODULE=${MODULE:="api"}SERVICENAME=${SERVICENAME:="node-exporter"}NAME=${NAME:="core"}TAG=${TAG:="node-exporter"}IPADDRS=""IPADDR=""PORT=${PORT:="9520"}LEGAL_IP="^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"if?[?!?-e?"${BACKUP_DIR}"?];then????mkdir?-p?${BACKUP_DIR}fifunction?usage(){????????echo?-e?"\nUsage:?$0?<option>?<value>"????????echo?-e?"\n?option:"????????echo?-e?"\n?-o,--option????option?name,?default?1:add?,?2:delete"????????echo?-e?"\n?-e,--env???????env?name,?default?prod"????????echo?-e?"\n?-p,--project???project?name,?default?fb"????????echo?-e?"\n?-m,--module????module?name,?default?api"????????echo?-e?"\n?-n,--name??????api?name,?default?core"????????echo?-e?"\n?-s,--svcname???serviceName?name,?default?node-exporter"????????echo?-e?"\n?-t,--tag???????tag?name,?default?node-exporter"????????echo?-e?"\n?-a,--address???ip?address,?eg?1.1.1.1|2.2.2.2?default?''?[Require]"????????echo?-e?"\n?-i,--interface?interface?num?default?9520"????????echo?-e?"\n?-h,--help??????help"}function?checkIp(){????#正則表達(dá)式檢驗(yàn)?ip?地址????[[??$1?=~?$LEGAL_IP?]]????if?[?$??-gt?0?];?then????????echo?"$1?is?an?error?ip?fromat"????????exit?10????fi}function?svcDeregister()?{????if?[?!?-e?"$1"?];then????????echo?"$1?not?exit,?please?check!"????else????????/bin/consul?services?deregister??-token-file=${TOKENFILE}??$1????fi}function?svcRegister()?{????if?[?!?-e?"$1"?];then????????echo?"$1?not?exit,?please?check!"????else????????/bin/consul?services?register??-token-file=${TOKENFILE}?$1????fi}function?genJson()?{cat?>?"${SERVICENAME}-${ENV}-${PROJECT}-${MODULE}-${NAME}-${IPADDR}.json"?<<EOF{??"service":?{????"id":?"${SERVICENAME}-${ENV}-${PROJECT}-${MODULE}-${NAME}-${IPADDR}",????"name":?"${SERVICENAME}",????"tags":?[???????"${TAG}"????],????"address":?"${IPADDR}",????"port":?${PORT},????"meta":?{??????"name":?"${NAME}-${IPADDR}",??????"module":?"${MODULE}",??????"project":?"${PROJECT}",??????"env":?"${ENV}"????},????"check":?{??????"http":?"http://${IPADDR}:${PORT}/metrics",??????"interval":?"10s"????},????"weights":?{??????"passing":?10,??????"warning":?1????}??}}EOF}function?removeJson()?{????mv?"${SERVICENAME}-${ENV}-${PROJECT}-${MODULE}-${NAME}-${IPADDR}.json"??${BACKUP_DIR}}function?main()?{????if?(($#?==?0));then????????usage????????exit????fi????cd?${SHELL_DIR}????while?[?-n?"$1"?];do????????case?$1?in?????????-o|--option?)????????????OPTION=$2????????????shift????????????;;????????-e|--env?)????????????ENV=$2????????????shift????????????;;????????-p|--project?)????????????PROJECT=$2????????????shift????????????;;????????-m|--module??)????????????MODULE=$2????????????shift????????????;;????????-n|--name?)????????????NAME=$2????????????shift????????????;;????????-s|--svcname?)????????????SERVICENAME=$2????????????shift????????????;;????????-t|--tag?)????????????TAG=$2????????????shift????????????;;????????-a|--address?)????????????IPADDRS=$2????????????shift????????????;;????????-i|--interface?)????????????PORT=$2????????????shift????????????;;????????-h|--help?)????????????usage????????????exit????????????;;????????*)????????????echo?-e?"\n$1?unknow?an?option"????????????usage????????????exit????????esac????????shift?????done????if?[?"${IPADDRS}"x?==?""x?];then????????echo?-e?"\n-a|--address?option?is?Require"????????usage????????exit????fi????SVCRIR="${BASESVCRIR}/${SERVICENAME}"????if?[?!?-e?"${SVCRIR}"?];then????????mkdir?-p?${SVCRIR}????fi????cd?${SVCRIR}????hosts=($(echo?${IPADDRS}?|?sed?'s/|/?/g'))????for((?i=0;i<${#hosts[@]};i++))?????do????????echo?${hosts[$i]}????????checkIp?${hosts[$i]}????????IPADDR="${hosts[$i]}"????????if?[[?"${OPTION}"x?==?"1"x??]];?then????????????genJson????????????#statements????????????svcRegister?"${SERVICENAME}-${ENV}-${PROJECT}-${MODULE}-${NAME}-${IPADDR}.json"?????????fi????????if?[[?"${OPTION}"x?==?"2"x??]];?then????????????#statements????????????svcDeregister?"${SERVICENAME}-${ENV}-${PROJECT}-${MODULE}-${NAME}-${IPADDR}.json"?????????????removeJson????????fi????done?}main?$@
這個(gè)腳本首先定義了BACKUP_DIR,BASESVCRIR 和TOKENFILE 等路徑。
用法
./register-service.sh?[OPTIONS]
參數(shù)-h,?--help:?顯示幫助信息并退出。-o,?-option:?1?register?;?2?deregister-e,--env???????環(huán)境標(biāo)識(shí),?default?prod-p,--project??項(xiàng)目名字,?default?fb-m,--module???業(yè)務(wù)模塊名,?default?api-n,--name??????模塊下面的應(yīng)用名,?default?core-s,--svcname???service?名字,?default?node-exporter-t,--tag???????tag?名字,?default?node-exporter-a,--address???需要注冊(cè)到該服務(wù)的地址,多個(gè)以“|”分開(kāi),,?eg?1.1.1.1|2.2.2.2?default?''?[Require],必須提供-i,--interface??需要注冊(cè)的端口?9520
./register-service.sh -o 1 -e prod -p fb -m ops -n consul-ops -s consul_exporter-t consul_exporter -a "10.2.0.6|10.2.0.10|10.2.0.41" -i 9107
標(biāo)簽:
- Shell腳本實(shí)戰(zhàn):Consul 服務(wù)注冊(cè)和
- 95516是什么號(hào)碼? 95516是什么號(hào)碼
- 長(zhǎng)安花菜籽油質(zhì)量怎樣(長(zhǎng)安花)
- 華中師范大學(xué)漢口分校自考_華中師范
- 天天動(dòng)態(tài):廣場(chǎng)地磚材質(zhì)_地磚材質(zhì)
- 高手世家小說(shuō)_高手世家_全球焦點(diǎn)
- A股拉響“披星戴帽”警報(bào)_環(huán)球觀點(diǎn)
- 焦點(diǎn)速遞!看護(hù)“腳下安全” 四川
- 生活大爆炸下載資源_生活大爆炸下載
- 婚假申請(qǐng)書(shū)500字_婚假申請(qǐng)書(shū)-今日精選
- Shell腳本實(shí)戰(zhàn):Consul 服務(wù)注冊(cè)和
- 95516是什么號(hào)碼? 95516是什么號(hào)碼
- 長(zhǎng)安花菜籽油質(zhì)量怎樣(長(zhǎng)安花)
- 臨時(shí)工日結(jié)工在哪里找的(臨時(shí)工日
- 地主之誼怎么高情商回復(fù)(地主之誼
- 當(dāng)前關(guān)注:醉翁亭記表達(dá)了作者怎樣
- 華中師范大學(xué)漢口分校自考_華中師范
- 天天動(dòng)態(tài):廣場(chǎng)地磚材質(zhì)_地磚材質(zhì)
- net framework 4.0安裝不成功_net frame
- 世界球精選!太傻歌詞粵語(yǔ)版_太傻
- 天天觀察:女犯文學(xué)冤獄_女犯文學(xué)警
- 高手世家小說(shuō)_高手世家_全球焦點(diǎn)
- A股拉響“披星戴帽”警報(bào)_環(huán)球觀點(diǎn)
- 村鎮(zhèn)銀行改革重組按下“加速鍵”_實(shí)
- 索辰科技超募是福是禍? 環(huán)球觀察
- 全球短訊!中國(guó)法治政府評(píng)估報(bào)告出
- 焦點(diǎn)速遞!看護(hù)“腳下安全” 四川
- 生活大爆炸下載資源_生活大爆炸下載
- 【全球熱聞】出廠證明是啥_出廠證明
- 建行信用卡年費(fèi)怎么免_建行信用卡年
- 我的老師作文400字五年級(jí)怎么寫(xiě)_我
- 婚假申請(qǐng)書(shū)500字_婚假申請(qǐng)書(shū)-今日精選
- 跨越百億!東鵬飲料以綠色和創(chuàng)新引
- 易小星范丞丞來(lái)蓉路演 《人生路不
- 天天新動(dòng)態(tài):封面開(kāi)講了丨讀蘇東坡
- 《中國(guó)詩(shī)詞大會(huì)》冠軍陳更:蘇軾是
- 當(dāng)前時(shí)訊:初探復(fù)合材料層合和結(jié)構(gòu)
- SPSS數(shù)據(jù)文件的建立—創(chuàng)建與導(dǎo)入方
- 上海首個(gè)大模型產(chǎn)業(yè)發(fā)展研討會(huì)圓滿(mǎn)
- 浩辰給排水自定義管線(xiàn)教程