-
Notifications
You must be signed in to change notification settings - Fork 8.8k
Quick Start
sharajava edited this page Jan 9, 2019
·
19 revisions
Let's begin with a Microservices example.
A business logic for user purchasing commodities. The whole business logic is powered by 3 microservices:
- Storage service: deduct storage count on given commodity.
- Order service: create order according to purchase request.
- Account service: debit the balance of user's account.
public interface StorageService {
/**
* deduct storage count
*/
void deduct(String commodityCode, int count);
}
public interface OrderService {
/**
* create order
*/
Order create(String userId, String commodityCode, int orderCount);
}
public interface AccountService {
/**
* debit balance of user's account
*/
void debit(String userId, int money);
}
public class BusinessServiceImpl implements BusinessService {
private StorageService storageService;
private OrderService orderService;
/**
* purchase
*/
public void purchase(String userId, String commodityCode, int orderCount) {
storageService.deduct(commodityCode, orderCount);
orderService.create(userId, commodityCode, orderCount);
}
}
public class OrderServiceImpl implements OrderService {
private OrderDAO orderDAO;
private AccountService accountService;
public Order create(String userId, String commodityCode, int orderCount) {
int orderMoney = calculate(commodityCode, orderCount);
accountService.debit(userId, orderMoney);
Order order = new Order();
order.userId = userId;
order.commodityCode = commodityCode;
order.count = orderCount;
order.money = orderMoney;
// INSERT INTO orders ...
return orderDAO.insert(order);
}
Property | Column | Type | Key |
---|---|---|---|
Storage ID | id | int | PK |
Commodity Code | commodity_code | string | UK |
Storage Count | count | int |
Property | Column | Type | Key |
---|---|---|---|
Order ID | id | int | PK |
User ID | user_id | string | |
Commodity Code | commodity_code | string | |
Order Count | count | int | |
Order Money | money | int |
Property | Column | Type | Key |
---|---|---|---|
Account ID | id | int | PK |
User ID | user_id | string | UK |
Balance | money | int |
DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
We just need an annotation @GlobalTransactional
on business method:
@GlobalTransactional
public void purchase(String userId, String commodityCode, int orderCount) {
......
}