利用京東雲Serverless服務快速構建5G時代的IoT應用
10月31日,在2019年中國國際資訊通訊展覽會上,工信部宣佈:5G商用正式啟動。5G商用時代來了!
5G的商用,使得資料傳輸速度、響應速度、連線資料、資料傳輸量、傳輸可靠性等方面都有了顯著的提升,這一技術的突破才使得很多領域的應用場景得以真正的落地實施,走進普通人的生活,而這其中就包括物聯網。
雖然物聯網的概念很簡明,就是把物品與網際網路相連線並進行資訊交換和通訊,從而實現萬物智慧化,但是由於各種原因,商業化的應用並沒有大規模的落地,其中一方面是由於網路傳輸等原因的限制。如今,5G的到來使得物聯網應用在網路層面不再受限,更好地促進了物聯網的發展。對於企業來說,快速構建一個商用的物聯網服務,搶佔先機就顯得尤為重要。
京東雲Serverless服務正適應瞭如今企業的這種需求。Serverless一系列產品生態可以讓使用者以業務為導向,無需關心底層伺服器部署以及承載能力,實施週期短,無預付價格按使用量付費。這些特性是適應網際網路5G快速時代、快速構建的不二選擇,為企業節省成本的同時解決了技術上的難題。
以下面一個車聯網資料為例子,我們來看一下如何用佇列服務來構建一個高可用高可靠的無服務應用。在車聯網應用中客戶端負載可能會在24小時內擴充套件/縮減3、4個數量級,這些特性天然適合Serverless服務動態擴縮,按量付費。
案例場景:車聯網中搭載資料收集感測器的汽車向雲端傳輸行駛資料,雲端利用佇列服務削峰填谷、動態擴縮的能力接收資料,然後轉存到Elasticsearch進行更好的資料檢索和應用,為使用者提供更好的服務或者為公司提供更多的商業價值。需求:佇列服務SDK,佇列服務接入點地址,Elasticsearch接入點地址(已經建立好ES例項),京東雲使用者AK/SK程式碼語言: Go
Step1
建立佇列服務客戶端以及資源建立
1func CreateClient() *sqs.SQS {
2 ses, _ := session.NewSession(&aws.Config{
3 Region: aws.String("cn-north-1"),
4 Credentials: credentials.NewStaticCredentials("your AccessKey",
5 "your SecretKey", ""),
6 Endpoint: aws.String("),
7 DisableSSL: aws.Bool(true),
8 })
9 _, err := ses.Config.Credentials.Get()
10 if err != nil {
11 log.Fatal("憑據建立失敗", err)
12 }
13 client := sqs.New(ses)
14 return client
15}
16
17func CreateQueueTask(name string) string {
18 resp, err := sqsClient.CreateQueue(&sqs.CreateQueueInput{
19 QueueName: aws.String(name),
20 })
21 if err != nil {
22 log.Println("Create Queue Failed:", err)
23 return ""
24 }
25 return *resp.QueueUrl
26}
Step2
每個車輛裝置傳送訊息
1func SendTask(url string, message interface{}) {
2 body, _ := json.Marshal(message)
3 _, err := sqsClient.SendMessage(&sqs.SendMessageInput{
4 MessageBody: aws.String(string(body)),
5 QueueUrl: aws.String(url),
6 })
7 if err != nil {
8 log.Println("Send Message Failed:", err)
9 return
10 }
11 return
12}
測試資料:
測試機器的配置: CPU64、記憶體256G、頻寬100Mbps(京東云云主機)
場景:
公網;send-單條(JQS)
Step3
從佇列服務中拉取訊息轉存到Elasticsearch中
1func ReceiveMessageTask(url string) interface{} {
2 result, err := sqsClient.ReceiveMessage(&sqs.ReceiveMessageInput{
3 AttributeNames: aws.StringSlice([]string{"All"}),
4 MaxNumberOfMessages: aws.Int64(1),
5 MessageAttributeNames: aws.StringSlice([]string{"All"}),
6 QueueUrl: aws.String(url),
7 VisibilityTimeout: aws.Int64(30),
8 WaitTimeSeconds: aws.Int64(0),
9 })
10 log.Println(*result.Messages[0].Body)
11 if err != nil {
12 log.Println("Receive Message Failed:", err)
13 return ""
14 }
15
16 if len(result.Messages) > 0 {
17 _, delErr := sqsClient.DeleteMessage(&sqs.DeleteMessageInput{
18 QueueUrl: aws.String(url),
19 ReceiptHandle: result.Messages[0].ReceiptHandle,
20 })
21 if err != nil {
22 log.Println("Delete Message Failed:", delErr)
23 }
24
25 message := new(gpsMessage)
26 Err := json.Unmarshal([]byte(*result.Messages[0].Body), message)
27 if Err != nil {
28 log.Println("Receive Message Unmarshal Failed", Err)
29 return ""
30 }
31 return message
32 }
33 return ""
34}
35
36func Build(url string, method string, body interface{}) []byte {
37 client := &http.Client{}
38 //向服務端傳送get請求
39 bodyData, _ := json.Marshal(body)
40 request, _ := http.NewRequest(method, url, bytes.NewReader(bodyData))
41
42 request.Header.Set("Accept", "application/json")
43 request.Header.Set("Content-Type", "application/json")
44 //接收服務端返回給客戶端的資訊
45 response, _ := client.Do(request)
46 r, _ := ioutil.ReadAll(response.Body)
47 return r
48}
49
50func PostMessageToES(p string, body interface{}) string {
51 postReturn := new(postRes)
52 postResponse := Build(p, "POST", body)
53 err := json.Unmarshal(postResponse, postReturn)
54 if err != nil {
55 log.Println("Unmarshal Failed", err)
56 }
57 jsonS, _ := json.Marshal(postReturn)
58 log.Println("postResult:", string(jsonS))
59 return postReturn.Id
60}
Step4
從Elasticsearch按照需求索引搜尋資訊
1func GetMessageFromES(p string) {
2 message := new(esMessage)
3 getResponse := Build(p, "GET", nil)
4 log.Println("getPath:", p)
5 Err := json.Unmarshal(getResponse, message)
6 if Err != nil {
7 log.Println("Unmarshal Failed", Err)
8 }
9 jsonM, _ := json.Marshal(message)
10 log.Println("getResult:", string(jsonM))
11}
結果示例:
可以按照車輛資訊進行資料的檢索,繪製出汽車動態地圖,利用這些資料來幫助自動駕駛、動態導航、車輛健康度分析等多種場景進行實現。
京東雲的佇列服務作為Serverless開發中的BaaS服務,實現了中介軟體服務的無運維和毫秒級擴縮能力,支援京東雲的合作伙伴零成本啟動業務和按使用量付費的模式,幫助使用者解決資源擴縮和閾值監控等複雜問題。結合函式服務FaaS使用,可以滿足更豐富的場景,並且呼叫整個京東雲Serverless生態,打造基於雲原生21世紀的開放式的全新應用。 點選“ 瞭解 ”,快來進行體驗吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2673421/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用 FC + OSS 快速搭建 Serverless 實時按需影像處理服務Server
- 影片豪橫時代,應用如何快速構建影片點播能力?
- 利用京東雲Web應用防火牆實現Web入侵防護Web防火牆
- 託管式服務網路:雲原生時代的應用體系架構進化架構
- 使用微服務構建現代應用程式微服務
- 京東雲的雲原生理念及 Serverless 最佳實踐Server
- 應用量化時代 | 微服務架構的服務治理之路微服務架構
- Serverless 時代下微服務應用全託管解決方案Server微服務
- 構建Spring Boot應用的微服務服務動態路由Spring Boot微服務路由
- 京東雲PostgreSQL在GIS場景的應用分享SQL
- 構建Spring Boot應用的微服務服務監控與告警Spring Boot微服務
- IoT雲服務連線性的方式
- 阿里雲:面向5G時代的物聯網無線連線服務阿里
- 阿里雲丁宇:雲原生啟用應用構建新正規化,Serverless奇點已來阿里Server
- 用 Golang 構建 gRPC 服務GolangRPC
- 雲原生時代下,微服務體系與 Serverless 架構的發展、治理與融合微服務Server架構
- “淘寶京東”構建流式計算賣家日誌系統架構的應用實踐架構
- 使用Knative基於構建、部署、管理serverless應用Server
- 雲原生時代,應用架構將如何演進?應用架構
- 使用Spring Boot 2.0快速構建服務元件Spring Boot元件
- docker&flask快速構建服務介面(二)DockerFlask
- 構建現代Web應用的安全指南Web
- 如何快速構建服務發現的高可用能力
- 京東智聯雲媒體處理服務再升級
- 京東實時資料產品應用實踐
- 容器映象服務:雲原生時代的核心基石
- 開放下載 | 《Knative 雲原生應用開發指南》開啟雲原生時代 Serverless 之門Server
- 用 Hystrix 構建高可用服務架構架構
- Elastic App Search 快速構建 ES 應用ASTAPP
- EMQX Cloud 影子服務:便捷資料快取服務,加速 IoT 應用開發MQCloud快取
- “4S”框架快速構建優雅的Java服務框架Java
- [譯]構建現代Web應用的安全指南Web
- Serverless 微服務實踐-移動應用包分發服務Server微服務
- 京東雲羅玉傑:OpenResty 在直播場景中的應用REST
- 華為音訊編輯服務(Audio Editor Kit),快速構建應用音訊編輯能力音訊
- Spring Cloud雲服務架構 - 雲架構程式碼結構構建SpringCloud架構
- Spring Cloud雲服務架構 - 企業分散式微服務雲架構構建SpringCloud架構分散式微服務
- SaaS架構:應用服務、應用結構設計架構