项目作者: everyhook1

项目描述 :
simple java netty rpc
高级语言: Java
项目地址: git://github.com/everyhook1/badger-framework.git
创建时间: 2021-06-09T12:26:18Z
项目社区:https://github.com/everyhook1/badger-framework

开源协议:Apache License 2.0

下载


badger-framework

A simple Netty Rpc implement tcc

All the examples are implemented in the module badger-example

Performance

avatar
avatar

How To Use RPC

provider

  1. rpc:
  2. serviceName: badger-example
  3. port: 11311
  4. zk:
  5. address: 127.0.0.1:2181
  1. @RpcProvider
  2. public interface UserInfo {
  3. String echo(String str);
  4. }

consumer

  1. zk:
  2. address: 127.0.0.1:2181
  1. @RpcProxy(serviceName = "badger-example")
  2. public interface UserInfo {
  3. String echo(String str);
  4. }

assume you already have a local zookeeper.

  1. start zookeeper
  2. start provider
  3. start consumer
  4. curl http://127.0.0.1:8080/echo?str=abc

then you would get response:
echo from server abc

  1. jmeter -n -t rpcTest.jmx -l a -e -o b

How To Run Tcc Example

1) Run badger-tcc-coordinator
2) Run badger-example/consumer

  1. create table if not exists `dba`
  2. (
  3. `id` BIGINT unsigned NOT NULL AUTO_INCREMENT,
  4. `cnt` INT NOT NULL,
  5. `reserving` INT NOT NULL,
  6. `version` INT NOT NULL,
  7. `dbctime` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
  8. `dbutime` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
  9. PRIMARY KEY (`id`)
  10. ) ENGINE = InnoDB
  11. AUTO_INCREMENT = 1
  12. DEFAULT CHARSET = utf8mb4;
  13. INSERT INTO `dba`
  14. SET `id` = 1,
  15. `cnt` = 100,
  16. `reserving` = 0,
  17. `version` = 0;
  1. @Autowired
  2. @RpcProxy(serviceName = "badger-backend", qualifier = "tccBackend")
  3. private TccBackend tccBackend;
  4. @Autowired
  5. @RpcProxy(serviceName = "badger-example", qualifier = "tccProvider")
  6. private TccProvider tccProvider;
  7. @Compensable(identifier = "account", tryMethod = "tryM", confirmMethod = "confirmM", cancelMethod = "cancelM")
  8. public void tryM(int a, int b) {
  9. log.info("tryM {} {}", a, b);
  10. DataA dataA = db.queryForObject("select * from dba where id = :id", ImmutableMap.of("id", a),
  11. (rs, rowNum) -> {
  12. DataA obj = new DataA();
  13. obj.id = rs.getInt("id");
  14. obj.cnt = rs.getInt("cnt");
  15. obj.reserving = rs.getInt("reserving");
  16. obj.version = rs.getInt("version");
  17. return obj;
  18. });
  19. assert dataA != null;
  20. if ((dataA.cnt - dataA.reserving) < b) {
  21. throw new RuntimeException("DataA.cnt < b" + dataA + " " + b);
  22. }
  23. tccProvider.tryProvider(a, b);
  24. tccBackend.tryBackend(a, b);
  25. int res = db.update("update dba set reserving = reserving + :b,`version` = `version` + 1 where id = :id and `version` = :version", ImmutableMap.of("id", a, "b", b, "version", dataA.version));
  26. if (res == 0) {
  27. throw new RuntimeException("not change success" + dataA + " " + b);
  28. }
  29. }
  30. @Compensable(identifier = "account", tryMethod = "tryM", confirmMethod = "confirmM", cancelMethod = "cancelM")
  31. public void confirmM(int a, int b) {
  32. log.info("confirmM {} {}", a, b);
  33. db.update("update dba set cnt = cnt - :b, reserving = reserving - :b,`version` = `version` + 1 where id = :id", ImmutableMap.of("id", a, "b", b));
  34. }
  35. @Compensable(identifier = "account", tryMethod = "tryM", confirmMethod = "confirmM", cancelMethod = "cancelM")
  36. public void cancelM(int a, int b) {
  37. log.info("cancelM {} {}", a, b);
  38. db.update("update dba set reserving = reserving - :b,`version` = `version` + 1 where id = :id", ImmutableMap.of("id", a, "b", b));
  39. }

3) Run badger-example/provider
4) Run badger-example/backend

then execute the shell below two times

  1. curl http://127.0.0.1:8080/try?a=1&b=50

first time will execute success,second execute failed.

Kubernetes

assume you already install docker and kind.

  1. # create a cluster with local registry
  2. sh kind-with-registry.sh
  3. sh deploy.sh
  4. kubectl port-forward service/consumer 8080:8080
  5. curl http://127.0.0.1:8080/echo?str=abc

RoadMap

  • trace
  • [X] transaction

HAVE FUN!