提到天氣預報服務,咱們第一反應是很簡單的一個服務啊,目前網上有大把的天氣預報 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 源代碼:https://github.com/knative-sample/weather-store
這裏或許有疑問:爲何不在服務中直接進行定時輪詢,非要經過 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 地址:https://github.com/knative-sample/weather-service
查詢天氣 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 天氣預報信息示例
另外城市區域代碼表能夠在上面提供的源代碼 GitHub 中能夠查看,也能夠到高德開放平臺中下載:https://lbs.amap.com/api/webservice/download
經過上面的介紹,你們對如何經過 Knative 提供天氣預報實現應該有了更多的體感,其實相似的場景咱們有理由相信經過 Knative Serverless 能夠幫你作到資源利用遊刃有餘。下一篇會繼續咱們要實現的內容:經過 Knative 事件驅動,訂閱天氣信息,釘釘推送通知提醒,歡迎持續關注。
「 阿里巴巴雲原生微信公衆號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術公衆號。」