# 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://img.shields.io/badge/当前版本-v2.0.0-orange.svg?style=plastic)](https://github.com/shufengdong/service/releases)
[![SpringBoot](https://img.shields.io/badge/SpringBoot-v2.1.6-green.svg)](#) [![网关](https://img.shields.io/badge/网关-gateway-green.svg)](#) [![Web容器](https://img.shields.io/badge/Web容器-undertow-green.svg)](#) [![日志管理](https://img.shields.io/badge/日志管理-ELK-green.svg)](#)
[![Java](https://img.shields.io/badge/Java-v1.8-green.svg?style=social&logo=java)](#) ## 服务目录说明 基础服务统一放置于根目录,属于必需服务 - 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