データベース内のWebサービスのバックエンド。ビジネスロジックを構築し、フロントエンドAPIのマイクロサービスリレーを作成する方法

この記事では、組み込みPL-SQLデータベースでWebサービスのビジネスロジックを簡単に設計する方法を説明します。



フロントエンド用の簡単なリレーサービスを作成する方法(例はphpにあります)と、ベースでアナログAPIを設計し、フロントエンドにリレーするために登録するのがいかに簡単かを説明します。



PS:バックエンドとフロントエンドの例はPHP、firebirdデータベースにあります。ただし、これは必須ではありません。任意のプログラミング言語と任意のデータベースを使用できます。


PS:帽子を投げないようにお願いします。今では人気がないことを知っています。特定の社会的理由から、SQLプログラマーよりも多くのPHPまたはPythonスペシャリストが市場に出回っています。彼らは安価で、誰もがORMを愛しています。データベースにロジックを配置する場合、マイクロサービスアーキテクチャを編成することはより困難であると考えられています。バージョン管理の管理が難しくなります。 Goはコンパイルされ、データベースよりも高速に実行されるはずです。 PHPフレームワークなどにビジネスロジックを配置するのが一般的です。

多くの理由があり、誰もが一方と他方で議論を持っており、それぞれが深く議論することができます。



ただし、この記事は、データベースにビジネスロジックを設定したい人を対象としています。ここでは、そのような方法を促進する目的はありません。コメントで正解してください。


一般に、この方法は非常に単純で、速度の点で煩わしいものです。有能なマイクロサービスリレーを作成し、データベース内のサービステーブルを積極的に使用する場合、新しいAPIを登録するには、次の形式のサービステーブルが1つだけ必要です。



CREATE TABLE DFM_PROC (
    ID           INTEGER NOT NULL,
    NAME         VARCHAR(70) NOT NULL,
    DISCRIPTION  VARCHAR(1000)
);
      
      





例:



画像



スキームは次のとおりです。



画像



ここでは、「Serviceforinterface」マイクロサービスの作業を整理する方法を検討します。 私は与える



フロントエンドの例をPHPで



function ser1($proc_id,$json)
{
//   
$post='hash='.$_SESSION['sess_id'].'&user_id='.$_SESSION['id_user'].'&proc_id='.$proc_id.'&json='.base64_encode($json);

// 
$url = 'http://192.168.128.1/ser.php';
	 
$ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST , true);
    curl_setopt($ch, CURLOPT_POSTFIELDS ,$post);
    $result = curl_exec($ch);
    $arr_res=json_decode($result,true);			
curl_close($ch);
	
return $arr_res;
}

//          
//       
// 4 -      
if (isset($_POST['go_new_prof']))
{
    unset($arr);
    $arr['0']=$_SESSION['id_user'];
    $arr['1']=(int)$_GET['tp'];
    $arr['2']=(int)$_POST['lang_list'];
    $arr_prof=ser1(4,json_encode($arr));
}

      
      





SQLで呼び出されたプロシージャの例



create or alter procedure DFM_PROF_ADD (
    USER_ID smallint,
    TYPE_ varchar(10),
    LANG smallint)
as
begin

  INSERT INTO DFM_PROFILES (USER_ID, TYPE_, LANG)
    VALUES (:USER_ID, :TYPE_, :LANG);
  suspend;

end
      
      





これで、マイクロサービスリレーがこの特定の手順を実行する必要があることをどのように理解するか、どのパラメーターを持っているか、どのようにプルするかを理解できます。サンプルコード、コード内のコメントの詳細を示します




<?php

$proc_id=(int)$_POST['proc_id'];
$json= base64_decode($_POST['json']);

$arr_json = json_decode($json,true);

// JSON
switch (json_last_error()) {
   case JSON_ERROR_NONE:
      $err = null;
   break;
   case JSON_ERROR_DEPTH:
      $err = '   ';
   break;
   case JSON_ERROR_STATE_MISMATCH:
      $err = '     ';
   break;
   case JSON_ERROR_CTRL_CHAR:
      $err = '  ';
   break;
   case JSON_ERROR_SYNTAX:
      $err = ' ,   JSON';
   break;
   case JSON_ERROR_UTF8:
      $err = '  UTF-8,   ';
   break;
   default:
      $err = ' ';
   break;
}

