コールバックイベントインタフェース設計ソリューション


1、背景
多くの業務システムは、自身の業務を第三者サービスに一括して提出し、第三者業務システムに処理を依頼し、処理が終了すると、非同期にコールバックイベントを通じて、処理結果を現在の業務システムに返信する.本論文では,イベントコールバックインタフェースの設計に対してソリューションを提案する.
2、インタフェースの設計
21.三者コールバック要求インタフェースの設計
3つのシステムは、処理結果をインタフェースを通じて現在のシステムに一括送信する.
1)一般的にpostリクエスト、jsonフォーマット、配列形式で送信する.
2)再送メカニズムを増設し、一度送信に失敗したら、長くなって定期的に再送する.
3)再送上限を設定し、過度な無効要求を避ける;
4)受信者からの返信を受けていない場合、次回の再送要求を実行せず、受信者が短時間でデータを繰り返し受信し、メモリの過負荷を招くことを避ける.
5)時間の許す限り,手動で発行しないウェブページ機能を増設することができる.
2.3.受取側インタフェースの設計
1)受け手は,データを受け取り,MQを用いて非同期化を行い,未処理の場合,非同期応答の三者は受け止めることに成功した.
2)受信側はデータを受信し、メッセージキューMQにプッシュする.
3)データ処理サーバでは,傍受を作成し,MQメッセージを受け取り,非同期処理を行う.
メリット:
①メモリの圧力を避けるために、データを迅速に転送する.
②データ処理業務を対応するデータ処理サーバに移行し、機能をデカップリングする.
③同期処理を避け、異常が発生した場合、異常処理メカニズムができていないため、書き込み全体が失敗したり、一部が失敗したりする場合.
3、安全メカニズム
3.1、署名メカニズムを増加する
一般的には、json列の一部のデータに対して署名を計算し、パラメータとして送信し、受信者は同じアルゴリズムに従って約束した一部のデータを計算し、署名パラメータ値を検証し、以下の例を挙げる.
package com.ddyunf.cloud.common.utils;

import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Created by Liuxd on 2018-06-21.
 */
public class SignatureUtil {

    /**
     *   MD5    
     *
     * @param str        
     * @return        
     * @throws NoSuchAlgorithmException                  
     * @throws UnsupportedEncodingException
     */
    public static String EncoderByMd5(String str) {
        BASE64Encoder base64en = new BASE64Encoder();
        String newstr = null;
        try {
            //      
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            //       
            newstr = base64en.encode(md5.digest(str.getBytes("utf-8")));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return newstr;
    }

    public static String getMD5_32Byte(String str) {
        try {
            //     MD5      
            MessageDigest md = MessageDigest.getInstance("MD5");
            //   md5  
            md.update(str.getBytes());
            // digest()      md5 hash ,    8    。  md5 hash  16  hex ,     8    
            // BigInteger    8        16 hex ,       ;        hash 
            String md5=new BigInteger(1, md.digest()).toString(16);
            //BigInteger  0   ,    32 
            return fillMD5(md5);
        } catch (Exception e) {
            throw new RuntimeException("MD5    :"+e.getMessage(),e);
        }
    }

    public static String fillMD5(String md5){
        return md5.length()==32?md5:fillMD5("0"+md5);
    }

    public static void main(String[] args) throws Exception {
        String str = "abcdef";
        String strAfterCode = EncoderByMd5(str);
        System.out.println("   :" + str);
        System.out.println("   :" + strAfterCode);
        System.out.println("     :" + strAfterCode.length());

        String str2 = "lee81g";
        System.out.println("md5:"+ getMD5_32Byte(str2));
        System.out.println("length:"+ getMD5_32Byte(str2).length());

    }

}

3.2、データを暗号化する
データ・コードの表示を避け、データ・コードの転送を避ける.
package com.ddyunf.cloud.teletraffic.third.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.SecureRandom;

/**
 *  Des        
 *
 */
public class DESDateUtils {

	private static Key key;  
    private static String KEY_STR="keySecret";//          
      
    static{  
        try  
        {  
            KeyGenerator generator = KeyGenerator.getInstance("DES");  
            SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");  
            secureRandom.setSeed(KEY_STR.getBytes());  
            generator.init(secureRandom);  
            key = generator.generateKey();  
            generator=null;  
        }  
        catch (Exception e)  
        {  
            throw new RuntimeException(e);  
        }  
    }  
      
    /** 
     *         ,  BASE64       
     *  
     * @param str 
     * @return 
     * @see [ 、 #  、 #  ] 
     */  
    public static String getEncryptString(String str){  
        BASE64Encoder base64Encoder = new BASE64Encoder();  
//        System.out.println(key);  
        try  
        {  
            byte[] strBytes = str.getBytes("UTF-8");  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.ENCRYPT_MODE, key);  
            byte[] encryptStrBytes = cipher.doFinal(strBytes);  
            return base64Encoder.encode(encryptStrBytes);  
        }  
        catch (Exception e)  
        {  
            return "-1";
        }  
          
    }  
      
    /** 
     *  BASE64          
     *  
     * @param str 
     * @return 
     * @see [ 、 #  、 #  ] 
     */  
    public static String getDecryptString(String str){  
        BASE64Decoder base64Decoder = new BASE64Decoder();  
        try  
        {  
            byte[] strBytes = base64Decoder.decodeBuffer(str);  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.DECRYPT_MODE, key);  
            byte[] encryptStrBytes = cipher.doFinal(strBytes);  
            return new String(encryptStrBytes,"UTF-8");  
        }  
        catch (Exception e)  
        {  
        	 return "-1";
        }  
          
    }

    public static void main(String[] args) {
        String str = "abc123";

        String afterEncode = getEncryptString(str);

        String afterDecode = getDecryptString(afterEncode);

        System.out.println(str);
        System.out.println(afterEncode);
        System.out.println(afterDecode);
    }
}

3.3、ファイアウォールホワイトリストの配置
送信側と受信側のサーバは、ファイアウォールを開き、各ファイアウォールに互いのサーバの出口ipを配置する
以上は本人で、设计と开発の中の総括で、至らないところはまた伝言を残して贵重な意见を出してもらって、共に交流することを望んで、コールバックの事件のインタフェースの処理の更に完璧です.