天天看點

Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們

函數計算(Function Compute): 函數計算

是事件驅動的全托管計算服務。使用函數計算,您無需采購與管理伺服器等基礎設施,隻需編寫并上傳代碼。函數計算為您準備好計算資源,彈性地可靠地運作任務,并提供日志查詢、性能監控和報警等功能。借助函數計算,您可以快速建構任何類型的應用和服務,并且隻需為任務實際消耗的資源付費。

通路 SQL Server 資料庫是指在函數計算中通過編寫代碼調用資料庫驅動庫通過 TCP 協定實作對資料庫進行的插入、查詢等操作。通常函數計算中運作的不同函數執行個體之間是不共享狀态的,對于結構化的資料可以通過資料庫的形式進行持久化以實作狀态共享。由于使用者函數運作在函數計算的 VPC 中,而使用者的資料庫運作在使用者所屬的 VPC 中,是以在函數計算平台通路資料庫會涉及到跨 VPC 通路的場景,下面我們先來介紹一下其工作機制。

工作機制

通路 SQL Server 的原理、工作機制與通路 Mysql 資料庫完全相同,本文不再重複闡述,更詳細的内容請參考

通路 Mysql 資料庫

中的工作機制章節。

配置與函數編寫

公共配置

建立專有網絡VPC

  1. 登入 VPC控制台
  2. 參閱 VPC 搭建專有網絡 建立VPC和交換機。

建立安全組

安全組控制台

建立安全組,點選 建立安全組,設定安全組名稱,網絡類型選擇 專有網絡,并選擇剛才建立的專有網絡。

建立與配置 SQL Server 執行個體

  1. 建立适合業務需求的雲資料庫 SQL Server 版執行個體可以參考 雲資料庫 SQL Server 版
注意:建立雲資料庫 SQL Server 版執行個體需要選擇和函數計算配置相同的 VPC 執行個體,可以配置和函數計算不同的可用區的交換機,因為相同的 VPC 執行個體下不同可用區交換機内網是互通的。
  1. 建立成功後,在執行個體資訊頁面左側的導航欄中單擊資料安全性。
  2. 單擊 添加白名單分組 。
    Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們
  3. 在彈出的對話框中,将函數計算所在的 VPC 網絡的網段位址配置在白名單輸入框中。
    1. VPC 控制台 ,在專有網絡清單中找到應用所在的 VPC,單擊該 VPC 的名稱進入專有網絡詳情頁面。
    2. 複制應用所在的 VPC 的 IPv4 網段。
      Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們
    3. 在組内白名單設定框中粘貼該 VPC 的 IPv4 網段位址,然後單擊确定。
      Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們
  4. 最後通路 SQL Server 資料庫 host 為執行個體的内網位址,可以登入阿裡雲控制台檢視:
    Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們

函數計算配置 VPC

注意:函數計算服務所在區域與公共配置中建立的資源所在區域一緻。
  1. 函數計算控制台 建立服務。
  2. 【專有網絡配置】選項中,選擇您在步驟一中建立的 VPC 網絡,交換機、安全組。
  3. 【權限配置】選項中,選擇【建立角色】,點選【點選授權】,在角色快速建立頁面,點選【同意授權】。
  4. 點選确定,建立服務完畢。

函數編寫與調試

下面示範 Python3 與 php7.2 開發語言通路 SQL Server 資料庫函數示例建立:

使用 Fun 工具在建立存放代碼和依賴子產品目錄下安裝依賴和項目部署。

Python3

  1. 建立一個目錄,用于存放代碼和依賴子產品,在該目錄下建立 template.yml 檔案,例如 /tmp/code/template.yml,内容為:
    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
    SQL-Server-test:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: This is SQL-Server service
      Role: 'acs:ram::xxxxx:role/fc-public-test'
      LogConfig:
        Project: xxx
        Logstore: xxx
      VpcConfig:
        VpcId: vpc-xxx
        VSwitchIds:
          - vsw-xxx
        SecurityGroupId: sg-xxx
      InternetAccess: true
    python-test:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: 'index.handler'
        Runtime: python3
        Timeout: 10
        MemorySize: 128
        CodeUri: './'           
  2. 在該目錄下建立 Funfile 檔案内容為:
    RUNTIME python3
    RUN fun-install pip install pymssql           
  3. 執行

    fun install

    指令安裝依賴:
    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    安裝過程。。。。
    Install Success
               
  4. 在函數根目錄下建立代碼檔案,例如 /tmp/code/index.py:
    # -*- coding: utf-8 -*-
    import pymssql
    def handler(event, context):
    
        conn = pymssql.connect(host='rm-xxx.sqlserver.rds.aliyuncs.com',
                                    user='xxx,
                                    password='xxx',
                                    database='xxx',
                                    charset='utf8')
        cursor = conn.cursor()
        cursor.execute('SELECT * FROM inventory WHERE quantity > 152')
    
        result = ''
    
        for row in cursor:
            result += 'row = %r\n' % (row,)
    
        conn.close()
        return result           
  5. 使用 fun 工具部署:
    $ fun deploy
    using template: template.yml
    using region: cn-hangzhou
    using accountId: ***********3743
    using accessKeyId: ***********Ptgk
    using timeout: 60
    
    部署過程。。。
            function python-test deploy success
    service SQL-Server-test deploy success           
    登入控制台,即可看到相關的服務、函數被建立成功,且觸發執行可以傳回正确的結果。

