基於Spring Boot的天氣預報服務

2021-08-15 19:27:37 字數 3829 閱讀 2150

有時,為了提公升整個**的效能,我們會將經常需要訪問資料快取起來,這樣,在下次查詢的時候,能快速的找到這些資料。

快取的使用與系統的時效性有著非常大的關係。當我們的系統時效性要求不高時,則選擇使用快取是極好的。當系統要求的時效性比較高時,則並不適合用快取。

本文,我們將演示如何通過整合 redis 伺服器來進行資料的快取,以提高微服務的併發訪問能力。

為啥我們需要快取

在之前的文章中,我們已經介紹了如何使用 spring boot 來快速實現乙個天氣預報服務應用micro-weather-basic(見 通過該應用,能實現簡單的天氣查詢。

天氣資料介面,本身時效性不是很高,而且又因為是 web 服務,在呼叫過程中,本身是存在延時的。所以,採用快取,一方面可以有效減輕訪問天氣介面服務帶來的延時問題,另一方面,也可以減輕天氣介面的負擔,提高併發訪問量。

特別地,我們是使用的第三方免費的天氣 api,這些 api 往往對使用者的呼叫次數及頻率有一定的限制。所以為了減輕天氣 api 提供方的負荷,我們並不需要實時去呼叫其第三方介面。

micro-weather-basic的基礎上,我們構建了乙個micro-weather-redis專案,作為示例。

開發環境

為了演示本例子,需要採用如下開發環境:

專案配置

spring boot data redis 提供了 spring boot 對 redis 的開箱即用的功能。在原有的依賴的基礎上,新增 spring boot data redis starter 的依賴。

// 依賴關係

dependencies

在 linux 平台上安裝 redis 比較簡單,可以參考官方文件來即可,詳見

安裝後,redis 預設執行在 位址埠

修改 weatherdataserviceimpl

修改 weatherdataserviceimpl,增加了 stringredistemplate 用於操作 redis。

@service

public

class

weatherdataserviceimpl

implements

weatherdataservice

@override

public

weatherresponse

getdatabycityname

(string

cityname

)private

weatherresponse

dogetweatherdata

(string

uri)

ops.

set(

key,

strbody

,time_out

,timeunit

.seconds);}

else

=new

();weatherresponse

weather

=null

;try

catch

(ioexceptione)

return

weather;}

}

修改了 dogetweatherdata 方法,增加了 redis 資料的判斷:

其中,當然 stringredistemplate 跟 redistemplate 功能類似,都是封裝了對 redis 的一些常用的操作。區別在於,stringredistemplate 更加專注於基於字串的操作,畢竟,在目前咱們的天氣預報應用中,資料的格式主要是 json 字串。

valueoperations 介面,封裝了大部分的簡單的 k-v 操作。

同時,我們也使用了日誌框架,用來記錄執行過程,及日常的資訊。

測試、執行

首先,在進行測試前,需要將 redis 伺服器啟動起來。

我們可以通過在乙個時間段內,多次訪問同乙個個天氣介面來測試效果,比如,介面 http://localhost:8080/weather/cityid/101280601。為了縮短測試的時間,我們可以將 redis 的超時時間縮短一點,比如10秒。這樣,你就不用苦等30分鐘才能驗證資料是否過期了。

2017-10

-1823:

51:41.762

info

15220

---[

nio-

8080

-exec-6

]c.w

.s.c

.w.s

.weatherdataserviceimpl

:未找到

.weatherdataserviceimpl:找到

:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}

2017-10

-1823:

51:46.700

info

15220

---[

nio-

8080

-exec-7

]c.w

.s.c

.w.s

.weatherdataserviceimpl:找到

:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}

2017-10

-1823:

51:50.513

info

15220

---[

nio-

8080

-exec-8

]c.w

.s.c

.w.s

.weatherdataserviceimpl:找到

:, value=,"city":"深圳","aqi":"35","forecast":[,,,,],"ganmao":"各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。","wendu":"25"},"status":1000,"desc":"ok"}

2017-10

-1823:

51:53.140

info

15220

---[

nio-

8080

-exec-9

]c.w

.s.c

.w.s

.weatherdataserviceimpl

:未找到

:

從上述日誌可以看到,第一次(23:51:41)訪問介面時,沒有找到 redis 裡面的資料,所以,就初始化了資料。

後面幾次訪問,都是訪問 redis 裡面的資料。最後一次(23:51:53),由於超時了,所以 redis 裡面又沒有資料了,所以又會拿天氣介面的資料。

原始碼本章節的原始碼,見  samples目錄下的micro-weather-redis目錄下。

基於python的終端天氣查詢

開發十年,就只剩下這套架構體系了!網上搜了乙個,最開始準備使用中國天氣網的資料介面,但是需要註冊,也行,註冊就註冊吧。註冊好了,又提示資訊不完整,好吧,填寫姓名 身份證.最後,還要上傳身份證資訊,看到這我不想用它了,緊接著發現,還要填寫使用該介面的伺服器ip。頓時,心中十萬個那個啥呼嘯而過.城市介面...

基於NoneBot的天氣查詢外掛程式

搞了一會才弄出了個天氣的外掛程式,主要是根據官方文件的完善,從而能實現查詢天氣的功能。主函式 init py from nonebot import on command,commandsession from nonebot import on natural language,nlpsessio...

基於SpringBoot開發

使用idea配置springboot專案 專案結構 而 configuration 經常與 bean 組合使用,使用這兩個註解就可以建立乙個簡單的spring 配置類,可以用來替代相應的xml 配置檔案。enableautocon figuration 能夠自動配置spring 的上下文,猜測和配置...