//     JSON
if ($err==null) 
{
   
   //         ID
   $user_id=1;

   //     ID
   $sql_proc = "select p.name from DFM_PROC p where p.id=".$proc_id;
   $res_proc = ibase_query($dbh, $sql_proc);
   $prom_proc = ibase_fetch_row($res_proc);
   
   //     
   $sql_in='select ';
   
   //   , 
   //   RDB$PROCEDURE_PARAMETERS       
   $sql = 'select pp.rdb$parameter_number, pp.rdb$parameter_name from DFM_PROC p
left join RDB$PROCEDURE_PARAMETERS pp on pp.rdb$procedure_name=UPPER(p.name)
where p.id='.$proc_id.' and pp.rdb$parameter_type=1 --
order by pp.rdb$parameter_number';
   $res = ibase_query($dbh, $sql);
   $i_cou_out=0;
   while($prom = ibase_fetch_row($res))
   {
      //p. -     
      $i_cou_out++;
      if ($prom[0]>0) $sql_in.=','; 
      $sql_in.='p.'.$prom[1];
      
      $name_out[$prom[0]]=$prom[1];
   }
   
   //            -   
   $sql_in.=' from '.$prom_proc[0];
   
   //    ,    ,   execute procedure
   if ($i_cou_out==0) $sql_in='execute procedure '.$prom_proc[0];
   
   //      
   $sql = 'select
pp.rdb$parameter_number,
pp.rdb$parameter_name,
case
   when f.rdb$field_type=7 then 1 --smalint
   when f.rdb$field_type=8 then 2 --integer
   when f.rdb$field_type=16 and f.rdb$field_scale=0 then 3 --bigint
   when f.rdb$field_type=16 and f.rdb$field_scale<0 then 4 --frloat
   when f.rdb$field_type=12 then 5 --date
   when f.rdb$field_type=13 then 6 --time
   when f.rdb$field_type=35 then 7 --timestamp
   when f.rdb$field_type=37 then 8 --varcahr
end,
f.rdb$field_type, -- 
f.rdb$character_length, -- 
f.rdb$field_precision, -- 
f.rdb$field_scale -- 
from DFM_PROC p
left join RDB$PROCEDURE_PARAMETERS pp on pp.rdb$procedure_name=UPPER(p.name)
left join RDB$FIELDS f on f.rdb$field_name=pp.rdb$field_source
where p.id='.$proc_id.' and pp.rdb$parameter_type=0 --
order by pp.rdb$parameter_number';
   $res = ibase_query($dbh, $sql);
            
   $i_cou=0;
   while($prom = ibase_fetch_row($res))
   {
      $i_cou++;
      if ($prom[0]>0)  $sql_in.=','; else $sql_in.='(';
      
      
      if (($prom[2]==5)or($prom[2]==6)or($prom[2]==7)or($prom[2]==8))
         //    
         //    null
         if ($arr_json[$prom[0]]=='')
            $sql_in.="null";
         else
            $sql_in.="'".($arr_json[$prom[0]])."'";
      else
         //   
         if ($arr_json[$prom[0]]=='')
            $sql_in.="null";
         else
            $sql_in.=($arr_json[$prom[0]]);
      
   }
   
   //   
   if ($i_cou_out==0)
      {if ($i_cou>0) $sql_in.=')';}
   else
      {if ($i_cou>0) $sql_in.=') p'; else $sql_in.=' p';}
      //   p.   
   
   // 
   $res_in = ibase_query($dbh, $sql_in);
   
   
   if ($i_cou_out==0)
   {
      //    execute procedure
      $json_out='{
"error_json":"",
"error_code_json":"",
"result":" execute procedure",
"result_code":0
}'; 
   }
   else
   {
      //  json  
      $i_json=0;
      $json_out='{';
      while($prom_in = ibase_fetch_row($res_in))
      {
         if ($i_json>0) $json_out.=',';
         $json_out.='"'.$i_json.'":{';
         foreach($prom_in as $k => $v)
         {
            if ($k>0) $json_out.=',
';
            $json_out.='"'.trim($name_out[$k]).'":"'.$v.'"';
         }
         $json_out.='}';
         $i_json++;
      }
      $json_out.='}';
   }
   
   //      -   ,  ,  
   if (ibase_errmsg()=='')
   {
      //  
      echo $json_out;   
   }
   else
   {
      //   
      $err_json='{
"error_json":"'.$err.'",
"error_code_json":'.json_last_error().',
"result":"'.str_replace('"','\'',ibase_errmsg()).'",
"result_code":2,
"sql_err":"'.$sql_in.'"}';
      echo $err_json;
   }
   
            
}
else 
{
   //    JSON
   $err_json='{
"error_json":"'.$err.'",
"error_code_json":'.json_last_error().',
"result":" json",
"result_code":3
}';
   echo $err_json;   
   
}

?>

      
      





最終的に得られるもの。



1)マイクロサービスリレーを1回作成します。バックエンドアーキテクチャの残りの設計はすべてデータベースで行われます。 PHP(またはGo、Python、マイクロサービスとは何か)では、もう登りません。



たとえば、サイトで新しい機能が必要でした。フロントエンドが実行され、手順が実行されています。プロシージャはプレートに登録され、登録番号によってフロントエンドがマイクロサービスAPIを呼び出します。すべて。



Goでマイクロサービスリレーをコンパイル済みではるかに高速に作成することをお勧めします。利点は、一度だけ作成する必要があり、プログラムが複雑にならないことです。さらに、それは高負荷の要素になり、集中的な呼び出しが発生します。



FirebirdをGolandに接続するためのライブラリ: https://github.com/nakagami/firebirdsql



2)すべての処理はプロシージャに入ります-データベースレベルですべてを処理し、RESULTを生成するコンパイル済み要素を取得します。それら。操作が複数の選択、挿入、更新などで構成されている場合。ネットワークを介してデータをバックエンドに駆動するのではなく、データベースですぐに処理します。



さらに、プロシージャは、クエリプランが生成されたコンパイル済み要素です。これにもリソースは費やされません。



3)マイクロサービスリレーは、プロシージャを形成するために、データベースを4回参照します。



1.名前を取得します

2.アウトバウンドパラメータを

取得します 3.インバウンドパラメータを取得します

4.手順を実行します

普遍的な方法を考えたので4回。これは1回に減らすことができます。



方法:



1。たとえば、Webサーバーのテキストエディターにローカルに保存できます。定期的にこのテーブルをプルして、新しいテーブルが追加されたときに更新します。

2.3。同様に、何かが更新されたときに全体をプルすることで、ローカルに保存できます。



4)すべてのバックエンドをデータベースで実行できるわけではありません。これはすべての本質的な部分です が、便宜性を考慮してガイドする必要があります



たとえば、いくつかのチャット、郵送など。もちろん、Webサービスの生活の側面は、これに最も便利なプログラミング言語で個別のマイクロサービスとして実行する必要があります。Webサービスのすべてのロジックをベースに転送する必要はありません。これに便利な部分だけを転送する必要があります!



All Articles