# mod
**Repository Path**: wangyongxu/mod
## Basic Information
- **Project Name**: mod
- **Description**: 分布式和单体式自由组装
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-07
- **Last Updated**: 2021-08-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mod
#### 介绍
分布式和单体式自由组装框架,基于dubbo的简单实现,技术可行性研究。
#### 软件架构
软件架构说明
#####
目录结构:
```
mod
├── mod-api mod相关的API
├── mod-autoconfiguration // 基于spring的mod自动配置
├── mod-distribute // 分布式实现
├── mod-monolith // 单体式实现
└── mod-sample // 使用示例,包括单体式和分布式
├── application-distribute // 分布式示例,包含启动类、生产者service和消费者service
│ ├── application-distribute-consumer // 消费者启动应用service
│ └── application-distribute-provider // 生产者启动应用service
├── application-monolith // 单体式应用
├── mod-sample-consumer // 业务模块 消费者
├── mod-sample-provider // 业务模块 生产者
└── mod-sample-provider-api // 业务模块 生产者api
```
`mod-api`,`mod-distribute`, `mod-monolith`, `mod-autoconfiguration`是mod相关的实现和配置,
`mod-sample`是使用示例,包括分布式和单体式的示例.
#### 使用说明
1.打包本工程 `mvn install`
2.引入依赖, 2选一:
```xml
org.example
mod-distribute-spring-boot-starter
1.0-SNAPSHOT
org.example
mod-monolith-spring-boot-starter
1.0-SNAPSHOT
```
3.使用注解 `@ModService`和 `@ModInject`
##### 注解使用示例
**生产者**
```java
@ModService
public class EmailServiceImpl implements EmailService {
private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);
@Override
public String send(String receiver, String msg) {
logger.info("send msg: {} to : {}", msg, receiver);
return "send msg: " + msg;
}
}
```
**消费者**
```java
@Service
public class UserServiceImpl implements UserService {
private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@ModInject
private EmailService emailService;
@Override
public String sayHi(String to, String msg) {
logger.info("say hi: {}, msg: {}", to, msg);
emailService.send(to, msg);
return "ok";
}
}
```
Demo见`mod-sample包`
#### Demo
mod-sample中 `mod-sample-consumer`是业务功能的消费者,`mod-sample-provider`是业务功能提供者, `application-*`是2个进程启动包,分别是单体式和分布式。
在`application-monolith`中,引入了`mod-sample-consumer`和`mod-sample-provider`,配合`mod-monolith-spring-boot-starter`。
在`application-distribute`中,`application-distribute-consumer`引入了`mod-sample-consumer`; `application-distribute-provider`引入了`mod-sample-provider`,配合`mod-distribute-spring-boot-starter`。
##### 运行
1. 验证单体式
运行`application-monolith`的`MonolithApp`,启动完成后运行,返回ok:
```shell script
curl --request GET -sL \
--url 'http://localhost:8082/user/sayHi'
```
可以在控制台看到
```
2021-07-09 14:11:21.042 INFO 8140 --- [nio-8082-exec-2] c.e.m.s.c.service.UserServiceImpl : say hi: jack, msg: hello
2021-07-09 14:11:21.044 INFO 8140 --- [nio-8082-exec-2] c.e.m.sample.provider.EmailServiceImpl : send msg: hello to : jack
```
2. 验证分布式
a. 启动consul(默认使用了consul,可使用[consul-docker-compose](./consul-docker-compose.yml))
b. 运行生产者服务`application-distribute-provider`的`DistributeProviderApp`和消费者服务`application-distribute-consumer`的`DistributeConsumerApp`
启动完成后运行, 返回ok
```shell script
curl --request GET -sL \
--url 'http://localhost:28877/user/sayHi'
```
可以在消费者服务中看到日志:
```
2021-07-09 13:44:23.065 INFO 2036 --- [io-28877-exec-8] c.e.m.s.c.service.UserServiceImpl : say hi: jack, msg: hello
```
在提供者服务中看到日志
```
2021-07-09 13:44:23.067 INFO 25788 --- [:20880-thread-3] c.e.m.sample.provider.EmailServiceImpl : send msg: hello to : jack
```
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request