提到天氣預報服務,咱們第一反應是很簡單的一個服務啊,目前網上有大把的天氣預報 API 能夠直接使用,有必要去使用 Knative 搞一套嗎?殺雞用牛刀?先不要着急,咱們先看一下實際的幾個場景需求:git
從上面的需求,咱們其實發現,要作好一個天氣預報的服務,也面臨內憂(資源緊缺)外患(需求增長),並非那麼簡單的。不過如今更不要着急,咱們可使用 Knative 幫你解決上面的問題。github
關鍵詞:天氣查詢、表格存儲,通道服務,事件通知
web
首先咱們來描述一下咱們要作的天氣服務場景需求:
小程序
有了需求,那咱們就開始如何基於 Knative 實現天氣服務。咱們先看一下總體架構:api
基於內容較多,咱們分上、下兩篇分別進行介紹:服務器
查詢天氣的 API 有不少,這裏咱們選擇高德開放平臺提供的天氣查詢 API,使用簡單、服務穩定,而且該天氣預報 API 天天提供 100000 免費的調用量,支持國內 3500 多個區域的天氣信息查詢。另外高德開放平臺,除了天氣預報,還能夠提供 IP 定位、搜索服務、路徑規劃等,感興趣的也能夠研究一下玩法。微信
登陸高德開放平臺: https://lbs.amap.com, 建立應用,獲取 Key 便可:架構
獲取Key以後,能夠直接經過 url 訪問:https://restapi.amap.com/v3/weather/weatherInfo?city=110101&extensions=all&key= <用戶 key=""> ,返回天氣信息數據以下: 併發
{
"status":"1",
"count":"1",
"info":"OK",
"infocode":"10000",
"forecasts":[
{
"city":"杭州市",
"adcode":"330100",
"province":"浙江",
"reporttime":"2019-09-24 20:49:27",
"casts":[
{
"date":"2019-09-24",
"week":"2",
"dayweather":"晴",
"nightweather":"多雲",
"daytemp":"29",
"nighttemp":"17",
"daywind":"無風向",
"nightwind":"無風向",
"daypower":"≤3",
"nightpower":"≤3"
},
...
]
}
]
}複製代碼
該功能主要實現對接高德開放平臺天氣預報 API, 獲取天氣預報信息,同時對接阿里雲表格存儲服務(TableStore),用於天氣預報數據存儲。具體操做以下:app
在 Knative 中,咱們能夠直接建立服務以下:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: weather-store
namespace: default
spec:
template:
metadata:
labels:
app: weather-store
annotations:
autoscaling.knative.dev/maxScale: "20"
autoscaling.knative.dev/target: "100"
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/weather-store:1.2
ports:
- name: http1
containerPort: 8080
env:
- name: OTS_TEST_ENDPOINT
value: http://xxx.cn-hangzhou.ots.aliyuncs.com
- name: TABLE_NAME
value: weather
- name: OTS_TEST_INSTANCENAME
value: ${xxx}
- name: OTS_TEST_KEYID
value: ${yyy}
- name: OTS_TEST_SECRET
value: ${Pxxx}
- name: WEATHER_API_KEY
value: xxx複製代碼
關於服務具體實現參見 GitHub 源代碼:github.com/knative-sam…
這裏或許有疑問:爲何不在服務中直接進行定時輪詢,非要經過 Knative Eventing 搞一個定時事件觸發執行調用?那咱們要說明一下,Serverless 時代下就該這樣玩-按需使用。千萬不要在服務中按照傳統的方式空跑這些定時任務,親,這是在持續浪費計算資源。
言歸正傳,下面咱們使用 Knative Eventing 自帶的定時任務數據源(CronJobSource),觸發定時同步事件。
建立 CronJobSource 資源,實現每 3 個小時定時觸發同步天氣服務(weather-store),WeatherCronJob.yaml 以下:
apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
name: weather-cronjob
spec:
schedule: "0 */3 * * *"
data: '{"message": "sync"}'
sink:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
name: weather-store複製代碼
執行命令:
kubectl apply -f WeatherCronJob.yaml複製代碼
如今咱們登陸阿里雲表格存儲服務,能夠看到天氣預報數據已經按照城市、日期的格式同步進來了。
有了這些天氣數據,能夠爲所欲爲的提供屬於咱們本身的天氣預報服務了(感受像是承包了一塊地,咱們來當地主),這裏沒什麼難點,從表格存儲中查詢對應的天氣數據,按照返回的數據格式進行封裝便可。
在 Knative 中,咱們能夠部署 RESTful API 服務以下:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: weather-service
namespace: default
spec:
template:
metadata:
labels:
app: weather-service
annotations:
autoscaling.knative.dev/maxScale: "20"
autoscaling.knative.dev/target: "100"
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/weather-service:1.1
ports:
- name: http1
containerPort: 8080
env:
- name: OTS_TEST_ENDPOINT
value: http://xxx.cn-hangzhou.ots.aliyuncs.com
- name: TABLE_NAME
value: weather
- name: OTS_TEST_INSTANCENAME
value: ${xxx}
- name: OTS_TEST_KEYID
value: ${yyy}
- name: OTS_TEST_SECRET
value: ${Pxxx}複製代碼
具體實現源代碼 GitHub 地址:github.com/knative-sam…
查詢天氣 RESTful API:
參數:
cityCode:城市區域代碼。如北京市區域代碼:110000
date:查詢日期。如格式:2019-09-26複製代碼
{
"code":200,
"message":"",
"data":{
"adcode":"110000",
"city":"北京市",
"date":"2019-09-26",
"daypower":"≤3",
"daytemp":"30",
"dayweather":"晴",
"daywind":"東南",
"nightpower":"≤3",
"nighttemp":"15",
"nightweather":"晴",
"nightwind":"東南",
"province":"北京",
"reporttime":"2019-09-25 14:50:46",
"week":"4"
}
}複製代碼
查詢:杭州,2019-09-26 天氣預報信息示例
測試地址:weather-service.default.serverless.kuberun.com/api/weather…
另外城市區域代碼表能夠在上面提供的源代碼 GitHub 中能夠查看,也能夠到高德開放平臺中下載:lbs.amap.com/api/webserv…
經過上面的介紹,你們對如何經過 Knative 提供天氣預報實現應該有了更多的體感,其實相似的場景咱們有理由相信經過 Knative Serverless 能夠幫你作到資源利用遊刃有餘。下一篇會繼續咱們要實現的內容:經過 Knative 事件驅動,訂閱天氣信息,釘釘推送通知提醒,歡迎持續關注。
「 阿里巴巴雲原生微信公衆號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術公衆號。」