Knative実戦:Knative Server less技術に基づく天気サービスの実現-前編

7645 ワード

天気予報サービスといえば、私たちの第一反応は簡単なサービスですね.現在、ネット上には大きな天気予報APIが直接使用できますが、Knativeを使ってセットを作る必要がありますか.鶏を殺して牛刀を使うの?焦らないで、実際のいくつかのシーンのニーズを見てみましょう.
  • シーン需要1:現地の長年の天気情報に基づいて、来年の大体の高温が到来する時間を予測する
  • シーン需要2:最近天気が変わりやすいので、明日雨が降ったら、朝出勤する前に、傘を持って注意してください.
  • シーン需要3:リーダーは「最近の不況で、会社の財務が緊張しています.そのサーバー、天気、道路状況などのサービスを提供するいくつかの小さなプログラムを一緒に使いましょう.しかし、正常にサービスを提供することを保証します」と話しました.

  • 上記のニーズから、天気予報のサービスを行うには、内憂(資源不足)外患(需要増加)にも直面していることがわかりました.そんなに簡単ではありませんが、今は焦らないでください.Knativeを使って上記の問題を解決することができます.
    キーワード:天気検索、表ストレージ、チャネルサービス、イベント通知
    シーン要件
    まず、天気サービスのシーンのニーズについて説明します.
    1.対外的な天気予報RESTful APIを提供する
  • 都市・日付照会(今後3日間対応)国内都市天気情報
  • クエリーの回数を制限せず、より大きな同時クエリー(1000)
  • をサポート
    2.天気注意
  • 国内都市の天気情報を購読し、実際に都市区域を購読し、明日雨が降って傘を持つことを注意する
  • 釘による通知
  • 全体的なアーキテクチャ
    需要があれば、Knativeに基づいて天気サービスを実現する方法を始めます.まず全体的なアーキテクチャを見てみましょう.
  • CronJobイベントソースを介して、3時間毎にタイミングイベントを送信し、国内都市の今後3日間の天気情報をテーブルストレージ
  • に更新する.
  • RESTful APIクエリー気象情報
  • を提供する
  • は、テーブルストレージによって提供するチャネルサービスによって、Table Storeイベントソース
  • を実現する.
  • Borker/Triggerイベント駆動モデルにより、ターゲット都市気象情報
  • を購読する
  • は、購読によって受信された天気情報に基づいて、釘メッセージ通知を行う.明日雨が降ったら、傘などを持ってください.
    内容が多いので、上と下の2つに分けて紹介します.
  • 前編では、サードパーティの天気予報API、タイミング同期、天気情報の更新、RESTful APIの提供方法について説明します.
  • 次編では、TableStoreイベントソースを実現し、天気情報を購読し、釘で注意通知を送信する方法について説明します.

  • Knativeによる天気サービスの実現-前編
    ドッキング高徳オープンプラットフォーム天気予報API
    天気を検索するAPIはたくさんあります.ここでは、高徳開放プラットフォームが提供する天気検索APIを選択し、使用が簡単で、サービスが安定しており、この天気予報APIは毎日100000無料の呼び出し量を提供し、国内3500以上の地域の天気情報検索をサポートしています.また、高徳オープンプラットフォームは、天気予報のほか、IP測位、検索サービス、経路計画などを提供することができ、興味のある遊び方も検討することができます.
    高徳オープンプラットフォームにログインする:https://lbs.amap.com、アプリケーションを作成し、Keyを取得します.
    キーを取得するとurlから直接アクセスできます.https://restapi.amap.com/v3/w...;ユーザ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)に接続し、天気予報データ記憶に使用する.具体的な操作は以下の通りである.
  • CloudEventタイミングイベント
  • を受信
  • 各地域の天気情報
  • を検索する
  • 天気情報をテーブル記憶
  • に記憶または更新する.
    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でタイミングイベントをして実行呼び出しをトリガーしなければならないのですか?では、Severless時代にはこのように遊ぶべきだったことを説明します.必要に応じて使用します.決してサービスの中で伝統的な方法でこれらのタイミングの任務を空っぽにしないでください.親、これは計算資源を浪費し続けています.
    さて、ここでは、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

    今、アリクラウドテーブルストレージサービスにログインすると、天気予報データが都市、日付のフォーマットで同期されていることがわかります.
    天気予報クエリーRESTful APIの提供
    これらの天気データがあれば、私たち自身の天気予報サービスを勝手に提供することができます(土地を請け負ったような気がしますが、私たちは地主になります).ここでは難点はありません.表の記憶から対応する天気データを検索し、戻ってきたデータフォーマットでパッケージすればいいです.
    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:
  • 要求URL
  • GET/api/weather/query
      :
    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天気予報情報の例
    テストアドレス:http://weather-service.default.serverless.kuberun.com/api/weather/query?cityCode=330100&date=2019-09-26
    また、都市地域コード表は、上に提供されたソースコードGitHubで表示することも、高徳オープンプラットフォームでダウンロードすることもできます.https://lbs.amap.com/api/webservice/download
    小結
    上记の绍介を通じて、皆さんはどのようにKnativeを通じて天気予报を提供することに対して実现してもっと多くの体感があるべきで、実は似たようなシーンは私达はKnative Server lessを通じてあなたに资源の利用の余裕があることを助けることができると信じる理由があります.次の記事では、Knativeイベント駆動、天気情報の購読、釘押し通知注意、継続的な関心を歓迎します.
    Knative交流グループへようこそ
    「アリババ雲原生微信公衆番号(ID:Alicloudnative)はマイクロサービス、Server less、容器、Service Meshなどの技術分野に注目し、雲原生流行技術のトレンドに焦点を当て、雲原生大規模な着地実践に焦点を当て、雲原生開発者の技術公衆番号を最も理解している」.