コールバックイベントインタフェース設計ソリューション
6094 ワード
1、背景
多くの業務システムは、自身の業務を第三者サービスに一括して提出し、第三者業務システムに処理を依頼し、処理が終了すると、非同期にコールバックイベントを通じて、処理結果を現在の業務システムに返信する.本論文では,イベントコールバックインタフェースの設計に対してソリューションを提案する.
2、インタフェースの設計
21.三者コールバック要求インタフェースの設計
3つのシステムは、処理結果をインタフェースを通じて現在のシステムに一括送信する.
1)一般的にpostリクエスト、jsonフォーマット、配列形式で送信する.
2)再送メカニズムを増設し、一度送信に失敗したら、長くなって定期的に再送する.
3)再送上限を設定し、過度な無効要求を避ける;
4)受信者からの返信を受けていない場合、次回の再送要求を実行せず、受信者が短時間でデータを繰り返し受信し、メモリの過負荷を招くことを避ける.
5)時間の許す限り,手動で発行しないウェブページ機能を増設することができる.
2.3.受取側インタフェースの設計
1)受け手は,データを受け取り,MQを用いて非同期化を行い,未処理の場合,非同期応答の三者は受け止めることに成功した.
2)受信側はデータを受信し、メッセージキューMQにプッシュする.
3)データ処理サーバでは,傍受を作成し,MQメッセージを受け取り,非同期処理を行う.
メリット:
①メモリの圧力を避けるために、データを迅速に転送する.
②データ処理業務を対応するデータ処理サーバに移行し、機能をデカップリングする.
③同期処理を避け、異常が発生した場合、異常処理メカニズムができていないため、書き込み全体が失敗したり、一部が失敗したりする場合.
3、安全メカニズム
3.1、署名メカニズムを増加する
一般的には、json列の一部のデータに対して署名を計算し、パラメータとして送信し、受信者は同じアルゴリズムに従って約束した一部のデータを計算し、署名パラメータ値を検証し、以下の例を挙げる.
3.2、データを暗号化する
データ・コードの表示を避け、データ・コードの転送を避ける.
3.3、ファイアウォールホワイトリストの配置
送信側と受信側のサーバは、ファイアウォールを開き、各ファイアウォールに互いのサーバの出口ipを配置する
以上は本人で、设计と开発の中の総括で、至らないところはまた伝言を残して贵重な意见を出してもらって、共に交流することを望んで、コールバックの事件のインタフェースの処理の更に完璧です.
多くの業務システムは、自身の業務を第三者サービスに一括して提出し、第三者業務システムに処理を依頼し、処理が終了すると、非同期にコールバックイベントを通じて、処理結果を現在の業務システムに返信する.本論文では,イベントコールバックインタフェースの設計に対してソリューションを提案する.
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を配置する
以上は本人で、设计と开発の中の総括で、至らないところはまた伝言を残して贵重な意见を出してもらって、共に交流することを望んで、コールバックの事件のインタフェースの処理の更に完璧です.