PHP7.2

  1. ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
      SQL-Server-test:
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: This is SQL-Server service
          Role: 'acs:ram::xxx:role/fc-public-test'
          LogConfig:
            Project: xxx
            Logstore: xxx
          VpcConfig:
            VpcId: vpc-xxx
            VSwitchIds:
              - vsw-x'x'x'x
            SecurityGroupId: sg-xxx
          InternetAccess: true
        php-test:
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: 'index.handler'
            Runtime: php7.2
            Timeout: 10
            MemorySize: 128
            CodeUri: './'
            EnvironmentVariables:
              ODBCINI: /code/.fun/root/etc/odbc.ini
              ODBCSYSINI: /code/.fun/root/opt/microsoft/msodbcsql17/etc
               
  2. RUNTIME php7.2
    RUN apt-get update && apt-get install -y apt-transport-https apt-utils
    RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list
    RUN fun-install apt-get install unixodbc-dev
    RUN fun-install apt-get install msodbcsql17           
  3. fun install

    $ fun install
    using template: template.yml
    start installing function dependencies without docker
    安裝過程。。。。
    Install Success
               
  4. 在函數根目錄下建立代碼檔案,例如 /tmp/code/index.php:
    <?php
    function handler($event, $context)
    {
        try {
            $conn = new PDO("sqlsrv:Server=rm-xxx.sqlserver.rds.aliyuncs.com;Database=xxx","xxx","xxx");
            // set the PDO error mode to exception
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $conn->query("set names utf-8");
            $sql="SELECT * FROM inventory WHERE quantity > 152";
            $result = $conn->prepare($sql);
            $result->execute();
            print($result);
            return ("Connection successed.");
        } catch (PDOException $e) {
            return ("Connection failed: " . $e->getMessage());
        }
    }           
  5. $ fun deploy
    using template: template.yml
    using region: cn-hangzhou
    using accountId: ***********3743
    using accessKeyId: ***********Ptgk
    using timeout: 60
    
    部署過程。。。
            function php-test deploy success
    service SQL-Server-test deploy success           
  6. 注意事項
    1. 建立的函數需要設定兩個環境變量:

      ODBCINI: /code/.fun/root/etc/odbc.ini

    ODBCSYSINI: /code/.fun/root/opt/microsoft/msodbcsql17/etc
    1. fun install

      指令安裝依賴後,修改 .fun/root/etc/odbc.ini 檔案中 Driver 值指向.fun/root/opt/microsoft/msodbcsql17/lib64/目錄下的檔案,如圖!
      Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們
    2. php環境中需要使用 pdo_sqlsrv 擴充編譯可以參考 函數計算 php runtime 編譯非内置的擴充 文檔最後可以下載下傳已經編譯好的 pdo_sqlsrv 擴充。

總結

通過本文介紹可以快速實作函數計算通路 SQL Server 資料庫。

使用函數計算帶來的優勢:

  1. 無需采購和管理伺服器等基礎設施,隻需專注業務邏輯的開發,可以大幅縮短項目傳遞時間和人力成本;
  2. 提供日志查詢、性能監控、報警等功能快速排查故障;
  3. 免運維,毫秒級别彈性伸縮,快速實作底層擴容以應對峰值壓力,性能優異;
  4. 成本極具競争力;

加入我們

團隊介紹

阿裡雲函數服務是一個全新的,支援事件驅動程式設計模式的計算服務。 他幫助使用者聚焦自身業務邏輯,以 Serverless的方式建構應用,快速的實作低成本,可擴充,高可用的系統,而無需考慮伺服器等底層基礎設施的管理。 使用者能夠快速的建立原型,同樣的架構能随業務規模平滑伸縮。讓計算變得更高效,更經濟,更彈性,更可靠。無論小型創業公司,還是大型企業,都受益其中。我們的團隊正在迅速擴張,求賢若渴。我們想尋找這樣的隊友:

基本功紮實。既能閱讀論文追蹤業界趨勢,又能快速編碼解決實際問題。

嚴謹的,系統化的思維能力。既能整體考慮業務機會,系統架構,運維成本等諸多因素,又能掌控設計/開發/測試/釋出的完整流程,預判并控制風險。

好奇心和使命感驅動。樂于探索未知領域,不僅是夢想家,也是踐行者。

堅韌、樂觀、自信。能在壓力和困難中看到機會,讓工作充滿樂趣!

如果您對雲計算充滿熱情,想要建構一個有影響力計算平台和生态體系,請加入我們,和我們一起實作夢想!

職位描述

建構新一代 Serverless 計算平台,包括:

  1. 設計和實作完整可擴充的前端系統,包括身份驗證/權限管理,中繼資料管理,流量控制,計量計費,日志監控等等
  2. 設計和實作彈性可靠的後端系統,包括資源排程,負載均衡,容錯處理等等
  3. 豐富易用的 SDK/Tools/CLI/控制台
  4. 使用者需求驅動,追蹤業界趨勢,利用技術推動業務的成長

職位要求

  1. 算法/資料結構/作業系統等基礎知識紮實,優秀的邏輯思維能力。
  2. 至少掌握一門程式設計語言。例如 Java/Go/C/C#/C++。
  3. 有大規模、高可用分布式系統開發經驗者優先。
  4. 有 Web/Mobile Backends/Microservice 開發經驗者優先。
  5. 良好的溝通能力和團隊合作精神,有一定的組織協調能力。
  6. 大學及以上學曆
  7. 3 年以上工作經驗

    通過“阿裡巴巴編碼規範” 認證的同學優先錄取,認證位址:

    https://edu.aliyun.com/certification/cldt02

履歷送出

yixian.dw AT alibaba-inc.com

Serverless 解惑——函數計算如何通路 SQL Server 資料庫工作機制配置與函數編寫總結加入我們
阿裡巴巴雲原生技術圈 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”