求JAVA中gcb函数_libgsc的java实现

花了约7天的时间用java又实现了一遍. 编程方式相比c++的版本有很大不同, 基本上是一种面向future的编程风格.  主要是期望在业务不复杂的

情况下, 可以在一个屏幕做完所有的事, 避免消息指令定义, 减少寻找回调的麻烦. 下面是一个demo.

/** 提交一个ITC事务, 由Gas-Actor向Db-Actor发送消息, 并期待响应, 请求的参数是一个Boolean, 响应的也是一个Boolean. */

Gsc.future(new GitcTrans(Gas.instance() /* from */, Db.instance() /* to */, null /* 消息. */)

{

/** 请求到来, 由Db-Actor所在的线程调用request函数, 因此这里Db-Actor可以安全做它自己的事. */

public Boolean req(Db db, Boolean req)

{

return db.loadDb(); /* 加载数据库, 并返回结果. */

}

/** 响应到来, 由Gas-Actor所在的线程调用response函数, 并携带之前的request, 和上面的返回值. */

public void rsp(Gas gas, Boolean req, Boolean rsp)

{

if (!rsp) /* 加载数据库失败, 退出. */

System.exit(1);

Gcb.init();

if (!Gsc.publish())

System.exit(1);

}

/** 超时, libgsc有一个默认值, 一样是由Gas-actor所在的线程调用, 并携带从事务提交到当前逝去的毫秒数. */

public void timeout(Gas gas, Boolean req, long elap)

{

}

});

与java/scala的future类似, Gsc.future(...)总是立即返回,  内部GitcTrans对象的req/rsp/timeout函数都通过libgsc内部消息总线进行路由调用.

libgsc保证req函数总是由目标Actor所在的线程调用, rsp/timeout总是由消息发起方Actor所在的线程调用.

libgsc提供三个主要的future函数, 适用于不同的场景

1. 参数为GitcTrans, 就是上面demo中的场景, 一个actor向另一个actor发送请求, 并期待响应, 等不到响应的时候, 就一定会等到超时.

这种场景设计被用于数据库操作, 也就是允许适当的阻塞. 因此才定义了一个超时函数.  实际上上面的Db-Actor拥有自己独立的线

程或线程池, 以避免IO中断时, 阻塞libgsc的消息总线.

2. 参数为GitcNot, 适用于一个actor向另一个actor发送通知, 不需要响应. demo如下:

Gsc.future(new GitcNot(n2h, Db.instance(), req)

{

public void not(Db db, GcAuthWithGasReq req)

{

GcAuthWithGasRsp rsp = db.authGc(req);

if (rsp == null)

gt.endRet(Gsc.RET_INVALID);

else

gt.endSuccess(rsp);

}

});

3. 参数为Gh2nTrans, H2N即host到network方向, 也就是libgsc向外的网络连接Actor对象. 适用于libgsc(作client)向其它网元(作server)

发送消息, 并期待响应, demo如下:

Gas gas = new Gas(Net.getAddr("192.168.8.129", 1225)); /* 创建一个H2N-Actor. */

Misc.sleep(1000); /* 等待连接建立. */

GsAuthWithGasReq auth = GsAuthWithGasReq.newBuilder().setKey(ByteString.copyFromUtf8("auth-info")).build();

Gsc.future(new Gh2nTrans(CmdGas.GAS_REQ_GS_AUTH.ordinal(), Gsc.instance(), gas, auth)

{

public void rsp(Gas gas, GsAuthWithGasReq req, GsAuthWithGasRsp rsp)

{

Log.info("req: %s, rsp: %s", Misc.pb2str(req), Misc.pb2str(rsp));

}

public void timeout(Gsc gsc, GsAuthWithGasReq req, long elap)

{

Log.info("req: %s", Misc.pb2str(req));

}

});与其它的future调用不同的时, Gh2nTrans的由libgsc自动处理发送(到网络上)请求(上面的auth对象),  响应消息则是由H2N-Actor所在的线程调用,

在上面的例子中, 是Gas. 简单来说, Gh2nTrans就是发送一个请求消息到其它网元, libgsc在收到响应后, 调用rsp函数, 如果等不到rsp, 就一定会

等到timeout.

libgsc的消息总线设计沿用了c++版本的方式, 通过pipe进行线程间通信.  当然, java中无法前转指针, 所以使用了一个ConcurrentLinkedQueue, 先将消

息入队, 如果发现目标线程空闲, 就发送一个字节的消息到selector, 唤醒目标线程.  目标线程醒来后, 一次会将队列中的消息全部取完. 这种方式要比直

接在管道中传递指针更高效,  当然, 队列换成ringbuf, 或者disruptor可能还会更好.

基于上面的设计,  在centos6.6 x86_64bit,  四核i5cpu的机器上测试了一下.  一个TCP连接, 利用127.0.0.1 whie(true)发送约200个字节的pb消息到 libgsc,

libgsc再经过两不同线程的actor交互处理结果.  吞吐量约为15万个事务/s, 极端情况下为30万/s.

----------------------------------------------------------------------------

c++11中, 利用lamda, 也可以实现这种面向future编程方式. 并且看起来比java的实现更舒服, 如果还能做到像libcaf那样省掉模板参数就更完美了.

水平有限, 还需要努力.

string req = "foo";

NetActor* from = NULL;

NetActor* to = NULL;

Gsc.future(new Future(from, to, &req, //

[](NetActor* t, string* req)-> string*

{

return new string("bar");

},

//

[](NetActor* f, string* rsp)

{

},

//

[](NetActor* f, string* req, long elap)

{

}));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCM (Galois/Counter Mode) 是一种常用的块密码模式,用于实现高级加密标准 (AES) 等对称加密算法的实时、高效的数据加密。在Java,GCM模式通常通过`javax.crypto.Cipher`类及其`GCM`实例化模式来使用。 GCB (Generic Counter Block) 是GCM的变种,全称为GCM and CBC mode, 它结合了GCM的加密和完整性检查功能以及CBC(Cipher Block Chaining)模式的顺序模式,用于连续的数据块加密。这种模式通常用于加密大量数据时,需要同时保证速度和安全性。 以下是一个简单的Java示例,演示如何使用AES-GCM进行加密和解密: ```java import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; import java.security.Key; public class AESGCMExample { private static final String ALGORITHM = "AES/GCM/NoPadding"; public static void main(String[] args) { try { // 1. 获取密钥 Key secretKey = generateKey(); // 2. 初始化加密器(GCM模式) Cipher cipher = Cipher.getInstance(ALGORITHM); GCMParameterSpec gcmSpec = new GCMParameterSpec(128, keyLength(secretKey)); // 128位的nonce // 加密 byte[] plaintext = "Your message here".getBytes(); // 待加密的数据 cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmSpec); byte[] ciphertext = cipher.doFinal(plaintext); // 3. 初始化解密器(GCM模式) cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmSpec); byte[] decryptedText = cipher.doFinal(ciphertext); // 输出结果 System.out.println("Original Text: " + new String(plaintext)); System.out.println("Encrypted Text: " + Arrays.toString(ciphertext)); System.out.println("Decrypted Text: " + new String(decryptedText)); } catch (Exception e) { e.printStackTrace(); } } // 辅助方法生成AES密钥 private static Key generateKey() { // 实际应用,密钥通常从安全来源获取并进行妥善管理 byte[] keyBytes = new byte[16]; // AES-128使用16字节 // ... return new SecretKeySpec(keyBytes, "AES"); } // 获取密钥长度 private static int keyLength(Key key) { return key.getEncoded().length / 8; // AES使用8字节为一个字节 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值