# yh-cloudSPO-service
**Repository Path**: yunhe2021/yh-cloudSPO-service
## Basic Information
- **Project Name**: yh-cloudSPO-service
- **Description**: service layer of smart park operation cloud platform
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-10-15
- **Last Updated**: 2022-01-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SERVICE
[](https://github.com/shufengdong/service/releases)
[](#)
[](#)
[](#)
[](#)
[](#)
## 服务目录说明
基础服务统一放置于根目录,属于必需服务
- eureka 注册中心
- config 配置中心,通过github保存数据库及端口等配置信息
- gateway 网关服务中心,路由和过滤
- authority 权限管理中心
- job 任务调度中心
- log 日志管理中心
- common 公共工具包分组
- common-core 基础工具包
- common-dsa 鉴权相关工具包
- common-exception 异常相关工具包
- common-web 应用相关工具包(日志、请求头等)
- common-query 查询相关工具包
- common-external 第三方工具包
- common-jpa Jpa工具包(基础JAP仓库)
- common-neo4j Neo4j工具包(基础Neo4j仓库)
- base 基础业务分组(独立服务,一般情况下,服务间不可相互调用)
- device 设备管理
- meas-history 量测历史数据维护
- meas-realtime 量测实时数据维护
- option 基础设置服务
- biz 聚合服务分组(聚合服务,调用基础服务,且服务间可相互调用)
- task 定时任务处理服务
- alarm 异常管理
- energy 能耗管理
- forecast 数据预测
- control 控制管理
- project 交付项目服务分组
- xxx 与交付项目相关的定制服务
- other 其他服务分组(特殊服务)
- test 仅用于测试的项目
## 代码目录说明
```java
┌── build // 编译文件
├── src // 源码目录
│ ├── main
│ │ └── java
│ │ ├── com.yunhe.xxx // 代码主目录
│ │ │ ├── client // 作为客户端调用外部资源
│ │ │ │ ├── fallback // 调用失败后的处理类
│ │ │ │ │ └── XxxFallbackFactory.java
│ │ │ │ └── XxxClient.java // 客户端定义
│ │ │ ├── config // 配置类
│ │ │ │ └── XxxConfig.java
│ │ │ ├── constant // 常量类定义
│ │ │ │ └── XxxConsts.java
│ │ │ ├── controller // 控制器,处理请求入口
│ │ │ │ ├── base // 基础对象控制器
│ │ │ │ │ └── XxxController.java
│ │ │ │ └── data // 数据对象控制器
│ │ │ │ └── XxxController.java
│ │ │ ├── domain // 领域模型,存放DO类
│ │ │ │ ├── base // 基础对象模型
│ │ │ │ │ └── Xxx.java
│ │ │ │ └── data // 数据对象模型
│ │ │ │ └── Xxx.java
│ │ │ ├── model // 传输模型,存放DTO类
│ │ │ │ ├── base // 基础传输模型
│ │ │ │ │ └── Xxx.java
│ │ │ │ └── data // 基础传输模型
│ │ │ │ └── Xxx.java
│ │ │ │ └── authority // 权限传输模型
│ │ │ │ └── Xxx.java
│ │ │ │ └── device // 设备传输模型
│ │ │ │ └── Xxx.java
│ │ │ ├── repository // 持久化层,存放DAO类
│ │ │ │ ├── base // 基础对象持久化
│ │ │ │ │ └── XxxRepository.java
│ │ │ │ └── data // 数据对象持久化
│ │ │ │ └── XxxRepository.java
│ │ │ ├── service // 业务服务层
│ │ │ │ ├── base // 基础对象服务
│ │ │ │ │ ├── impl // 服务类实现
│ │ │ │ │ │ └── XxxServiceImpl.java
│ │ │ │ │ └── XxxService.java // 服务类接口
│ │ │ │ └── data // 数据对象服务
│ │ │ │ ├── impl // 服务类实现
│ │ │ │ │ └── XxxServiceImpl.java
│ │ │ │ └── XxxService.java // 服务类接口
│ │ │ ├── util // 工具类
│ │ │ │ └── XxxUtil.java // 工具类定义
│ │ │ └── websocket // WebSocket
│ │ │ └── XxxHandler.java
│ │ ├── resources // 自定义配置文件
│ │ │ └── xxx.properties
│ │ └── bootstrap.yml // 基础配置文件
│ └── test
│ └── java
│ └── com.yunhe.common // 单元测试主目录
│ └── xxx // 按业务区分单元测试
│ └── XxxTest.java // 单元测试类
└── build.gradle // 编译配置
```
## 项目配置说明
- Gralde:版本要求4.6
- JDK:版本要求8.0
## 项目启动指南
- 启动顺序
1. eureka:先启动注册中心
2. config:等注册中心启动完成后,启动配置中心,确保配置中心可以注册到注册中心
3. xxx:等配置中心启动完成后,就可以启动其他服务了
## 开发指南
### 服务划分
- 架构相关的服务放在1级文件夹(注册中心、网关、权限、任务调度中心、日志等)
- job:任务调度中心,所有定时或不定时任务,都通过该服务进行调度
- authority:鉴权和认证,包括用户、角色、单位、电站等相关内容
- log:日志管理
- common文件夹,存在各种DTO定义以及工具类定义
- base文件夹,存放基础业务,基础业务服务为独立服务,满足独立的基础功能,服务间不可相互调用
- biz文件夹,存放聚合服务,聚合服务为第1层聚合服务,按照业务模块进行划分,服务间允许单向调用,但需要避免出现互相调用的情况
- project文件夹,存放项目服务,项目服务为第2层聚合服务,按照项目的特殊需要,调用基础服务和业务服务完成特有的功能
### 开发说明
#### 服务间调用
1. 被调用的服务必须注册到Eureka上,使用`@FeignClient`注解来调用,代码放client包下
2. 使用Hystrix断路器,在`@FeignClient`中添加fallbackFactory:
```java
@FeignClient(value = "authority", fallbackFactory = AuthorityFallbackFactory.class)
public interface AuthorityClient {
@RequestMapping(value = "/{systemId}/firms/{id}/resources", method = RequestMethod.POST)
ResponseEntity firmBindResource(@PathVariable("systemId") Long systemId,
@PathVariable("id") Long id,
@RequestParam("type") String type,
@RequestParam("resourceId") Long resourceId);
@RequestMapping(value = "/{systemId}/stations/{id}/resources", method = RequestMethod.POST)
ResponseEntity stationBindResource(@PathVariable("systemId") Long systemId,
@PathVariable("id") Long id,
@RequestParam("type") String type,
@RequestParam("resourceId") Long resourceId);
}
```
3. client.fallback包存放中断路器工厂类,如果没特殊处理,则调用`FallbackUtil.getDefaultFallBack()`进行默认返回:
```java
@Component
public class AuthorityFallbackFactory implements FallbackFactory {
@Override
public AuthorityClient create(Throwable arg0) {
return new AuthorityClient() {
@Override
public ResponseEntity firmBindResource(Long systemId,
Long id,
String type,
Long resourceId) {
return FallbackUtil.getDefaultFallBack();
}
@Override
public ResponseEntity stationBindResource(Long systemId,
Long id,
String type,
Long resourceId) {
return FallbackUtil.getDefaultFallBack();
}
};
}
}
```
#### 定时任务添加流程
1. 任务定义:在biz/task服务中在编写任务要执行的方法,并通过Controller暴露,任务方法中如需要调用其他服务的内容,使用Feign方式调用
2. 插入任务:通过job服务提供的在线API,添加ElasticJobBean对象,对象中的taskUrl属性为上一步骤中通过Controller暴露的URL
#### DO和DTO互转
1. 引入依赖`common-mapstruct`:
```java
compile project(':common:common-mapstruct')
```
2. 新增互转接口,继承`BasicObjectMapper`接口:
```java
public interface StationMapper extends BasicObjectMapper {
}
```
3. 调用互转接口:
```java
@Autowired
private StationMapper stationMapper;
...
stationMapper.to(station);
stationMapper.from(stationDTO);
```
### SQL监控
- 通过Druid提供SQL监控页面,访问地址为:http://localhost:port/druid/weburi.html
### 日志监控
- 通过Elasticsearch + Logstash + Kibana实现日志收集和展示
- 通过Kibana提供日志监控页面,访问地址为:http://localhost:5601