Browse Source

可视化后台服务管理 - 路由服务开发

liukx@elab 4 years ago
parent
commit
9917c5a336
100 changed files with 1250 additions and 3047 deletions
  1. 0 332
      elab-backstage-api/src/main/java/com/elab/backstage/models/entitys/BackstageRoute.java
  2. 0 239
      elab-backstage-api/src/main/java/com/elab/backstage/models/request/BackstageRoutePageRequest.java
  3. 0 19
      elab-backstage-api/src/main/java/com/elab/backstage/services/IBackstageRouteService.java
  4. 0 17
      elab-backstage-client/src/main/java/com/elab/backstage/client/EnableBackstageData.java
  5. 0 133
      elab-backstage-client/src/main/java/com/elab/backstage/client/TcpSocketSender.java
  6. 0 26
      elab-backstage-client/src/main/java/com/elab/backstage/client/config/ClientConfigManager.java
  7. 0 69
      elab-backstage-client/src/main/java/com/elab/backstage/client/config/ClientConfiguration.java
  8. 0 127
      elab-backstage-client/src/main/java/com/elab/backstage/client/filter/ZuulDataFilter.java
  9. 0 13
      elab-backstage-client/src/main/java/com/elab/backstage/client/handler/ConnectHandler.java
  10. 0 31
      elab-backstage-client/src/main/java/com/elab/backstage/client/handler/ConnectHandlerAdapter.java
  11. 0 50
      elab-backstage-client/src/main/java/com/elab/backstage/client/handler/RegisterConnectHandler.java
  12. 0 530
      elab-backstage-client/src/main/java/com/elab/backstage/client/message/ChannelManager.java
  13. 0 14
      elab-backstage-client/src/main/java/com/elab/backstage/client/params/ParamsGenerate.java
  14. 0 12
      elab-backstage-client/src/main/java/com/elab/backstage/client/sender/MessageSender.java
  15. 0 36
      elab-backstage-client/src/main/java/com/elab/backstage/client/utils/AddressUtils.java
  16. 0 124
      elab-backstage-client/src/main/java/com/elab/backstage/client/utils/Splitters.java
  17. 0 38
      elab-backstage-client/src/test/java/com/elab/backstage/client/TcpSocketSenderTest.java
  18. 0 65
      elab-backstage-client/src/test/java/com/elab/backstage/client/config/ClientConfigurationTest.java
  19. 0 55
      elab-backstage-core/src/main/java/com/elab/backstage/core/codec/ProtostuffDecoder.java
  20. 0 45
      elab-backstage-core/src/main/java/com/elab/backstage/core/codec/ProtostuffEncoder.java
  21. 0 26
      elab-backstage-core/src/main/java/com/elab/backstage/core/enums/MessageConstant.java
  22. 0 62
      elab-backstage-core/src/main/java/com/elab/backstage/core/enums/MessageEnums.java
  23. 0 73
      elab-backstage-core/src/main/java/com/elab/backstage/core/handler/NettyServerHandler.java
  24. 0 12
      elab-backstage-core/src/main/java/com/elab/backstage/core/handler/OfflineHandler.java
  25. 0 35
      elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessage.java
  26. 0 207
      elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessageData.java
  27. 0 36
      elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessageRequest.java
  28. 0 68
      elab-backstage-core/src/main/java/com/elab/backstage/core/message/DomainData.java
  29. 0 15
      elab-backstage-core/src/main/java/com/elab/backstage/core/process/MessageProcess.java
  30. 0 22
      elab-backstage-core/src/main/java/com/elab/backstage/core/process/RegisterProcess.java
  31. 0 13
      elab-backstage-core/src/main/java/com/elab/backstage/core/process/TypeProcess.java
  32. 0 123
      elab-backstage-core/src/main/java/com/elab/backstage/core/server/TcpSocketReceiver.java
  33. 0 37
      elab-backstage-service/src/main/java/com/elab/backstage/config/BeanConfig.java
  34. 0 53
      elab-backstage-service/src/main/java/com/elab/backstage/process/MapRegisterProcess.java
  35. 0 81
      elab-backstage-service/src/main/java/com/elab/backstage/process/URLMessageProcess.java
  36. 0 1
      elab-backstage-service/src/main/resources/META-INF/app.properties
  37. 0 1
      elab-backstage-service/src/main/resources/META-INF/spring.factories
  38. 0 15
      elab-backstage-service/src/test/java/com/elab/backstage/BaseCase.java
  39. 0 21
      elab-backstage-service/src/test/java/com/elab/backstage/models/response/RouteDataResponseTest.java
  40. 0 32
      elab-backstage-service/src/test/java/com/elab/backstage/services/IRouteDataServiceTest.java
  41. 0 46
      elab-backstage-service/src/test/java/com/elab/backstage/services/impl/BackstageRouteServiceImplTest.java
  42. 3 3
      elab-backstage-api/pom.xml
  43. 101 0
      jay-monitor-data-client/README.md
  44. 15 5
      elab-backstage-client/pom.xml
  45. 100 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorDataClient.java
  46. 48 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/ClientMonitorAutoConfiguration.java
  47. 54 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/props/MonitorProperties.java
  48. 48 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/props/SQLMonitorProperties.java
  49. 53 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/filter/DruidMonitorFilter.java
  50. 0 0
      jay-monitor-data-client/src/test/resources/application.yml
  51. 16 23
      elab-backstage-core/pom.xml
  52. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/enums/CommonErrors.java
  53. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/enums/EnumService.java
  54. 27 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MonitorDataConstants.java
  55. 12 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MsgTypeEnums.java
  56. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/exception/BusinessException.java
  57. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/exception/MessageTypeException.java
  58. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ListResponseModel.java
  59. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ObjectResponseModel.java
  60. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageInfoModel.java
  61. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageRequestModel.java
  62. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageResponseModel.java
  63. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ResponseCommonModel.java
  64. 58 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/BaseDTO.java
  65. 102 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/SQLMonitorDTO.java
  66. 1 1
      elab-backstage-core/src/main/java/com/elab/backstage/core/utils/ProtostuffUtils.java
  67. 5 5
      elab-backstage-core/src/main/java/com/elab/backstage/core/utils/ResponseUtils.java
  68. 0 0
      jay-monitor-data-core/src/test/java/com/elab/backstage/core/server/TcpSocketReceiverTest.java
  69. 12 8
      elab-backstage-service/pom.xml
  70. 4 2
      elab-backstage-service/src/main/java/com/elab/backstage/BackstageServiceApplication.java
  71. 75 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/MonitorDataServer.java
  72. 44 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java
  73. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/config/MvcConfigBean.java
  74. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/config/MybatisConfig.java
  75. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/DaoAspectBean.java
  76. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/ServiceAspectBean.java
  77. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/ValidAspect.java
  78. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/config/mvc/WebInitializer.java
  79. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/controllers/IndexController.java
  80. 130 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/controllers/RouteController.java
  81. 29 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/controllers/ServerController.java
  82. 3 3
      elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageRouteMapper.java
  83. 4 4
      elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageUrlExtMapper.java
  84. 3 3
      elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageUrlMapper.java
  85. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/enums/CommonEnums.java
  86. 50 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduleJobService.java
  87. 37 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduleJobServiceAdaptor.java
  88. 180 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduledJob.java
  89. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageRoute.java
  90. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageRouteExample.java
  91. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrl.java
  92. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExample.java
  93. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExt.java
  94. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExtExample.java
  95. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExtWithBLOBs.java
  96. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/entity/URLModel.java
  97. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/models/request/route/BackstageRoutePageRequest.java
  98. 1 1
      elab-backstage-service/src/main/java/com/elab/backstage/models/request/route/RouteDataRequest.java
  99. 2 2
      elab-backstage-service/src/main/java/com/elab/backstage/models/response/RouteDataResponse.java
  100. 0 0
      jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/process/AbstractUserProcess.java

+ 0 - 332
elab-backstage-api/src/main/java/com/elab/backstage/models/entitys/BackstageRoute.java

@@ -1,332 +0,0 @@
-//package com.elab.backstage.models.entitys;
-//
-//
-//import javax.persistence.Column;
-//import javax.persistence.Id;
-//import javax.persistence.Table;
-//import java.util.Date;
-//
-///**
-// * 后台路由管理
-// *
-// * @author liukx
-// * @Date 2019-02-28 15:16
-// */
-//@Table(name = "backstage_route")
-//public class BackstageRoute {
-//
-//    /**
-//     * Id
-//     */
-//    @Id
-//    private Integer id;
-//
-//    /**
-//     * 项目
-//     */
-//    @Column(name = "project")
-//    private String project;
-//
-//    /**
-//     * 路由地址
-//     */
-//    @Column(name = "url")
-//    private String url;
-//
-//    /**
-//     * 请求方法
-//     */
-//    @Column(name = "method")
-//    private String method;
-//
-//    /**
-//     * 模块
-//     */
-//    @Column(name = "module")
-//    private String module;
-//
-//    /**
-//     * 请求类型
-//     */
-//    @Column(name = "produces")
-//    private String produces;
-//    /**
-//     * 请求类型
-//     */
-//    @Column(name = "consumes")
-//    private String consumes;
-//
-//    /**
-//     * 描述
-//     */
-//    @Column(name = "remark")
-//    private String remark;
-//
-//    /**
-//     * 作者
-//     */
-//    @Column(name = "author")
-//    private String author;
-//
-//    /**
-//     * 校验规则
-//     */
-//    @Column(name = "check_rule")
-//    private String checkRule;
-//
-//    /**
-//     * 是否有效 1 有效 0无效
-//     */
-//    @Column(name = "is_valid")
-//    private Integer isValid;
-//
-//    /**
-//     * 状态:1  有效  -1  无效
-//     */
-//    @Column(name = "status")
-//    private Integer status;
-//
-//    /**
-//     * 创建时间
-//     */
-//    @Column(name = "created")
-//    private Date created;
-//
-//    /**
-//     * 修改时间
-//     */
-//    @Column(name = "updated")
-//    private Date updated;
-//
-//    /**
-//     * 创建者
-//     */
-//    @Column(name = "creator")
-//    private String creator;
-//
-//    /**
-//     * 修改者
-//     */
-//    @Column(name = "updator")
-//    @ApiModelProperty(name = "updator", value = "修改者")
-//    private String updator;
-//
-//
-//    /**
-//     * 获取: Id
-//     */
-//    public Integer getId() {
-//        return id;
-//    }
-//
-//    /**
-//     * 设置: Id
-//     */
-//    public void setId(Integer id) {
-//        this.id = id;
-//    }
-//
-//    /**
-//     * 获取: 项目
-//     */
-//    public String getProject() {
-//        return project;
-//    }
-//
-//    /**
-//     * 设置: 项目
-//     */
-//    public void setProject(String project) {
-//        this.project = project;
-//    }
-//
-//    /**
-//     * 获取: 路由地址
-//     */
-//    public String getUrl() {
-//        return url;
-//    }
-//
-//    /**
-//     * 设置: 路由地址
-//     */
-//    public void setUrl(String url) {
-//        this.url = url;
-//    }
-//
-//    /**
-//     * 获取: 请求方法
-//     */
-//    public String getMethod() {
-//        return method;
-//    }
-//
-//    /**
-//     * 设置: 请求方法
-//     */
-//    public void setMethod(String method) {
-//        this.method = method;
-//    }
-//
-//    /**
-//     * 获取: 模块
-//     */
-//    public String getModule() {
-//        return module;
-//    }
-//
-//    /**
-//     * 设置: 模块
-//     */
-//    public void setModule(String module) {
-//        this.module = module;
-//    }
-//
-//    /**
-//     * 获取: 请求类型
-//     */
-//    public String getProduces() {
-//        return produces;
-//    }
-//
-//    /**
-//     * 设置: 请求类型
-//     */
-//    public void setProduces(String produces) {
-//        this.produces = produces;
-//    }
-//
-//    /**
-//     * 获取: 描述
-//     */
-//    public String getRemark() {
-//        return remark;
-//    }
-//
-//    /**
-//     * 设置: 描述
-//     */
-//    public void setRemark(String remark) {
-//        this.remark = remark;
-//    }
-//
-//    /**
-//     * 获取: 作者
-//     */
-//    public String getAuthor() {
-//        return author;
-//    }
-//
-//    /**
-//     * 设置: 作者
-//     */
-//    public void setAuthor(String author) {
-//        this.author = author;
-//    }
-//
-//    /**
-//     * 获取: 校验规则
-//     */
-//    public String getCheckRule() {
-//        return checkRule;
-//    }
-//
-//    /**
-//     * 设置: 校验规则
-//     */
-//    public void setCheckRule(String checkRule) {
-//        this.checkRule = checkRule;
-//    }
-//
-//    /**
-//     * 获取: 是否有效 1 有效 0无效
-//     */
-//    public Integer getIsValid() {
-//        return isValid;
-//    }
-//
-//    /**
-//     * 设置: 是否有效 1 有效 0无效
-//     */
-//    public void setIsValid(Integer isValid) {
-//        this.isValid = isValid;
-//    }
-//
-//    /**
-//     * 获取: 状态:1  有效  -1  无效
-//     */
-//    public Integer getStatus() {
-//        return status;
-//    }
-//
-//    /**
-//     * 设置: 状态:1  有效  -1  无效
-//     */
-//    public void setStatus(Integer status) {
-//        this.status = status;
-//    }
-//
-//    /**
-//     * 获取: 创建时间
-//     */
-//    public Date getCreated() {
-//        return created;
-//    }
-//
-//    /**
-//     * 设置: 创建时间
-//     */
-//    public void setCreated(Date created) {
-//        this.created = created;
-//    }
-//
-//    /**
-//     * 获取: 修改时间
-//     */
-//    public Date getUpdated() {
-//        return updated;
-//    }
-//
-//    /**
-//     * 设置: 修改时间
-//     */
-//    public void setUpdated(Date updated) {
-//        this.updated = updated;
-//    }
-//
-//    /**
-//     * 获取: 创建者
-//     */
-//    public String getCreator() {
-//        return creator;
-//    }
-//
-//    /**
-//     * 设置: 创建者
-//     */
-//    public void setCreator(String creator) {
-//        this.creator = creator;
-//    }
-//
-//    /**
-//     * 获取: 修改者
-//     */
-//    public String getUpdator() {
-//        return updator;
-//    }
-//
-//    /**
-//     * 设置: 修改者
-//     */
-//    public void setUpdator(String updator) {
-//        this.updator = updator;
-//    }
-//
-//    public String getConsumes() {
-//        return consumes;
-//    }
-//
-//    public void setConsumes(String consumes) {
-//        this.consumes = consumes;
-//    }
-//}

+ 0 - 239
elab-backstage-api/src/main/java/com/elab/backstage/models/request/BackstageRoutePageRequest.java

@@ -1,239 +0,0 @@
-//package com.elab.backstage.models.request;
-//
-//
-//import java.util.Date;
-//
-///**
-// * 后台路由管理
-// *
-// * @author liukx
-// * @Date 2019-02-28 15:16
-// */
-//public class BackstageRoutePageRequest extends PageRequestModel {
-//
-//    private Integer id;
-//    private String project;
-//    private String url;
-//    private String method;
-//    private String module;
-//    private String produces;
-//    private String remark;
-//    private String author;
-//    private String checkRule;
-//    private Integer isValid;
-//    private Integer status;
-//    private Date created;
-//    private Date updated;
-//    private String creator;
-//    private String updator;
-//
-//    /**
-//     * 获取: Id
-//     */
-//    public Integer getId() {
-//        return id;
-//    }
-//
-//    /**
-//     * 设置: Id
-//     */
-//    public void setId(Integer id) {
-//        this.id = id;
-//    }
-//
-//    /**
-//     * 获取: 项目
-//     */
-//    public String getProject() {
-//        return project;
-//    }
-//
-//    /**
-//     * 设置: 项目
-//     */
-//    public void setProject(String project) {
-//        this.project = project;
-//    }
-//
-//    /**
-//     * 获取: 路由地址
-//     */
-//    public String getUrl() {
-//        return url;
-//    }
-//
-//    /**
-//     * 设置: 路由地址
-//     */
-//    public void setUrl(String url) {
-//        this.url = url;
-//    }
-//
-//    /**
-//     * 获取: 请求方法
-//     */
-//    public String getMethod() {
-//        return method;
-//    }
-//
-//    /**
-//     * 设置: 请求方法
-//     */
-//    public void setMethod(String method) {
-//        this.method = method;
-//    }
-//
-//    /**
-//     * 获取: 模块
-//     */
-//    public String getModule() {
-//        return module;
-//    }
-//
-//    /**
-//     * 设置: 模块
-//     */
-//    public void setModule(String module) {
-//        this.module = module;
-//    }
-//
-//    /**
-//     * 获取: 请求类型
-//     */
-//    public String getProduces() {
-//        return produces;
-//    }
-//
-//    /**
-//     * 设置: 请求类型
-//     */
-//    public void setProduces(String produces) {
-//        this.produces = produces;
-//    }
-//
-//    /**
-//     * 获取: 描述
-//     */
-//    public String getRemark() {
-//        return remark;
-//    }
-//
-//    /**
-//     * 设置: 描述
-//     */
-//    public void setRemark(String remark) {
-//        this.remark = remark;
-//    }
-//
-//    /**
-//     * 获取: 作者
-//     */
-//    public String getAuthor() {
-//        return author;
-//    }
-//
-//    /**
-//     * 设置: 作者
-//     */
-//    public void setAuthor(String author) {
-//        this.author = author;
-//    }
-//
-//    /**
-//     * 获取: 校验规则
-//     */
-//    public String getCheckRule() {
-//        return checkRule;
-//    }
-//
-//    /**
-//     * 设置: 校验规则
-//     */
-//    public void setCheckRule(String checkRule) {
-//        this.checkRule = checkRule;
-//    }
-//
-//    /**
-//     * 获取: 是否有效 1 有效 0无效
-//     */
-//    public Integer getIsValid() {
-//        return isValid;
-//    }
-//
-//    /**
-//     * 设置: 是否有效 1 有效 0无效
-//     */
-//    public void setIsValid(Integer isValid) {
-//        this.isValid = isValid;
-//    }
-//
-//    /**
-//     * 获取: 状态:1  有效  -1  无效
-//     */
-//    public Integer getStatus() {
-//        return status;
-//    }
-//
-//    /**
-//     * 设置: 状态:1  有效  -1  无效
-//     */
-//    public void setStatus(Integer status) {
-//        this.status = status;
-//    }
-//
-//    /**
-//     * 获取: 创建时间
-//     */
-//    public Date getCreated() {
-//        return created;
-//    }
-//
-//    /**
-//     * 设置: 创建时间
-//     */
-//    public void setCreated(Date created) {
-//        this.created = created;
-//    }
-//
-//    /**
-//     * 获取: 修改时间
-//     */
-//    public Date getUpdated() {
-//        return updated;
-//    }
-//
-//    /**
-//     * 设置: 修改时间
-//     */
-//    public void setUpdated(Date updated) {
-//        this.updated = updated;
-//    }
-//
-//    /**
-//     * 获取: 创建者
-//     */
-//    public String getCreator() {
-//        return creator;
-//    }
-//
-//    /**
-//     * 设置: 创建者
-//     */
-//    public void setCreator(String creator) {
-//        this.creator = creator;
-//    }
-//
-//    /**
-//     * 获取: 修改者
-//     */
-//    public String getUpdator() {
-//        return updator;
-//    }
-//
-//    /**
-//     * 设置: 修改者
-//     */
-//    public void setUpdator(String updator) {
-//        this.updator = updator;
-//    }
-//}

+ 0 - 19
elab-backstage-api/src/main/java/com/elab/backstage/services/IBackstageRouteService.java

@@ -1,19 +0,0 @@
-//package com.elab.backstage.services;
-//
-//import java.util.List;
-//
-///**
-// * 后台路由管理
-// *
-// * @author liukx
-// * @Date 2019-02-28 15:16
-// */
-//public interface IBackstageRouteService   {
-//
-//    /**
-//     * 获取当前有效的项目名称
-//     *
-//     * @return
-//     */
-//    public List<String> getRoutes();
-//}

+ 0 - 17
elab-backstage-client/src/main/java/com/elab/backstage/client/EnableBackstageData.java

@@ -1,17 +0,0 @@
-package com.elab.backstage.client;
-
-
-import com.elab.backstage.client.config.ClientConfiguration;
-import org.springframework.context.annotation.Import;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-@Import(value = {ClientConfiguration.class})
-public @interface EnableBackstageData {
-
-}

+ 0 - 133
elab-backstage-client/src/main/java/com/elab/backstage/client/TcpSocketSender.java

@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved.
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.elab.backstage.client;
-
-import com.elab.backstage.client.config.ClientConfigManager;
-import com.elab.backstage.client.handler.ConnectHandler;
-import com.elab.backstage.client.message.ChannelManager;
-import com.elab.backstage.client.utils.AddressUtils;
-import io.netty.channel.ChannelFuture;
-import io.netty.handler.codec.string.StringEncoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetSocketAddress;
-import java.util.List;
-import java.util.Queue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-public class TcpSocketSender implements Runnable {
-
-    public static final int SIZE = 5000;
-
-//    private static final int MAX_CHILD_NUMBER = 200;
-//
-//    private static final int MAX_DURATION = 1000 * 30;
-//
-//    private static final long HOUR = 1000 * 60 * 60L;
-
-    private static final StringEncoder encode = new StringEncoder();
-
-    private ClientConfigManager m_configManager;
-
-
-    private Queue<Object> m_queue = new LinkedBlockingQueue<Object>(SIZE);
-
-    private ChannelManager m_channelManager;
-
-    private Logger logger = LoggerFactory.getLogger(TcpSocketSender.class);
-
-    private ConnectHandler connectHandler;
-
-    private boolean m_active;
-
-    public void initialize(String addresses) {
-        m_configManager = new ClientConfigManager();
-        m_configManager.setRouters(addresses);
-        List<InetSocketAddress> addressList = AddressUtils.parseSocketAddress(addresses);
-        m_channelManager = new ChannelManager(addressList, m_configManager);
-        m_channelManager.setConnectHandler(this.connectHandler);
-        this.connectHandler.connect(m_channelManager.channel().channel());
-        // 时刻监听消息发送线程
-        new Thread(this, "Cat-Run").start();
-        // 监控服务端是否存活,如果挂了,定时要去重连远程服务端
-        new Thread(m_channelManager, "Cat-Channel").start();
-
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                logger.info(" 服务器关闭 , TcpSocketSender 被触发 ...");
-            }
-        });
-
-    }
-
-
-    @Override
-    public void run() {
-        logger.info("开始启动消息发送线程,开始时刻监听消息内容");
-
-        m_active = true;
-
-        while (true) {
-            Object tree = m_queue.poll();
-
-            if (tree != null) {
-                ChannelFuture channel = m_channelManager.channel();
-
-                if (channel != null) {
-                    sendInternal(channel, tree);
-                } else {
-                    logger.warn("没有找到相应的服务端传输数据..");
-//                    offer(tree);
-                }
-            } else {
-//                break;
-                try {
-                    // 防止CPU飙升100%
-                    Thread.sleep(5);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-    }
-
-    /**
-     * 数据传输, 编解码的工作交给handler去处理,这里直接传递对象数据就行了
-     *
-     * @param channel
-     * @param data
-     */
-    private void sendInternal(ChannelFuture channel, Object data) {
-        channel.channel().writeAndFlush(data);
-    }
-
-    public void send(Object data) {
-        // 向消息队列中推送一条待发送数据
-        boolean offer = m_queue.offer(data);
-        if (!offer) {
-            logger.warn("推送消息队列失败...当前消息队列大小 : " + m_queue.size());
-        }
-    }
-
-    public void setConnectHandler(ConnectHandler connectHandler) {
-        this.connectHandler = connectHandler;
-    }
-}

+ 0 - 26
elab-backstage-client/src/main/java/com/elab/backstage/client/config/ClientConfigManager.java

@@ -1,26 +0,0 @@
-package com.elab.backstage.client.config;
-
-/**
- * 服务端配置中心地址
- * todo 待实现
- * <p>
- * [这里可以选择两种方式]:
- * 1. 读取SpringBoot中的yml中配置的地址 作为首选
- * 2. 类似CAT一样,将配置放在一个默认的配置路径,以后的项目都读这个配置的路径,这样的好处就是不用每个项目都配置一个地址
- * </p>
- *
- * @author : liukx
- * @time2019/8/23 - 13:41
- */
-public class ClientConfigManager {
-
-    private String routers = "127.0.0.1:4399";
-
-    public String getRouters() {
-        return routers;
-    }
-
-    public void setRouters(String routers) {
-        this.routers = routers;
-    }
-}

+ 0 - 69
elab-backstage-client/src/main/java/com/elab/backstage/client/config/ClientConfiguration.java

@@ -1,69 +0,0 @@
-package com.elab.backstage.client.config;
-
-import com.elab.backstage.client.TcpSocketSender;
-import com.elab.backstage.client.filter.ZuulDataFilter;
-import com.elab.backstage.client.handler.ConnectHandler;
-import com.elab.backstage.client.handler.RegisterConnectHandler;
-import com.elab.backstage.core.message.DomainData;
-import com.netflix.zuul.http.ZuulServlet;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Date;
-
-/**
- * 客户端配置
- *
- * @author : liukx
- * @time2019/10/25 - 17:20
- */
-@Configuration
-public class ClientConfiguration {
-
-    @Value(value = "${elab.address}")
-    private String address;
-
-    @Value(value = "${spring.application.name}")
-    private String applicationName;
-
-    @Value(value = "${server.port}")
-    private int port;
-
-    @Bean
-    public TcpSocketSender tcpSocketSender(@Autowired ConnectHandler connectHandler) {
-        TcpSocketSender tcpSocketSender = new TcpSocketSender();
-        tcpSocketSender.setConnectHandler(connectHandler);
-        tcpSocketSender.initialize(address);
-        return tcpSocketSender;
-    }
-
-    @Bean
-    @ConditionalOnMissingBean(value = {ConnectHandler.class})
-    public RegisterConnectHandler defaultConnectHandler() {
-        RegisterConnectHandler defaultConnectHandler = new RegisterConnectHandler();
-        return defaultConnectHandler;
-    }
-
-    @Bean
-    public DomainData getDomainData() throws UnknownHostException {
-        DomainData domainData = new DomainData();
-        domainData.setIp(InetAddress.getLocalHost().getHostAddress());
-        domainData.setPort(port);
-        domainData.setProject(applicationName);
-        domainData.setStartDate(new Date());
-        return domainData;
-    }
-
-    @Bean
-    @ConditionalOnClass(value = {ZuulServlet.class})
-    public ZuulDataFilter zuulDataFilter() {
-        return new ZuulDataFilter();
-    }
-
-}

+ 0 - 127
elab-backstage-client/src/main/java/com/elab/backstage/client/filter/ZuulDataFilter.java

@@ -1,127 +0,0 @@
-package com.elab.backstage.client.filter;
-
-
-import com.elab.backstage.client.TcpSocketSender;
-import com.elab.backstage.client.params.ParamsGenerate;
-import com.elab.backstage.core.message.BaseMessageData;
-import com.netflix.zuul.ZuulFilter;
-import com.netflix.zuul.context.RequestContext;
-import com.netflix.zuul.exception.ZuulException;
-import com.xiaoleilu.hutool.util.ReUtil;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.nio.charset.Charset;
-import java.util.Enumeration;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * zuul相关的filter
- *
- * @author : liukx
- * @time2019/10/28 - 10:54
- */
-@Component
-public class ZuulDataFilter extends ZuulFilter {
-    private Logger logger = LoggerFactory.getLogger(ZuulDataFilter.class);
-
-    @Value("${spring.application.name}")
-    private String applicationName;
-
-    @Autowired
-    private TcpSocketSender tcpSocketSender;
-
-    @Autowired(required = false)
-    private ParamsGenerate paramsGenerate;
-
-
-    @Override
-    public String filterType() {
-        return "post";
-    }
-
-    @Override
-    public int filterOrder() {
-        return Integer.MAX_VALUE;
-    }
-
-    @Override
-    public boolean shouldFilter() {
-        return true;
-    }
-
-    @Override
-    public Object run() throws ZuulException {
-        RequestContext ctx = RequestContext.getCurrentContext();
-        HttpServletRequest request = ctx.getRequest();
-        String method = request.getMethod();
-        // 请求URL
-        String requestURI = request.getRequestURI();
-        Map<String, String> zuulRequestHeaders = ctx.getZuulRequestHeaders();
-        StringBuilder filterExecutionSummary = ctx.getFilterExecutionSummary();
-        List<String> filterTimeList = ReUtil.findAll("\\[(\\d+)", ctx.getFilterExecutionSummary().toString(), 1);
-
-        // 执行耗时
-        long invokeTime = filterTimeList.stream().mapToLong(time -> Long.valueOf(time)).sum();
-
-        // 请求头信息
-        Enumeration<String> headerNames = request.getHeaderNames();
-        Map<String, String> header = new LinkedHashMap<>();
-
-        while (headerNames.hasMoreElements()) {
-            String headerName = headerNames.nextElement();
-            String headerValue = request.getHeader(headerName);
-            header.put(headerName, headerValue);
-        }
-
-        header.putAll(zuulRequestHeaders);
-        // 参数赋值
-        String responseBody = ctx.getResponseBody();
-        BaseMessageData messageData = new BaseMessageData();
-        messageData.setHeader(header);
-        messageData.setResponseBody(responseBody);
-        messageData.setInvokeTime(invokeTime);
-        try {
-            String hostAddress = InetAddress.getLocalHost().getHostAddress();
-            String requestBody = IOUtils.toString(ctx.getRequest().getInputStream(), Charset.defaultCharset());
-            messageData.setRequestBody(requestBody);
-            messageData.setResponseBody(responseBody);
-            messageData.setIp(hostAddress);
-            messageData.setProject(applicationName);
-            messageData.setUrl(requestURI);
-            messageData.setMethod(method);
-            if (paramsGenerate != null) {
-                paramsGenerate.postBussionData(messageData);
-            }
-            tcpSocketSender.send(messageData);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-//        if (ctx.getResponseDataStream() != null) {
-//            try {
-//                responseBody = IOUtils.toString(ctx.getResponseDataStream(), Charset.defaultCharset());
-//                ctx.setResponseBody(responseBody);
-//                HttpServletResponse response = ctx.getResponse();
-//                int statusCode = response.getStatus();
-//                if (!StringUtils.isEmpty(responseBody) && statusCode != HttpStatus.OK.value()) {
-//
-//                }
-//            } catch (IOException e) {
-//                logger.error("PostFilter Error ... ", e);
-//                e.printStackTrace();
-//            }
-//        }
-        logger.info(" response : " + responseBody + " \n filter : " + filterExecutionSummary.toString());
-        return null;
-    }
-}

+ 0 - 13
elab-backstage-client/src/main/java/com/elab/backstage/client/handler/ConnectHandler.java

@@ -1,13 +0,0 @@
-package com.elab.backstage.client.handler;
-
-import io.netty.channel.Channel;
-
-public interface ConnectHandler {
-
-    public void connect(Channel channel);
-
-    public void reconnect(Channel channel);
-
-    public void close(Channel channel);
-
-}

+ 0 - 31
elab-backstage-client/src/main/java/com/elab/backstage/client/handler/ConnectHandlerAdapter.java

@@ -1,31 +0,0 @@
-package com.elab.backstage.client.handler;
-
-import io.netty.channel.Channel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 默认的连接拦截器
- *
- * @author : liukx
- * @time2019/10/29 - 16:49
- */
-public class ConnectHandlerAdapter implements ConnectHandler {
-
-    private Logger logger = LoggerFactory.getLogger(ConnectHandlerAdapter.class);
-
-    @Override
-    public void connect(Channel channel) {
-        logger.info(" 连接成功 : " + channel.remoteAddress());
-    }
-
-    @Override
-    public void reconnect(Channel channel) {
-        logger.info(" 重新连接成功 : " + channel.remoteAddress());
-    }
-
-    @Override
-    public void close(Channel channel) {
-        logger.info(" 管道关闭 : " + channel.remoteAddress());
-    }
-}

+ 0 - 50
elab-backstage-client/src/main/java/com/elab/backstage/client/handler/RegisterConnectHandler.java

@@ -1,50 +0,0 @@
-package com.elab.backstage.client.handler;
-
-import com.elab.backstage.core.message.DomainData;
-import io.netty.channel.Channel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * 注册连接消息触发
- *
- * @author : liukx
- * @time2019/10/29 - 17:21
- */
-@Component
-public class RegisterConnectHandler extends ConnectHandlerAdapter {
-
-    private Logger logger = LoggerFactory.getLogger(ConnectHandlerAdapter.class);
-
-    @Autowired
-    private DomainData domainData;
-
-    @Override
-    public void connect(Channel channel) {
-        if (channel != null) {
-            channel.writeAndFlush(domainData);
-            logger.info("连接服务器成功! -> " + channel.remoteAddress().toString());
-        }
-    }
-
-    @Override
-    public void reconnect(Channel channel) {
-        // 重连之后需要发送一个注册消息到服务端
-
-        if (channel != null) {
-            channel.writeAndFlush(domainData);
-            logger.info("重连服务器成功! -> " + channel.remoteAddress().toString());
-        }
-    }
-
-    @Override
-    public void close(Channel channel) {
-
-    }
-
-    public void setDomainData(DomainData domainData) {
-        this.domainData = domainData;
-    }
-}

+ 0 - 530
elab-backstage-client/src/main/java/com/elab/backstage/client/message/ChannelManager.java

@@ -1,530 +0,0 @@
-/*
- * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved.
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.elab.backstage.client.message;
-
-import com.elab.backstage.client.config.ClientConfigManager;
-import com.elab.backstage.client.handler.ConnectHandler;
-import com.elab.backstage.client.handler.ConnectHandlerAdapter;
-import com.elab.backstage.client.utils.AddressUtils;
-import com.elab.backstage.core.codec.ProtostuffEncoder;
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import javafx.util.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.StringUtils;
-
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.List;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Netty 客户端管道管理
- *
- * @author : liukx
- * @date : 2019/8/25 - 10:38
- */
-public class ChannelManager implements Runnable {
-
-    private ClientConfigManager m_configManager;
-
-    private Bootstrap m_bootstrap;
-
-    private boolean m_active = true;
-
-    private int m_channelStalledTimes = 0;
-
-    private ChannelHolder m_activeChannelHolder;
-
-    private AtomicInteger m_attempts = new AtomicInteger();
-
-    private Logger logger = LoggerFactory.getLogger(ChannelManager.class);
-
-    private ConnectHandler connectHandler = new ConnectHandlerAdapter();
-
-    public ChannelManager(List<InetSocketAddress> serverAddresses, ClientConfigManager configManager) {
-        m_configManager = configManager;
-        EventLoopGroup group = new NioEventLoopGroup(1, new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setDaemon(true);
-                return t;
-            }
-        });
-
-        Bootstrap bootstrap = new Bootstrap();
-        bootstrap.group(group).channel(NioSocketChannel.class);
-        bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
-        // 初始化处理器
-        bootstrap.handler(new ChannelInitializer<SocketChannel>() {
-            @Override
-            protected void initChannel(SocketChannel ch) throws Exception {
-                ChannelPipeline pipeline = ch.pipeline();
-//                pipeline.addLast(new ProtostuffDecoder(BaseMessageData.class));
-                // 数据进行加密
-                pipeline.addLast(new ProtostuffEncoder());
-            }
-        });
-        m_bootstrap = bootstrap;
-        ChannelHolder holder = null;
-        // 获取服务端路由
-        String routerConfig = m_configManager.getRouters();
-
-        if (!StringUtils.isEmpty(routerConfig)) {
-            // 解析配置
-            List<InetSocketAddress> configurationAddresses = AddressUtils.parseSocketAddress(routerConfig);
-            // 初始化管道
-            holder = initChannel(configurationAddresses, routerConfig);
-
-            if (holder != null) {
-                m_activeChannelHolder = holder;
-            } else {
-                m_activeChannelHolder = new ChannelHolder();
-                m_activeChannelHolder.setServerAddresses(configurationAddresses);
-            }
-        } else {
-            holder = initChannel(serverAddresses, null);
-            if (holder != null) {
-                m_activeChannelHolder = holder;
-            } else {
-                m_activeChannelHolder = new ChannelHolder();
-                m_activeChannelHolder.setServerAddresses(serverAddresses);
-                logger.error("error when init cat module due to error config xml in client.xml");
-            }
-        }
-
-    }
-
-    /**
-     * 获取一个客户端管道信息
-     *
-     * @return
-     */
-    public ChannelFuture channel() {
-        if (m_activeChannelHolder != null) {
-            ChannelFuture future = m_activeChannelHolder.getActiveFuture();
-
-            if (checkWritable(future)) {
-                return future;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 检查管道是否打开
-     *
-     * @param future
-     * @return
-     */
-    private boolean checkActive(ChannelFuture future) {
-        boolean isActive = false;
-
-        if (future != null) {
-            Channel channel = future.channel();
-            // 检测管道是否打开
-            if (channel.isActive() && channel.isOpen()) {
-                isActive = true;
-            } else {
-                logger.warn("channel buf is not active ,current channel " + future.channel().remoteAddress());
-            }
-        }
-        return isActive;
-    }
-
-    /**
-     * 检测服务端是否发生改变
-     */
-    private void checkServerChanged() {
-        Pair<Boolean, String> pair = routerConfigChanged();
-
-        if (pair.getKey()) {
-            logger.info("router config changed :" + pair.getValue());
-            String servers = pair.getValue();
-            // 这里将配置的服务路由做拆分
-            List<InetSocketAddress> serverAddresses = AddressUtils.parseSocketAddress(servers);
-            //
-            ChannelHolder newHolder = initChannel(serverAddresses, servers);
-
-            if (newHolder != null) {
-                if (newHolder.isConnectChanged()) {
-                    ChannelHolder last = m_activeChannelHolder;
-
-                    m_activeChannelHolder = newHolder;
-                    // 关闭老的管道
-                    closeChannelHolder(last);
-                    logger.info("switch active channel to " + m_activeChannelHolder);
-                } else {
-                    m_activeChannelHolder = newHolder;
-                }
-            }
-        }
-    }
-
-    /**
-     * 检查管道是否可用
-     *
-     * @param future
-     * @return
-     */
-    private boolean checkWritable(ChannelFuture future) {
-        boolean isWriteable = false;
-
-        if (future != null) {
-            Channel channel = future.channel();
-
-            if (channel.isActive() && channel.isOpen()) {
-                if (channel.isWritable()) {
-                    isWriteable = true;
-                } else {
-                    channel.flush();
-                }
-            } else {
-                int count = m_attempts.incrementAndGet();
-
-                if (count % 1000 == 0 || count == 1) {
-                    logger.warn("channel buf is is close when send msg! Attempts: " + count);
-                }
-            }
-        }
-
-        return isWriteable;
-    }
-
-    /**
-     * 关闭管道
-     *
-     * @param channel
-     */
-    private void closeChannel(ChannelFuture channel) {
-        try {
-            if (channel != null) {
-                SocketAddress address = channel.channel().remoteAddress();
-
-                if (address != null) {
-                    logger.info("close channel " + address);
-                }
-                this.connectHandler.close(channel.channel());
-                channel.channel().close();
-            }
-        } catch (Exception e) {
-            // ignore
-        }
-    }
-
-    /**
-     * 关闭指定的管道
-     *
-     * @param channelHolder
-     */
-    private void closeChannelHolder(ChannelHolder channelHolder) {
-        try {
-            ChannelFuture channel = channelHolder.getActiveFuture();
-
-            closeChannel(channel);
-        } catch (Exception e) {
-            // ignore
-        }
-    }
-
-    /**
-     * 创建一个新的管道
-     *
-     * @param address
-     * @return
-     */
-    private ChannelFuture createChannel(InetSocketAddress address) {
-        logger.info("start connect server" + address.toString());
-        ChannelFuture future = null;
-
-        try {
-            future = m_bootstrap.connect(address);
-            future.awaitUninterruptibly(100, TimeUnit.MILLISECONDS); // 100 ms
-
-            if (!future.isSuccess()) {
-                logger.error("Error when try connecting to " + address);
-                closeChannel(future);
-            } else {
-                logger.info("Connected to backstage server at " + address);
-                return future;
-            }
-        } catch (Throwable e) {
-            logger.error("Error when connect server " + address.getAddress(), e);
-
-            if (future != null) {
-                closeChannel(future);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * 双重检测管道是否有效
-     *
-     * @param channelHolder
-     */
-    private void doubleCheckActiveServer(ChannelHolder channelHolder) {
-        try {
-            if (isChannelStalled(channelHolder)) {
-                closeChannelHolder(m_activeChannelHolder);
-                channelHolder.setActiveIndex(-1);
-            }
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-        }
-    }
-
-    private ChannelHolder initChannel(List<InetSocketAddress> addresses, String serverConfig) {
-        try {
-            int len = addresses.size();
-            //
-            for (int i = 0; i < len; i++) {
-                InetSocketAddress address = addresses.get(i);
-                String hostAddress = address.getAddress().getHostAddress();
-                ChannelHolder holder = null;
-
-                if (m_activeChannelHolder != null && hostAddress.equals(m_activeChannelHolder.getIp())) {
-                    holder = new ChannelHolder();
-
-                    holder.setActiveFuture(m_activeChannelHolder.getActiveFuture()).setConnectChanged(false);
-                } else {
-                    ChannelFuture future = createChannel(address);
-
-                    if (future != null) {
-                        holder = new ChannelHolder();
-                        holder.setActiveFuture(future).setConnectChanged(true);
-                    }
-                }
-                if (holder != null) {
-                    holder.setActiveIndex(i).setIp(hostAddress);
-                    holder.setActiveServerConfig(serverConfig).setServerAddresses(addresses);
-                    logger.info("success when init CAT server, new active holder" + holder.toString());
-                    return holder;
-                }
-            }
-        } catch (Exception e) {
-            logger.error(e.getMessage(), e);
-        }
-
-        try {
-            StringBuilder sb = new StringBuilder();
-
-            for (InetSocketAddress address : addresses) {
-                sb.append(address.toString()).append(";");
-            }
-            logger.info("Error when init CAT server " + sb.toString());
-        } catch (Exception e) {
-            // ignore
-        }
-        return null;
-    }
-
-    private boolean isChannelStalled(ChannelHolder holder) {
-        ChannelFuture future = holder.getActiveFuture();
-        boolean active = checkActive(future);
-
-        if (!active) {
-            if ((++m_channelStalledTimes) % 3 == 0) {
-                return true;
-            } else {
-                return false;
-            }
-        } else {
-            if (m_channelStalledTimes > 0) {
-                m_channelStalledTimes--;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * 尝试重连默认的服务
-     *
-     * @param activeFuture
-     * @param serverAddresses
-     */
-    private void reconnectDefaultServer(ChannelFuture activeFuture, List<InetSocketAddress> serverAddresses) {
-        try {
-            // 获取存活的远程服务地址大小
-            int reconnectServers = m_activeChannelHolder.getActiveIndex();
-
-            if (reconnectServers == -1) {
-                reconnectServers = serverAddresses.size();
-            }
-            // 循环开始重新连接
-            for (int i = 0; i < reconnectServers; i++) {
-                ChannelFuture future = createChannel(serverAddresses.get(i));
-
-                if (future != null) {
-                    // 将老的进行临时保存
-                    ChannelFuture lastFuture = activeFuture;
-
-                    m_activeChannelHolder.setActiveFuture(future);
-                    m_activeChannelHolder.setActiveIndex(i);
-                    // 关闭掉老的管道
-                    closeChannel(lastFuture);
-                    this.connectHandler.reconnect(future.channel());
-                    break;
-                }
-            }
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * @return
-     */
-    private Pair<Boolean, String> routerConfigChanged() {
-        String routerConfig = m_configManager.getRouters();
-
-        // 判断老的服务服务地址和新的服务地址是否存在变化
-        if (!StringUtils.isEmpty(routerConfig) && !routerConfig.equals(m_activeChannelHolder.getActiveServerConfig())) {
-            return new Pair<Boolean, String>(true, routerConfig);
-        } else {
-            return new Pair<Boolean, String>(false, routerConfig);
-        }
-    }
-
-    /**
-     * 每10秒检查一次服务端是否存活
-     * 这里涉及到服务端断线重连机制
-     */
-    @Override
-    public void run() {
-        while (m_active) {
-            // make save message id index asyc
-            checkServerChanged();
-
-            ChannelFuture activeFuture = m_activeChannelHolder.getActiveFuture();
-            List<InetSocketAddress> serverAddresses = m_activeChannelHolder.getServerAddresses();
-
-            doubleCheckActiveServer(m_activeChannelHolder);
-            reconnectDefaultServer(activeFuture, serverAddresses);
-
-            try {
-                Thread.sleep(10 * 1000L); // check every 10 seconds
-            } catch (InterruptedException e) {
-                // ignore
-            }
-        }
-    }
-
-    public void setConnectHandler(ConnectHandler connectHandler) {
-        this.connectHandler = connectHandler;
-    }
-
-    /**
-     * 管道详情定义
-     */
-    public static class ChannelHolder {
-
-        private ChannelFuture m_activeFuture;
-
-        private int m_activeIndex = -1;
-
-        private String m_activeServerConfig;
-
-        private List<InetSocketAddress> m_serverAddresses;
-
-        private String m_ip;
-
-        private boolean m_connectChanged;
-
-        public ChannelFuture getActiveFuture() {
-            return m_activeFuture;
-        }
-
-        public ChannelHolder setActiveFuture(ChannelFuture activeFuture) {
-            m_activeFuture = activeFuture;
-            return this;
-        }
-
-        public int getActiveIndex() {
-            return m_activeIndex;
-        }
-
-        public ChannelHolder setActiveIndex(int activeIndex) {
-            m_activeIndex = activeIndex;
-            return this;
-        }
-
-        public String getActiveServerConfig() {
-            return m_activeServerConfig;
-        }
-
-        public ChannelHolder setActiveServerConfig(String activeServerConfig) {
-            m_activeServerConfig = activeServerConfig;
-            return this;
-        }
-
-        public String getIp() {
-            return m_ip;
-        }
-
-        public ChannelHolder setIp(String ip) {
-            m_ip = ip;
-            return this;
-        }
-
-        public List<InetSocketAddress> getServerAddresses() {
-            return m_serverAddresses;
-        }
-
-        public ChannelHolder setServerAddresses(List<InetSocketAddress> serverAddresses) {
-            m_serverAddresses = serverAddresses;
-            return this;
-        }
-
-        public boolean isConnectChanged() {
-            return m_connectChanged;
-        }
-
-        public ChannelHolder setConnectChanged(boolean connectChanged) {
-            m_connectChanged = connectChanged;
-            return this;
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-
-            sb.append("active future :").append(m_activeFuture.channel().remoteAddress());
-            sb.append(" index:").append(m_activeIndex);
-            sb.append(" ip:").append(m_ip);
-            sb.append(" server config:").append(m_activeServerConfig);
-            return sb.toString();
-        }
-    }
-
-    public class ClientMessageHandler extends SimpleChannelInboundHandler<Object> {
-
-        @Override
-        protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
-            logger.info("receiver msg from server:" + msg);
-        }
-    }
-
-}

+ 0 - 14
elab-backstage-client/src/main/java/com/elab/backstage/client/params/ParamsGenerate.java

@@ -1,14 +0,0 @@
-package com.elab.backstage.client.params;
-
-import com.elab.backstage.core.message.BaseMessageData;
-
-public interface ParamsGenerate {
-
-    /**
-     * 获取业务消息
-     *
-     * @return
-     */
-    void postBussionData(BaseMessageData baseMessageData);
-
-}

+ 0 - 12
elab-backstage-client/src/main/java/com/elab/backstage/client/sender/MessageSender.java

@@ -1,12 +0,0 @@
-package com.elab.backstage.client.sender;
-
-import java.net.InetSocketAddress;
-import java.util.List;
-
-public interface MessageSender {
-    public void initialize(List<InetSocketAddress> addresses);
-
-    public void send(String json);
-
-    public void shutdown();
-}

+ 0 - 36
elab-backstage-client/src/main/java/com/elab/backstage/client/utils/AddressUtils.java

@@ -1,36 +0,0 @@
-package com.elab.backstage.client.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 地址工具类
- *
- * @author : liukx
- * @time2019/10/25 - 17:04
- */
-public class AddressUtils {
-
-    private static Logger logger = LoggerFactory.getLogger(AddressUtils.class);
-
-    public static List<InetSocketAddress> parseSocketAddress(String content) {
-        try {
-            List<String> strs = Splitters.by(";").noEmptyItem().split(content);
-            List<InetSocketAddress> address = new ArrayList<InetSocketAddress>();
-
-            for (String str : strs) {
-                List<String> items = Splitters.by(":").noEmptyItem().split(str);
-
-                address.add(new InetSocketAddress(items.get(0), Integer.parseInt(items.get(1))));
-            }
-            return address;
-        } catch (Exception e) {
-            logger.error(e.getMessage(), e);
-        }
-        return new ArrayList<InetSocketAddress>();
-    }
-}

+ 0 - 124
elab-backstage-client/src/main/java/com/elab/backstage/client/utils/Splitters.java

@@ -1,124 +0,0 @@
-package com.elab.backstage.client.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Splitters {
-    public static StringSplitter by(char delimiter) {
-        return new StringSplitter(delimiter);
-    }
-
-    public static StringSplitter by(String delimiter) {
-        return new StringSplitter(delimiter);
-    }
-
-    public static class StringSplitter {
-        private char m_charDelimiter;
-
-        private String m_stringDelimiter;
-
-        private boolean m_trimmed;
-
-        private boolean m_noEmptyItem;
-
-        StringSplitter(char delimiter) {
-            m_charDelimiter = delimiter;
-        }
-
-        StringSplitter(String delimiter) {
-            m_stringDelimiter = delimiter;
-        }
-
-        protected List<String> doCharSplit(String str, List<String> list) {
-            char delimiter = m_charDelimiter;
-            int len = str.length();
-            StringBuilder sb = new StringBuilder(len);
-
-            for (int i = 0; i < len + 1; i++) {
-                char ch = i == len ? delimiter : str.charAt(i);
-
-                if (ch == delimiter) {
-                    String item = sb.toString();
-
-                    sb.setLength(0);
-
-                    if (m_trimmed) {
-                        item = item.trim();
-                    }
-
-                    if (m_noEmptyItem && item.length() == 0) {
-                        continue;
-                    }
-
-                    list.add(item);
-                } else {
-                    sb.append(ch);
-                }
-            }
-
-            return list;
-        }
-
-        protected List<String> doStringSplit(String source, List<String> list) {
-            String delimiter = m_stringDelimiter;
-            int len = delimiter.length();
-            int offset = 0;
-            int index = source.indexOf(delimiter, offset);
-
-            while (true) {
-                String part;
-
-                if (index == -1) { // last part
-                    part = source.substring(offset);
-                } else {
-                    part = source.substring(offset, index);
-                }
-
-                if (m_trimmed) {
-                    part = part.trim();
-                }
-
-                if (!m_noEmptyItem || part.length() > 0) {
-                    list.add(part);
-                }
-
-                if (index == -1) { // last part
-                    break;
-                } else {
-                    offset = index + len;
-                    index = source.indexOf(delimiter, offset);
-                }
-            }
-
-            return list;
-        }
-
-        public StringSplitter noEmptyItem() {
-            m_noEmptyItem = true;
-            return this;
-        }
-
-        public List<String> split(String str) {
-            return split(str, new ArrayList<String>());
-        }
-
-        public List<String> split(String str, List<String> list) {
-            if (str == null) {
-                return null;
-            }
-
-            if (m_charDelimiter > 0) {
-                return doCharSplit(str, list);
-            } else if (m_stringDelimiter != null) {
-                return doStringSplit(str, list);
-            }
-
-            throw new UnsupportedOperationException();
-        }
-
-        public StringSplitter trim() {
-            m_trimmed = true;
-            return this;
-        }
-    }
-}

+ 0 - 38
elab-backstage-client/src/test/java/com/elab/backstage/client/TcpSocketSenderTest.java

@@ -1,38 +0,0 @@
-package com.elab.backstage.client;
-
-
-import com.alibaba.fastjson.JSONObject;
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.message.BaseMessageData;
-import org.junit.Test;
-
-import java.net.InetSocketAddress;
-import java.util.LinkedList;
-import java.util.List;
-
-public class TcpSocketSenderTest {
-
-    @Test
-    public void send() throws InterruptedException {
-        TcpSocketSender socketSender = new TcpSocketSender();
-        List<InetSocketAddress> addresses = new LinkedList<>();
-
-        socketSender.initialize("127.0.0.1:4399");
-        JSONObject object = new JSONObject();
-        object.put("aaa", "bbb");
-
-        BaseMessageData data = new BaseMessageData();
-        data.setResponseBody(object.toJSONString());
-        data.setIp("127.0.0.1");
-        data.setMsgId("aaaaaaaaaaa");
-        data.setType(MessageEnums.URL);
-        data.setProject("Elab");
-        data.setUserId("123123");
-        while (true) {
-            socketSender.send(data);
-            Thread.sleep(1000);
-        }
-
-
-    }
-}

+ 0 - 65
elab-backstage-client/src/test/java/com/elab/backstage/client/config/ClientConfigurationTest.java

@@ -1,65 +0,0 @@
-package com.elab.backstage.client.config;
-
-
-import com.alibaba.fastjson.JSON;
-import com.elab.backstage.client.TcpSocketSender;
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.message.BaseMessageData;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = {ClientConfiguration.class})
-public class ClientConfigurationTest {
-
-//    private AnnotationConfigApplicationContext context;
-//
-//    @Before
-//    public void init() {
-//        context = new AnnotationConfigApplicationContext();
-//    }
-
-    @Autowired
-    private TcpSocketSender tcpSocketSender;
-
-    @Test
-    public void tcpSocketSender() throws Exception {
-//        context.register(ClientConfiguration.class);
-//        context.refresh();
-//        TcpSocketSender bean = context.getBean(TcpSocketSender.class);
-        BaseMessageData messageData = new BaseMessageData();
-        messageData.setUserId("12312");
-        messageData.setProject("test_project");
-        messageData.setIp("192.168.0.1");
-        messageData.setType(MessageEnums.URL);
-        messageData.setUrl("/elaber/modifyHouseAuthSub");
-        messageData.setMethod("POST");
-        messageData.setServiceName("elab-marketing-user");
-        messageData.setMsgId("elab-marketing-gateway-ac13bd7b-436755-1431");
-        messageData.setRequestBody("{\"edited\":\"1\",\"updator\":\"合著花园管理员\"} ");
-        messageData.setResponseBody("{\"success\":false,\"errorCode\":\"CORE.PARAMS.001\",\"message\":\"id 字段值 null - 不能为null\",\"timestamp\":\"2019-10-29 11:25:10\",\"extension\":{\"logId\":\"default-ac13bd7b-436755-1468\"},\"single\":null,\"list\" \n" +
-                ":null,\"id\":0,\"pageModel\":null} ");
-        Map<String, String> map = new LinkedHashMap<>();
-        map.put("bussionType", "bt");
-
-        Map<String, String> header = new LinkedHashMap<>();
-        header.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " +
-                "Chrome/77.0.3865.90 Safari/537.36");
-        header.put("x-forwarded-for", "180.172.243.69 ");
-        header.put("userid", "301");
-        messageData.setResponseBody(JSON.toJSONString(map));
-//        while (true) {
-        tcpSocketSender.send(messageData);
-//            Thread.sleep(1000);
-//        }
-        System.in.read();
-    }
-
-
-}

+ 0 - 55
elab-backstage-core/src/main/java/com/elab/backstage/core/codec/ProtostuffDecoder.java

@@ -1,55 +0,0 @@
-package com.elab.backstage.core.codec;
-
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.utils.ProtostuffUtils;
-import io.netty.buffer.ByteBuf;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.ByteToMessageDecoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * 负责解码从客户端传递过来的数据
- *
- * @author : liukx
- * @date : 2019/10/25 - 14:44
- */
-public class ProtostuffDecoder extends ByteToMessageDecoder {
-
-    private Logger logger = LoggerFactory.getLogger(ProtostuffDecoder.class);
-
-    @Override
-    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
-        //ByteToMessageDecoder可能出现半包问题,定义4个字节来存储,字节小于4被认为是半包先不读,下次再读取
-        if (byteBuf.readableBytes() < 4) {
-            return;
-        }
-        byteBuf.markReaderIndex();
-        // ByteBuf的长度
-        int length = byteBuf.readInt();
-        if (length < 0)
-            channelHandlerContext.close();
-        // 这部分字节代表数据的类型
-        int code = byteBuf.readInt();
-        MessageEnums messageEnums = MessageEnums.getValue(code);
-        Class clazz = messageEnums.getClazz();
-
-        if (byteBuf.readableBytes() < length) {
-            byteBuf.resetReaderIndex();
-            return;
-        }
-
-        // 1、构建length长度的字节数组
-        byte[] data = new byte[length];
-        // 2、将ByteBuf数据复制到字节数组中
-        byteBuf.readBytes(data);
-//        logger.info("准备反序列化对象...");
-        // 3、进行反序列化对象
-        Object obj = ProtostuffUtils.deserialize(data, clazz);
-//        logger.info("反序列化对象完毕,准备将其添加到反序列化对象结果列表...");
-        // 4、添加到反序列化对象结果列表
-        list.add(obj);
-    }
-}

+ 0 - 45
elab-backstage-core/src/main/java/com/elab/backstage/core/codec/ProtostuffEncoder.java

@@ -1,45 +0,0 @@
-package com.elab.backstage.core.codec;
-
-import com.elab.backstage.core.exception.MessageTypeException;
-import com.elab.backstage.core.message.BaseMessage;
-import com.elab.backstage.core.utils.ProtostuffUtils;
-import io.netty.buffer.ByteBuf;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.MessageToByteEncoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Created by jiangyunxiong on 2018/6/1.
- * <p>
- * 编码器:负责将Object类型的POJO对象编码为byte数组,然后写入到ByteBuf中 ,底层实现是序列化
- */
-public class ProtostuffEncoder extends MessageToByteEncoder<Object> {
-
-    private Logger logger = LoggerFactory.getLogger(ProtostuffEncoder.class);
-
-    /**
-     * 编码格式: [长度/数据类型/数据流]
-     *
-     * @param channelHandlerContext
-     * @param o
-     * @param byteBuf
-     * @throws Exception
-     */
-    @Override
-    protected void encode(ChannelHandlerContext channelHandlerContext, Object o, ByteBuf byteBuf) throws Exception {
-        byte[] data = ProtostuffUtils.serialize(o);
-        // 前四个字节代表数据的长度
-        byteBuf.writeInt(data.length);
-
-        // 后四个字节代表数据对应的实体
-        if (o instanceof BaseMessage) {
-            BaseMessage baseMessage = (BaseMessage) o;
-            byteBuf.writeInt(baseMessage.getType().getCode());
-        } else {
-            throw new MessageTypeException("消息类型异常,每个消息体必须指定类型");
-        }
-
-        byteBuf.writeBytes(data);
-    }
-}

+ 0 - 26
elab-backstage-core/src/main/java/com/elab/backstage/core/enums/MessageConstant.java

@@ -1,26 +0,0 @@
-package com.elab.backstage.core.enums;
-
-import com.elab.backstage.core.message.DomainData;
-import io.netty.util.AttributeKey;
-
-/**
- * 各种常量定义
- *
- * @author : liukx
- * @time2019/10/28 - 15:28
- */
-public class MessageConstant {
-
-
-    public static final AttributeKey<DomainData> CLIENT_DOMAIN_KEY = AttributeKey.valueOf("clinet.info");
-
-
-    public static final byte M_REGISTER                    = 0x01;     // Request
-    public static final byte M_URL                         = 0x02;     // Response
-    public static final byte M_SQL                         = 0x03;     // 发布服务
-    public static final byte PUBLISH_CANCEL_SERVICE     = 0x04;     // 取消发布服务
-    public static final byte SUBSCRIBE_SERVICE          = 0x05;     // 订阅服务
-    public static final byte OFFLINE_NOTICE             = 0x06;     // 通知下线
-    public static final byte ACK                        = 0x07;     // Acknowledge
-    public static final byte HEARTBEAT                  = 0x0f;     // Heartbeat
-}

+ 0 - 62
elab-backstage-core/src/main/java/com/elab/backstage/core/enums/MessageEnums.java

@@ -1,62 +0,0 @@
-package com.elab.backstage.core.enums;
-
-import com.elab.backstage.core.message.DomainData;
-import com.elab.backstage.core.message.BaseMessageData;
-
-/**
- * 消息的类型定义
- *
- * @author : liukx
- * @time2019/10/25 - 15:07
- */
-public enum MessageEnums {
-    REGISTER(0, DomainData.class),
-    URL(1, BaseMessageData.class);
-
-
-    // sql
-    private int code;
-    private Class clazz;
-
-    MessageEnums(int code, Class clazz) {
-        this.code = code;
-        this.clazz = clazz;
-    }
-
-
-    public static MessageEnums parse(String name) {
-        for (MessageEnums s : values()) {
-            if (s.name().equalsIgnoreCase(name)) {
-                return s;
-            }
-        }
-        return null;
-    }
-
-    public static MessageEnums getValue(int type) {
-        for (MessageEnums ele : values()) {
-            if (ele.getCode() == type) return ele;
-        }
-        return null;
-    }
-
-    public static MessageEnums getDefault() {
-        return URL;
-    }
-
-    public int getCode() {
-        return code;
-    }
-
-    public void setCode(int code) {
-        this.code = code;
-    }
-
-    public Class getClazz() {
-        return clazz;
-    }
-
-    public void setClazz(Class clazz) {
-        this.clazz = clazz;
-    }
-}

+ 0 - 73
elab-backstage-core/src/main/java/com/elab/backstage/core/handler/NettyServerHandler.java

@@ -1,73 +0,0 @@
-package com.elab.backstage.core.handler;
-
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.message.BaseMessage;
-import com.elab.backstage.core.process.MessageProcess;
-import com.elab.backstage.core.process.RegisterProcess;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.SimpleChannelInboundHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-public class NettyServerHandler extends SimpleChannelInboundHandler<Object> {
-    private Logger logger = LoggerFactory.getLogger(NettyServerHandler.class);
-    private List<MessageProcess> messageProcess;
-
-    public NettyServerHandler(List<MessageProcess> messageProcess) {
-        this.messageProcess = messageProcess;
-    }
-
-    /*
-     * 收到消息时,返回信息
-     */
-    @Override
-    public void channelRead0(ChannelHandlerContext ctx, Object msg)
-            throws Exception {
-        Channel channel = ctx.channel();
-        BaseMessage baseMessage = null;
-        if (msg instanceof BaseMessage) {
-            baseMessage = (BaseMessage) msg;
-            baseMessage.setAddress(ctx.channel().remoteAddress().toString());
-        }
-
-        for (int i = 0; i < messageProcess.size(); i++) {
-            MessageProcess messageProcess = this.messageProcess.get(i);
-            MessageEnums type = messageProcess.type();
-            if (type.getCode() == baseMessage.getType().getCode()) {
-                boolean isNext = messageProcess.process(channel, msg);
-                if (!isNext) {
-                    logger.info(" messageProcess - " + messageProcess.toString() + " 无法继续 ");
-                    break;
-                }
-            }
-        }
-    }
-
-    /*
-     * 建立连接时,返回消息
-     */
-//    @Override
-//    public void channelActive(ChannelHandlerContext ctx) throws Exception {
-//        Attribute<DomainData> attr = ctx.channel().attr(MessageConstant.CLIENT_DOMAIN_KEY);
-//        DomainData domainModel = attr.get();
-//        System.out.println("连接的客户端地址:" + ctx.channel().remoteAddress());
-//        ctx.writeAndFlush("客户端" + InetAddress.getLocalHost().getHostName() + "成功与服务端建立连接! \n");
-//        super.channelActive(ctx);
-//    }
-
-    @Override
-    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-        Channel channel = ctx.channel();
-        for (int i = 0; i < messageProcess.size(); i++) {
-            MessageProcess messageProcess = this.messageProcess.get(i);
-            if (messageProcess instanceof RegisterProcess) {
-                RegisterProcess registerProcess = (RegisterProcess) messageProcess;
-                registerProcess.unRegister(channel);
-            }
-        }
-        super.channelInactive(ctx);
-    }
-}

+ 0 - 12
elab-backstage-core/src/main/java/com/elab/backstage/core/handler/OfflineHandler.java

@@ -1,12 +0,0 @@
-package com.elab.backstage.core.handler;
-
-/**
- * 客户端下线处理器
- *
- * @author : liukx
- * @time2019/10/29 - 10:01
- */
-public class OfflineHandler {
-
-
-}

+ 0 - 35
elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessage.java

@@ -1,35 +0,0 @@
-package com.elab.backstage.core.message;
-
-import com.elab.backstage.core.enums.MessageEnums;
-
-/**
- * 消息类型
- *
- * @author : liukx
- * @time2019/10/28 - 16:44
- */
-public class BaseMessage {
-
-    /**
-     * 业务类型 / 默认 : REGISTER / URL / SQL
-     */
-    public MessageEnums type = MessageEnums.URL;
-
-    public String address;
-
-    public String getAddress() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
-
-    public MessageEnums getType() {
-        return type;
-    }
-
-    public void setType(MessageEnums type) {
-        this.type = type;
-    }
-}

+ 0 - 207
elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessageData.java

@@ -1,207 +0,0 @@
-package com.elab.backstage.core.message;
-
-import com.elab.backstage.core.enums.MessageEnums;
-
-/**
- * 消息模型
- *
- * @author : liukx
- * @time2019/8/23 - 14:03
- */
-public class BaseMessageData extends BaseMessageRequest {
-
-
-    private String url;
-
-    private String method;
-    /**
-     * 项目名称,可以成为服务名称
-     */
-    private String project;
-
-    private String serviceName;
-    /**
-     * 前端项目名称
-     */
-    private String frontProjectName;
-
-    private String userSystem;
-
-    private String userDevice;
-
-    private String userIp;
-
-    private String userAgent;
-
-
-    /**
-     * 当前服务器地址 : 最好是内网的
-     */
-    private String ip;
-    /**
-     * 消息编号,这里由业务方自己传递相应的业务编号,如果集成了CAT,可以支持cat访问
-     */
-    private String msgId;
-
-    /**
-     * 用户编号
-     */
-    private String userId;
-
-    /**
-     * 请求参数
-     */
-    private String requestBody;
-
-    /**
-     * 返回结果参数
-     */
-    private String responseBody;
-
-    /**
-     * 执行时间
-     */
-    private long invokeTime;
-
-    /**
-     * 结果状态码
-     */
-    private int statusCode;
-
-    public String getUserAgent() {
-        return userAgent;
-    }
-
-    public void setUserAgent(String userAgent) {
-        this.userAgent = userAgent;
-    }
-
-    public String getFrontProjectName() {
-        return frontProjectName;
-    }
-
-    public void setFrontProjectName(String frontProjectName) {
-        this.frontProjectName = frontProjectName;
-    }
-
-    public String getUserSystem() {
-        return userSystem;
-    }
-
-    public void setUserSystem(String userSystem) {
-        this.userSystem = userSystem;
-    }
-
-    public String getUserDevice() {
-        return userDevice;
-    }
-
-    public void setUserDevice(String userDevice) {
-        this.userDevice = userDevice;
-    }
-
-    public String getUserIp() {
-        return userIp;
-    }
-
-    public void setUserIp(String userIp) {
-        this.userIp = userIp;
-    }
-
-    public String getMsgId() {
-        return msgId;
-    }
-
-    public void setMsgId(String msgId) {
-        this.msgId = msgId;
-    }
-
-    public String getMethod() {
-        return method;
-    }
-
-    public void setMethod(String method) {
-        this.method = method;
-    }
-
-    public String getServiceName() {
-        return serviceName;
-    }
-
-    public void setServiceName(String serviceName) {
-        this.serviceName = serviceName;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getRequestBody() {
-        return requestBody;
-    }
-
-    public void setRequestBody(String requestBody) {
-        this.requestBody = requestBody;
-    }
-
-    public String getResponseBody() {
-        return responseBody;
-    }
-
-    public void setResponseBody(String responseBody) {
-        this.responseBody = responseBody;
-    }
-
-    public long getInvokeTime() {
-        return invokeTime;
-    }
-
-    public void setInvokeTime(long invokeTime) {
-        this.invokeTime = invokeTime;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-
-    public void setStatusCode(int statusCode) {
-        this.statusCode = statusCode;
-    }
-
-
-    public String getUserId() {
-        return userId;
-    }
-
-    public void setUserId(String userId) {
-        this.userId = userId;
-    }
-
-    public String getProject() {
-        return project;
-    }
-
-    public void setProject(String project) {
-        this.project = project;
-    }
-
-    public String getIp() {
-        return ip;
-    }
-
-    public void setIp(String ip) {
-        this.ip = ip;
-    }
-
-    public MessageEnums getType() {
-        return type;
-    }
-
-    public void setType(MessageEnums type) {
-        this.type = type;
-    }
-}

+ 0 - 36
elab-backstage-core/src/main/java/com/elab/backstage/core/message/BaseMessageRequest.java

@@ -1,36 +0,0 @@
-package com.elab.backstage.core.message;
-
-import java.util.Map;
-
-/**
- * 消息请求体
- *
- * @author : liukx
- * @time2019/10/28 - 13:55
- */
-public class BaseMessageRequest extends BaseMessage {
-    /**
-     * 请求头信息
-     */
-    private Map<String, String> header;
-    /**
-     * 请求参数
-     */
-    private Map<String, String> userMap;
-
-    public Map<String, String> getHeader() {
-        return header;
-    }
-
-    public void setHeader(Map<String, String> header) {
-        this.header = header;
-    }
-
-    public Map<String, String> getRequest() {
-        return userMap;
-    }
-
-    public void setRequest(Map<String, String> request) {
-        this.userMap = request;
-    }
-}

+ 0 - 68
elab-backstage-core/src/main/java/com/elab/backstage/core/message/DomainData.java

@@ -1,68 +0,0 @@
-package com.elab.backstage.core.message;
-
-import com.elab.backstage.core.enums.MessageEnums;
-
-import java.util.Date;
-
-/**
- * 项目信息
- *
- * @author : liukx
- * @time2019/10/28 - 15:05
- */
-public class DomainData extends BaseMessage {
-
-    public DomainData() {
-        setType(MessageEnums.REGISTER);
-    }
-
-    private String project;
-
-    private String ip;
-
-    private int port;
-
-    private Date startDate;
-
-    public String getProject() {
-        return project;
-    }
-
-    public void setProject(String project) {
-        this.project = project;
-    }
-
-    public String getIp() {
-        return ip;
-    }
-
-    public void setIp(String ip) {
-        this.ip = ip;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public Date getStartDate() {
-        return startDate;
-    }
-
-    public void setStartDate(Date startDate) {
-        this.startDate = startDate;
-    }
-
-    @Override
-    public String toString() {
-        return "DomainData{" +
-                "project='" + project + '\'' +
-                ", ip='" + ip + '\'' +
-                ", port=" + port +
-                ", startDate=" + startDate +
-                '}';
-    }
-}

+ 0 - 15
elab-backstage-core/src/main/java/com/elab/backstage/core/process/MessageProcess.java

@@ -1,15 +0,0 @@
-package com.elab.backstage.core.process;
-
-import io.netty.channel.Channel;
-
-public interface MessageProcess<T> extends TypeProcess {
-
-
-    /**
-     * 具体的执行器
-     *
-     * @param messageData
-     */
-    boolean process(Channel channel, T messageData);
-
-}

+ 0 - 22
elab-backstage-core/src/main/java/com/elab/backstage/core/process/RegisterProcess.java

@@ -1,22 +0,0 @@
-package com.elab.backstage.core.process;
-
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.message.DomainData;
-import io.netty.channel.Channel;
-
-public interface RegisterProcess extends MessageProcess<DomainData> {
-
-    @Override
-    default MessageEnums type() {
-        return MessageEnums.REGISTER;
-    }
-
-    /**
-     * 取消注册(下线)执行器
-     *
-     * @param channel
-     * @return
-     */
-    boolean unRegister(Channel channel);
-
-}

+ 0 - 13
elab-backstage-core/src/main/java/com/elab/backstage/core/process/TypeProcess.java

@@ -1,13 +0,0 @@
-package com.elab.backstage.core.process;
-
-import com.elab.backstage.core.enums.MessageEnums;
-
-public interface TypeProcess {
-
-    /**
-     * 消息处理类型
-     *
-     * @return
-     */
-    MessageEnums type();
-}

+ 0 - 123
elab-backstage-core/src/main/java/com/elab/backstage/core/server/TcpSocketReceiver.java

@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2011-2018, Meituan Dianping. All Rights Reserved.
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.elab.backstage.core.server;
-
-import com.elab.backstage.core.codec.ProtostuffDecoder;
-import com.elab.backstage.core.handler.NettyServerHandler;
-import com.elab.backstage.core.process.MessageProcess;
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.buffer.PooledByteBufAllocator;
-import io.netty.channel.*;
-import io.netty.channel.epoll.EpollEventLoopGroup;
-import io.netty.channel.epoll.EpollServerSocketChannel;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-public final class TcpSocketReceiver {
-
-    //    protected ServerConfigManager m_serverConfigManager;
-//
-//    private MessageHandler m_handler;
-//
-//    private ServerStatisticManager m_serverStateManager;
-    private List<MessageProcess> messageProcess;
-
-    private ChannelFuture m_future;
-
-    private EventLoopGroup m_bossGroup;
-
-    private EventLoopGroup m_workerGroup;
-
-    private Logger m_logger = LoggerFactory.getLogger(TcpSocketReceiver.class);
-
-    private int m_port = 4399; // default port number from phone, C:2, A:2, T:8
-
-    public TcpSocketReceiver(List<MessageProcess> messageProcess) {
-        this.messageProcess = messageProcess;
-    }
-
-    public synchronized void destory() {
-        try {
-            m_logger.info("start shutdown socket, port " + m_port);
-            m_future.channel().closeFuture();
-            m_bossGroup.shutdownGracefully();
-            m_workerGroup.shutdownGracefully();
-            m_logger.info("shutdown socket success");
-        } catch (Exception e) {
-            m_logger.warn(e.getMessage(), e);
-        }
-    }
-
-    protected boolean getOSMatches(String osNamePrefix) {
-        String os = System.getProperty("os.name");
-
-        if (os == null) {
-            return false;
-        }
-        return os.startsWith(osNamePrefix);
-    }
-
-    public void init() {
-        try {
-            startServer(m_port);
-        } catch (Exception e) {
-            m_logger.error(e.getMessage(), e);
-        }
-    }
-
-    public synchronized void startServer(int port) throws InterruptedException {
-        boolean linux = getOSMatches("Linux") || getOSMatches("LINUX");
-        int threads = 24;
-        ServerBootstrap bootstrap = new ServerBootstrap();
-
-        m_bossGroup = linux ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads);
-        m_workerGroup = linux ? new EpollEventLoopGroup(threads) : new NioEventLoopGroup(threads);
-        bootstrap.group(m_bossGroup, m_workerGroup);
-        bootstrap.channel(linux ? EpollServerSocketChannel.class : NioServerSocketChannel.class);
-
-        bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
-            @Override
-            protected void initChannel(SocketChannel ch) throws Exception {
-                ChannelPipeline pipeline = ch.pipeline();
-                // 解码数据
-                pipeline.addLast("decoder", new ProtostuffDecoder());
-//                pipeline.addLast("encoder", new ProtostuffEncoder());
-                pipeline.addLast("handler", new NettyServerHandler(messageProcess));
-            }
-        });
-
-        bootstrap.childOption(ChannelOption.SO_REUSEADDR, true);
-        bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
-        bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
-        bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
-
-        try {
-            m_future = bootstrap.bind(port).sync();
-            m_logger.info("start netty server! port : " + port);
-        } catch (Exception e) {
-            m_logger.error("Started Netty Server Failed:" + port, e);
-        }
-    }
-
-}

+ 0 - 37
elab-backstage-service/src/main/java/com/elab/backstage/config/BeanConfig.java

@@ -1,37 +0,0 @@
-package com.elab.backstage.config;
-
-import com.elab.backstage.core.process.MessageProcess;
-import com.elab.backstage.core.server.TcpSocketReceiver;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.FilterType;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-
-import java.util.List;
-
-/**
- * Spring定义
- * 普通的Bean的定义
- *
- * @author Liuhx
- * @version V1.0
- * @create 2018/6/14 13:40
- * @email liuhx@elab-plus.com
- **/
-@Configuration
-@ComponentScan(basePackages = {"com.elab.backstage"}, excludeFilters = {
-        @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class, ControllerAdvice.class})
-})
-//@Import({DataSourceConfigBean.class, JdbcBeanConfig.class, TransactionConfigBean.class})
-public class BeanConfig {
-
-    @Bean
-    public TcpSocketReceiver tcpSocketReceiver(List<MessageProcess> messageProcesses) throws InterruptedException {
-        TcpSocketReceiver tcpSocketReceiver = new TcpSocketReceiver(messageProcesses);
-        tcpSocketReceiver.startServer(4399);
-        return tcpSocketReceiver;
-    }
-
-}

+ 0 - 53
elab-backstage-service/src/main/java/com/elab/backstage/process/MapRegisterProcess.java

@@ -1,53 +0,0 @@
-package com.elab.backstage.process;
-
-import com.elab.backstage.core.message.DomainData;
-import com.elab.backstage.core.process.RegisterProcess;
-import io.netty.channel.Channel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 客户端注册执行器
- *
- * @author : liukx
- * @time2019/10/28 - 18:44
- */
-@Component
-public class MapRegisterProcess implements RegisterProcess {
-
-    private Logger logger = LoggerFactory.getLogger(MapRegisterProcess.class);
-
-    private Map<String, Channel> channelRegister = new ConcurrentHashMap<>();
-
-    private Map<String, DomainData> clientRegister = new ConcurrentHashMap<>();
-
-    @Override
-    public boolean process(Channel channel, DomainData messageData) {
-        String address = channel.remoteAddress().toString();
-        channelRegister.put(address, channel);
-        clientRegister.put(address, messageData);
-        logger.info("上线通知 : {} , 具体对象 : {}", address, messageData);
-        return true;
-    }
-
-    @Override
-    public boolean unRegister(Channel channel) {
-        String address = channel.remoteAddress().toString();
-        channelRegister.remove(address);
-        DomainData remove = clientRegister.remove(address);
-        logger.info("下线通知 : {} , 具体对象 : {}", address, remove);
-        return true;
-    }
-
-    public Map<String, Channel> getChannelRegister() {
-        return channelRegister;
-    }
-
-    public Map<String, DomainData> getClientRegister() {
-        return clientRegister;
-    }
-}

+ 0 - 81
elab-backstage-service/src/main/java/com/elab/backstage/process/URLMessageProcess.java

@@ -1,81 +0,0 @@
-package com.elab.backstage.process;
-
-import com.alibaba.fastjson.JSON;
-import com.elab.backstage.core.enums.MessageEnums;
-import com.elab.backstage.core.message.BaseMessageData;
-import com.elab.backstage.core.process.MessageProcess;
-import com.elab.backstage.daos.BackstageUrlExtMapper;
-import com.elab.backstage.daos.BackstageUrlMapper;
-import com.elab.backstage.models.entity.BackstageUrl;
-import com.elab.backstage.models.entity.BackstageUrlExtWithBLOBs;
-import io.netty.channel.Channel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.Map;
-
-/**
- * 路由数据解析
- *
- * @author : liukx
- * @time2019/10/25 - 15:32
- */
-@Component
-public class URLMessageProcess implements MessageProcess<BaseMessageData> {
-
-    private Logger logger = LoggerFactory.getLogger(URLMessageProcess.class);
-
-    @Autowired
-    private BackstageUrlMapper backstageUrlMapper;
-
-    @Autowired
-    private BackstageUrlExtMapper backstageUrlExtMapper;
-
-    @Override
-    public MessageEnums type() {
-        return MessageEnums.URL;
-    }
-
-    @Override
-    public boolean process(Channel channel, BaseMessageData messageData) {
-        // 客户端执行耗时
-        long invokeTime = messageData.getInvokeTime();
-        // 客户端ip
-        String ip = messageData.getIp();
-        String project = messageData.getProject();
-        String requestBody = messageData.getRequestBody();
-        String responseBody = messageData.getResponseBody();
-        Map<String, String> header = messageData.getHeader();
-        String url = messageData.getUrl();
-        int statusCode = messageData.getStatusCode();
-
-        BackstageUrl backstageUrl = new BackstageUrl();
-        backstageUrl.setUserIp(messageData.getUserIp());
-        backstageUrl.setStatusCode(statusCode);
-        backstageUrl.setCreateTime(new Date());
-        backstageUrl.setServiceName(messageData.getServiceName());
-        backstageUrl.setUrl(url);
-        backstageUrl.setDomain(project);
-        backstageUrl.setMethod(messageData.getMethod());
-        backstageUrl.setInvokeTime(invokeTime);
-        backstageUrl.setServiceIp(ip);
-        backstageUrl.setFrontProjectName(messageData.getFrontProjectName());
-        backstageUrl.setUserDevice(messageData.getUserDevice());
-        backstageUrl.setUserSystem(messageData.getUserSystem());
-        backstageUrl.setUserId(messageData.getUserId());
-        backstageUrl.setMsgId(messageData.getMsgId());
-        int backstageUrlId = backstageUrlMapper.insert(backstageUrl);
-
-        BackstageUrlExtWithBLOBs backstageUrlExtWithBLOBs = new BackstageUrlExtWithBLOBs();
-        backstageUrlExtWithBLOBs.setUrlId(backstageUrlId);
-        backstageUrlExtWithBLOBs.setRequestBody(requestBody);
-        backstageUrlExtWithBLOBs.setResponseBody(responseBody);
-        backstageUrlExtWithBLOBs.setUserAgent(messageData.getUserAgent());
-        backstageUrlExtWithBLOBs.setHeaderBody(JSON.toJSONString(header));
-        backstageUrlExtMapper.insert(backstageUrlExtWithBLOBs);
-        return true;
-    }
-}

+ 0 - 1
elab-backstage-service/src/main/resources/META-INF/app.properties

@@ -1 +0,0 @@
-app.name=elab-backstage-service

+ 0 - 1
elab-backstage-service/src/main/resources/META-INF/spring.factories

@@ -1 +0,0 @@
-org.springframework.context.ApplicationListener=org.springframework.boot.system.ApplicationPidFileWriter

+ 0 - 15
elab-backstage-service/src/test/java/com/elab/backstage/BaseCase.java

@@ -1,15 +0,0 @@
-package com.elab.backstage;
-
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * @describe
- * @Author : liukx
- * @time2019/2/28 - 16:13
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = BackstageServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-public class BaseCase {
-}

+ 0 - 21
elab-backstage-service/src/test/java/com/elab/backstage/models/response/RouteDataResponseTest.java

@@ -1,21 +0,0 @@
-package com.elab.backstage.models.response;
-
-import org.junit.Test;
-import org.springframework.beans.BeanUtils;
-
-public class RouteDataResponseTest {
-
-    @Test
-    public void equals() {
-        RouteDataResponse routeDataResponse = new RouteDataResponse();
-        routeDataResponse.setUrl("/a");
-        routeDataResponse.setAuthor("lkx");
-        routeDataResponse.setMethod("post");
-        routeDataResponse.setRemark("aaaaa");
-
-        RouteDataResponse entity = new RouteDataResponse();
-        BeanUtils.copyProperties(routeDataResponse, entity);
-        entity.setRemark("aaaaa");
-        System.out.println(entity.equals(routeDataResponse));
-    }
-}

+ 0 - 32
elab-backstage-service/src/test/java/com/elab/backstage/services/IRouteDataServiceTest.java

@@ -1,32 +0,0 @@
-package com.elab.backstage.services;
-
-
-import com.alibaba.fastjson.JSON;
-import com.elab.backstage.BaseCase;
-import com.elab.backstage.models.request.route.RouteDataRequest;
-import com.elab.backstage.models.response.RouteDataResponse;
-import org.junit.Assert;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-
-import java.util.List;
-
-public class IRouteDataServiceTest extends BaseCase {
-
-
-    @Autowired
-    @Qualifier("swaggerRouteDataService")
-    private IRouteDataService SwaggerRouteDataService;
-
-
-    @Test
-    public void getData() {
-        RouteDataRequest routeDataRequest = new RouteDataRequest();
-        routeDataRequest.setProjectName("elab-marketing-system");
-        routeDataRequest.setUrl("http://localhost:5400/");
-        List<RouteDataResponse> data = SwaggerRouteDataService.getData(routeDataRequest);
-        System.out.println(JSON.toJSONString(data));
-        Assert.assertNull(data);
-    }
-}

+ 0 - 46
elab-backstage-service/src/test/java/com/elab/backstage/services/impl/BackstageRouteServiceImplTest.java

@@ -1,46 +0,0 @@
-package com.elab.backstage.services.impl;
-
-
-import com.elab.backstage.BackstageServiceApplication;
-import com.elab.backstage.core.model.response.ResponseCommonModel;
-import com.elab.backstage.models.request.route.RouteDataRequest;
-//import com.netflix.discovery.EurekaClient;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.List;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = BackstageServiceApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-public class BackstageRouteServiceImplTest {
-
-    @Autowired
-    private DefaultBackstageRouteService backstageRouteService;
-
-//    @Autowired
-//    private EurekaClient eurekaClient;
-
-    @Test
-    public void insert() {
-    }
-
-    @Test
-    public void getRoutes() {
-        List<String> routes = backstageRouteService.getRoutes();
-        System.out.println(routes);
-    }
-
-    @Test
-    public void executeRefresh() throws Exception {
-
-        RouteDataRequest request = new RouteDataRequest();
-        request.setProjectName("elab-marketing-system");
-        ResponseCommonModel responseCommonModel = backstageRouteService.executeRefresh(request);
-        System.out.println(responseCommonModel.toString());
-
-
-    }
-}

+ 3 - 3
elab-backstage-api/pom.xml

@@ -3,13 +3,13 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>elab-backstage-web</artifactId>
-        <groupId>com.elab.backstage</groupId>
+        <groupId>com.jay.monitor.data</groupId>
+        <artifactId>jay-monitor-data-web</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>elab-backstage-api</artifactId>
+    <artifactId>jay-monitor-data-api</artifactId>
 
 
     <dependencies>

+ 101 - 0
jay-monitor-data-client/README.md

@@ -0,0 +1,101 @@
+# 客户端
+
+## 使用方法
+
+### 引入依赖
+
+**pom.xml**
+
+```xml
+<dependency>
+    <groupId>com.elab.backstage</groupId>
+    <artifactId>elab-backstage-client</artifactId>
+    <version>1.0-SNAPSHOT</version>
+</dependency>
+```
+
+### 开启功能
+
+SpringServerApplication
+
+```java
+@EnableBackstageData
+```
+
+以上功能开启。
+
+
+
+
+
+
+
+## 数据的传输格式
+
+以Zuul网关为例 : `ZuulDataFilter`
+
+该类会在启动的时候注入到SpringMVC中,作为数据拦截器。
+
+拦截器的负责收集的数据内容: 
+
+1. 入参
+2. 出参
+3. header
+4. 请求格式
+5. URL
+6. ....
+
+这部分的数据是统一收集的,但最终会经过**BaseMessageData**传输到服务端。
+
+这里就涉及到传输的数据定位是否符合你的要求,如果不符合?
+
+可以通过客户端自己实现`ParamsGenerate`接口,自己去组装好内部数据。
+
+实现`ParamsGenerate` 接口
+
+参考案例: 
+
+```java
+@Component
+public class DefaultParamsGenerate implements ParamsGenerate {
+
+    @Override
+    public void postBusinessData(BaseMessageData baseMessageData) {
+        Map<String, String> header = baseMessageData.getHeader();
+        String elabEnvironment = header.get("elabenvironment");
+        String elabProjectName = header.get("elabprojectname");
+        String elabSystem = header.get("elabsystem");
+        baseMessageData.setUserSystem(elabSystem);
+        baseMessageData.setFrontProjectName(elabProjectName);
+        baseMessageData.setUserDevice(elabEnvironment);
+        String baseUrl = baseMessageData.getUrl();
+        baseUrl = baseUrl.replace("//", "/");
+        String serviceName = baseUrl.split("/")[1];
+        String url = baseUrl.substring(baseUrl.indexOf(serviceName) + serviceName.length(), baseUrl.length());
+        baseMessageData.setServiceName(serviceName);
+        baseMessageData.setMsgId(header.get("_catrootmessageid"));
+        baseMessageData.setUserIp(header.get("x-forwarded-for"));
+        baseMessageData.setUrl(url);
+    }
+}
+
+```
+
+比如有一些消息编号、设备号、以及用户编号等等这些信息可能需要客户端自己去获取放入该传输类中。
+
+### 其他网关接入
+
+实现思路:
+
+1. 设置一道拦截器
+2. 自己组装header、request、body到`BaseMessageData`中
+3. 通过数据传输器`TcpSocketSender`进行传输
+
+## 数据传输器
+
+**TcpSocketSender**
+
+传输器传输的值必须继承`BaseMessage`,要指定`MsgTypeEnums`类型。
+
+服务端会根据该类型找对应的处理器。
+

+ 15 - 5
elab-backstage-client/pom.xml

@@ -3,19 +3,24 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>elab-backstage-web</artifactId>
-        <groupId>com.elab.backstage</groupId>
+        <groupId>com.jay.monitor.data</groupId>
+        <artifactId>jay-monitor-data-web</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>elab-backstage-client</artifactId>
+    <artifactId>jay-monitor-data-client</artifactId>
 
 
     <dependencies>
         <dependency>
-            <groupId>com.elab.backstage</groupId>
-            <artifactId>elab-backstage-core</artifactId>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jay.monitor.data</groupId>
+            <artifactId>jay-monitor-data-core</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
@@ -33,5 +38,10 @@
             <artifactId>junit</artifactId>
             <version>4.12</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
     </dependencies>
 </project>

+ 100 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorDataClient.java

@@ -0,0 +1,100 @@
+package com.jay.monitor.data.client;
+
+import com.alipay.remoting.InvokeContext;
+import com.alipay.remoting.rpc.RpcClient;
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+import com.jay.monitor.data.core.model.serializable.BaseDTO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Queue;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * 监控数据客户端传输列
+ *
+ * @author : liukx
+ * @time2020/8/26 - 14:25
+ */
+public class MonitorDataClient implements Runnable {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    private String host;
+
+    private Integer port = MonitorDataConstants.DEFAULT_PORT;
+
+    private String addr;
+
+    private RpcClient client = new RpcClient();
+
+    private Integer queueSize = 1000;
+
+    private Queue<BaseDTO> queueData;
+
+    /**
+     * 全局上下文传递信息,用于存储一些公共信息
+     */
+    private InvokeContext invokeContext = new InvokeContext();
+
+    public MonitorDataClient(String host, Integer port) {
+        this.host = host;
+        this.port = port;
+        this.addr = host + ":" + port;
+    }
+
+    /**
+     * 初始化数据
+     */
+    public void init() {
+        queueData = new ArrayBlockingQueue<>(getQueueSize());
+        client.startup();
+    }
+
+    public Integer getQueueSize() {
+        return queueSize;
+    }
+
+    public void setQueueSize(Integer queueSize) {
+        this.queueSize = queueSize;
+    }
+
+    public String getAddr() {
+        return addr;
+    }
+
+    /**
+     * 单向发送
+     *
+     * @param data
+     * @throws Exception
+     */
+    public void sendOnway(Object data) throws Exception {
+        client.oneway(getAddr(), data, invokeContext);
+    }
+
+    public void addInvokeContext(String key, String value) {
+        invokeContext.put(key, value);
+    }
+
+    @Override
+    public void run() {
+        while (true) {
+            BaseDTO baseDTO = queueData.poll();
+            try {
+                if (baseDTO != null) {
+                    sendOnway(baseDTO);
+                }
+            } catch (Exception e) {
+                logger.error("monitor consumer fail", e);
+            } finally {
+                try {
+                    Thread.sleep(5);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        }
+    }
+}

+ 48 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/ClientMonitorAutoConfiguration.java

@@ -0,0 +1,48 @@
+package com.jay.monitor.data.client.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.jay.monitor.data.client.MonitorDataClient;
+import com.jay.monitor.data.client.config.props.MonitorProperties;
+import com.jay.monitor.data.client.filter.DruidMonitorFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.net.InetAddress;
+
+/**
+ * 客户端监控配置
+ *
+ * @author : liukx
+ * @time2020/8/26 - 15:39
+ */
+@Configuration
+@EnableConfigurationProperties({MonitorProperties.class})
+public class ClientMonitorAutoConfiguration {
+
+    @Autowired
+    private MonitorProperties monitorProperties;
+
+    @Value(value = "${spring.application.name}")
+    private String applicationName;
+
+    @Bean
+    public MonitorDataClient monitorDataClient() throws Exception {
+        MonitorDataClient client = new MonitorDataClient(monitorProperties.getHost(), monitorProperties.getPort());
+        client.setQueueSize(monitorProperties.getQueueSize());
+        client.addInvokeContext("client.service", applicationName);
+        client.addInvokeContext("client.intranet", InetAddress.getLocalHost().getHostAddress());
+        return client;
+    }
+
+    @Bean
+    @ConditionalOnBean(value = {DruidDataSource.class})
+    public DruidMonitorFilter druidMonitorFilter() {
+        DruidMonitorFilter monitorFilter = new DruidMonitorFilter();
+        return monitorFilter;
+    }
+
+}

+ 54 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/props/MonitorProperties.java

@@ -0,0 +1,54 @@
+package com.jay.monitor.data.client.config.props;
+
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 监控配置信息
+ *
+ * @author : liukx
+ * @time2020/8/26 - 15:40
+ */
+@ConfigurationProperties(prefix = "spring.monitorData")
+public class MonitorProperties {
+
+    private String host;
+
+    private Integer port = MonitorDataConstants.DEFAULT_PORT;
+
+    private Integer queueSize = 1000;
+
+    private SQLMonitorProperties sql;
+
+    public Integer getQueueSize() {
+        return queueSize;
+    }
+
+    public void setQueueSize(Integer queueSize) {
+        this.queueSize = queueSize;
+    }
+
+    public SQLMonitorProperties getSql() {
+        return sql;
+    }
+
+    public void setSql(SQLMonitorProperties sql) {
+        this.sql = sql;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public void setHost(String host) {
+        this.host = host;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public void setPort(Integer port) {
+        this.port = port;
+    }
+}

+ 48 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/props/SQLMonitorProperties.java

@@ -0,0 +1,48 @@
+package com.jay.monitor.data.client.config.props;
+
+/**
+ * SQL配置参数
+ *
+ * @author : liukx
+ * @time2020/8/26 - 17:38
+ */
+public class SQLMonitorProperties {
+    /**
+     * 超过的耗时时间
+     */
+    private Long longTime = 500L;
+
+    /**
+     * 超过的最大行数
+     */
+    private Long longRow = 500L;
+
+    /**
+     * 超过的数据长度
+     */
+    private Long dataLength = 1020 * 1024L;
+
+    public Long getLongTime() {
+        return longTime;
+    }
+
+    public void setLongTime(Long longTime) {
+        this.longTime = longTime;
+    }
+
+    public Long getLongRow() {
+        return longRow;
+    }
+
+    public void setLongRow(Long longRow) {
+        this.longRow = longRow;
+    }
+
+    public Long getDataLength() {
+        return dataLength;
+    }
+
+    public void setDataLength(Long dataLength) {
+        this.dataLength = dataLength;
+    }
+}

+ 53 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/filter/DruidMonitorFilter.java

@@ -0,0 +1,53 @@
+package com.jay.monitor.data.client.filter;
+
+import com.alibaba.druid.filter.FilterAdapter;
+import com.alibaba.druid.filter.FilterChain;
+import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
+import com.alibaba.druid.stat.JdbcSqlStat;
+import com.jay.monitor.data.client.MonitorDataClient;
+import com.jay.monitor.data.client.config.props.MonitorProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.sql.SQLException;
+
+/**
+ * Cat监控相关SQL执行情况
+ *
+ * @author : liukx
+ * @time2020/8/24 - 15:39
+ */
+@Component
+public class DruidMonitorFilter extends FilterAdapter {
+
+    @Autowired
+    private MonitorDataClient client;
+
+    private MonitorProperties monitorProperties;
+
+    @Override
+    public void resultSet_beforeFirst(FilterChain chain, ResultSetProxy resultSet) throws SQLException {
+        super.resultSet_beforeFirst(chain, resultSet);
+    }
+
+    @Override
+    public boolean resultSet_isClosed(FilterChain chain, ResultSetProxy resultSet) throws SQLException {
+        return super.resultSet_isClosed(chain, resultSet);
+    }
+
+    @Override
+    public void resultSet_close(FilterChain chain, ResultSetProxy resultSet) throws SQLException {
+
+        JdbcSqlStat sqlStat = resultSet.getSqlStat();
+        String sqlContent = "";
+
+//        if (resultSet.getStatement() instanceof PreparedStatement) {
+//            Statement statement = resultSet.getStatement();
+//            sqlContent = statement.asSql();
+//        }
+
+        String sql = sqlStat.getSql();
+
+        chain.resultSet_close(resultSet);
+    }
+}

elab-backstage-client/src/test/resources/application.yml → jay-monitor-data-client/src/test/resources/application.yml


+ 16 - 23
elab-backstage-core/pom.xml

@@ -3,20 +3,29 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>elab-backstage-web</artifactId>
-        <groupId>com.elab.backstage</groupId>
+        <groupId>com.jay.monitor.data</groupId>
+        <artifactId>jay-monitor-data-web</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>elab-backstage-core</artifactId>
+    <artifactId>jay-monitor-data-core</artifactId>
 
 
     <dependencies>
-        <!--        <dependency>-->
-        <!--            <groupId>com.elab.core</groupId>-->
-        <!--            <artifactId>elab-core</artifactId>-->
-        <!--        </dependency>-->
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>bolt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa.common</groupId>
+            <artifactId>sofa-common-tools</artifactId>
+        </dependency>
+        <!-- 默认的序列化框架 -->
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>hessian</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
@@ -37,27 +46,11 @@
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>org.slf4j</groupId>-->
-<!--            <artifactId>slf4j-api</artifactId>-->
-<!--        </dependency>-->
-        <!--        <dependency>-->
-        <!--            <groupId>org.slf4j</groupId>-->
-        <!--            <artifactId>slf4j-log4j12</artifactId>-->
-        <!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>ch.qos.logback</groupId>-->
-<!--            <artifactId>logback-classic</artifactId>-->
-<!--        </dependency>-->
 
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
         </dependency>
-        <!--        <dependency>-->
-        <!--            <groupId>com.elab.log</groupId>-->
-        <!--            <artifactId>elab-log</artifactId>-->
-        <!--        </dependency>-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-test</artifactId>

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/enums/CommonErrors.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.enums;
+package com.jay.monitor.data.core.enums;
 
 /**
  * 公共枚举定义

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/enums/EnumService.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.enums;
+package com.jay.monitor.data.core.enums;
 
 /**
  * @author : liukx

+ 27 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MonitorDataConstants.java

@@ -0,0 +1,27 @@
+package com.jay.monitor.data.core.enums;
+
+/**
+ * 各种常量定义
+ *
+ * @author : liukx
+ * @time2019/10/28 - 15:28
+ */
+public class MonitorDataConstants {
+
+
+//    public static final AttributeKey<DomainData> CLIENT_DOMAIN_KEY = AttributeKey.valueOf("clinet.info");
+
+    /**
+     * 默认端口
+     */
+    public static final Integer DEFAULT_PORT = 9420;
+
+    public static final byte M_REGISTER = 0x01;     // Request
+    public static final byte M_URL = 0x02;     // Response
+    public static final byte M_SQL = 0x03;     // 发布服务
+    public static final byte PUBLISH_CANCEL_SERVICE = 0x04;     // 取消发布服务
+    public static final byte SUBSCRIBE_SERVICE = 0x05;     // 订阅服务
+    public static final byte OFFLINE_NOTICE = 0x06;     // 通知下线
+    public static final byte ACK = 0x07;     // Acknowledge
+    public static final byte HEARTBEAT = 0x0f;     // Heartbeat
+}

+ 12 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MsgTypeEnums.java

@@ -0,0 +1,12 @@
+package com.jay.monitor.data.core.enums;
+
+
+/**
+ * 消息的类型定义
+ *
+ * @author : liukx
+ * @time2019/10/25 - 15:07
+ */
+public enum MsgTypeEnums {
+    SQL, SERVICE, URL, BUSINESS, CACHE, OTHER;
+}

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/exception/BusinessException.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.exception;
+package com.jay.monitor.data.core.exception;
 
 /**
  * 业务异常定义

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/exception/MessageTypeException.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.exception;
+package com.jay.monitor.data.core.exception;
 
 /**
  * 业务异常定义

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ListResponseModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 import java.util.List;
 

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ObjectResponseModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 /**
  * 单个对象参数处理

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageInfoModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 import java.util.List;
 

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageRequestModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 
 /**

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/PageResponseModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 /**
  * 分页公共出参对象

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/model/response/ResponseCommonModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.model.response;
+package com.jay.monitor.data.core.model.response;
 
 /**
  * 返回公共实体

+ 58 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/BaseDTO.java

@@ -0,0 +1,58 @@
+package com.jay.monitor.data.core.model.serializable;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 基础数据传输
+ *
+ * @author : liukx
+ * @time2020/8/26 - 16:22
+ */
+public class BaseDTO implements Serializable {
+
+    public BaseDTO(MsgTypeEnums type) {
+        this.type = type;
+    }
+
+    /**
+     * 数据传输类型
+     */
+    private MsgTypeEnums type;
+
+    /**
+     * 日志编号
+     */
+    private String logId;
+    /**
+     * 拓展参数
+     */
+    private Map<String, Object> extMap = new LinkedHashMap<String, Object>();
+
+    public String getLogId() {
+        return logId;
+    }
+
+    public void setLogId(String logId) {
+        this.logId = logId;
+    }
+
+    public MsgTypeEnums getType() {
+        return type;
+    }
+
+    public void setType(MsgTypeEnums type) {
+        this.type = type;
+    }
+
+    public Map<String, Object> getExtMap() {
+        return extMap;
+    }
+
+    public void setExtMap(Map<String, Object> extMap) {
+        this.extMap = extMap;
+    }
+}

+ 102 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/SQLMonitorDTO.java

@@ -0,0 +1,102 @@
+package com.jay.monitor.data.core.model.serializable;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+
+/**
+ * SQL相关的数据
+ *
+ * @author : liukx
+ * @time2020/8/26 - 16:31
+ */
+public class SQLMonitorDTO extends BaseDTO {
+
+    public SQLMonitorDTO() {
+        super(MsgTypeEnums.SQL);
+    }
+
+    /**
+     * sql编号
+     */
+    private String sqlId;
+    /**
+     * sql内容
+     */
+    private String sqlText;
+    /**
+     * SQL类型
+     */
+    private Integer SqlType;
+    /**
+     * 返回行数
+     */
+    private String resultRow;
+    /**
+     * 获取读取的数据大小
+     */
+    private Long readStringLength;
+    /**
+     * 请求耗时
+     */
+    private String requestTime;
+
+    /**
+     * 最大并发数
+     */
+    private Integer concurrentMax;
+
+    public String getSqlId() {
+        return sqlId;
+    }
+
+    public void setSqlId(String sqlId) {
+        this.sqlId = sqlId;
+    }
+
+    public String getSqlText() {
+        return sqlText;
+    }
+
+    public void setSqlText(String sqlText) {
+        this.sqlText = sqlText;
+    }
+
+    public Integer getSqlType() {
+        return SqlType;
+    }
+
+    public void setSqlType(Integer sqlType) {
+        SqlType = sqlType;
+    }
+
+    public String getResultRow() {
+        return resultRow;
+    }
+
+    public void setResultRow(String resultRow) {
+        this.resultRow = resultRow;
+    }
+
+    public Long getReadStringLength() {
+        return readStringLength;
+    }
+
+    public void setReadStringLength(Long readStringLength) {
+        this.readStringLength = readStringLength;
+    }
+
+    public String getRequestTime() {
+        return requestTime;
+    }
+
+    public void setRequestTime(String requestTime) {
+        this.requestTime = requestTime;
+    }
+
+    public Integer getConcurrentMax() {
+        return concurrentMax;
+    }
+
+    public void setConcurrentMax(Integer concurrentMax) {
+        this.concurrentMax = concurrentMax;
+    }
+}

+ 1 - 1
elab-backstage-core/src/main/java/com/elab/backstage/core/utils/ProtostuffUtils.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.core.utils;
+package com.jay.monitor.data.core.utils;
 
 import io.protostuff.LinkedBuffer;
 import io.protostuff.ProtostuffIOUtil;

+ 5 - 5
elab-backstage-core/src/main/java/com/elab/backstage/core/utils/ResponseUtils.java

@@ -1,9 +1,9 @@
-package com.elab.backstage.core.utils;
+package com.jay.monitor.data.core.utils;
 
-import com.elab.backstage.core.enums.CommonErrors;
-import com.elab.backstage.core.enums.EnumService;
-import com.elab.backstage.core.exception.BusinessException;
-import com.elab.backstage.core.model.response.*;
+import com.jay.monitor.data.core.enums.CommonErrors;
+import com.jay.monitor.data.core.enums.EnumService;
+import com.jay.monitor.data.core.exception.BusinessException;
+import com.jay.monitor.data.core.model.response.*;
 
 import java.util.List;
 

elab-backstage-core/src/test/java/com/elab/backstage/core/server/TcpSocketReceiverTest.java → jay-monitor-data-core/src/test/java/com/elab/backstage/core/server/TcpSocketReceiverTest.java


+ 12 - 8
elab-backstage-service/pom.xml

@@ -3,12 +3,12 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>elab-backstage-web</artifactId>
-        <groupId>com.elab.backstage</groupId>
+        <groupId>com.jay.monitor.data</groupId>
+        <artifactId>jay-monitor-data-web</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>elab-backstage-service</artifactId>
+    <artifactId>jay-monitor-data-service</artifactId>
 
     <properties>
 <!--        <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>-->
@@ -16,13 +16,13 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.elab.backstage</groupId>
-            <artifactId>elab-backstage-api</artifactId>
-            <version>${project.parent.version}</version>
+            <groupId>com.jay.monitor.data</groupId>
+            <artifactId>jay-monitor-data-api</artifactId>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.elab.backstage</groupId>
-            <artifactId>elab-backstage-core</artifactId>
+            <groupId>com.jay.monitor.data</groupId>
+            <artifactId>jay-monitor-data-core</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
@@ -88,6 +88,10 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency>
 <!--        <dependency>-->
 <!--            <groupId>org.mybatis.caches</groupId>-->
 <!--            <artifactId>mybatis-ehcache</artifactId>-->

+ 4 - 2
elab-backstage-service/src/main/java/com/elab/backstage/BackstageServiceApplication.java

@@ -1,11 +1,13 @@
-package com.elab.backstage;
+package com.jay.monitor.data.server;
 
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
-@MapperScan(basePackages = "com.elab.backstage.daos")
+@MapperScan(basePackages = "com.jay.monitor.data.server.daos")
+@EnableScheduling
 //@EnableDiscoveryClient
 //@EnableFeignClients
 public class BackstageServiceApplication {

+ 75 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/MonitorDataServer.java

@@ -0,0 +1,75 @@
+package com.jay.monitor.data.server;
+
+import com.alipay.remoting.ConnectionEventProcessor;
+import com.alipay.remoting.ConnectionEventType;
+import com.alipay.remoting.rpc.RpcServer;
+import com.alipay.remoting.rpc.protocol.UserProcessor;
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+
+import java.util.List;
+
+/**
+ * 监控数据服务接收器
+ *
+ * @author : liukx
+ * @time2020/8/26 - 14:41
+ */
+public class MonitorDataServer {
+
+    /**
+     * port
+     */
+    private int port = MonitorDataConstants.DEFAULT_PORT;
+
+    /**
+     * rpc server
+     */
+    private RpcServer server;
+
+    public MonitorDataServer(int port) {
+        this.port = port;
+        this.server = new RpcServer(this.port);
+    }
+
+    public MonitorDataServer(int port, boolean manageFeatureEnabled) {
+        this.port = port;
+        this.server = new RpcServer(this.port, manageFeatureEnabled);
+    }
+
+    public MonitorDataServer(int port, boolean manageFeatureEnabled, boolean syncStop) {
+        this.port = port;
+        this.server = new RpcServer(this.port, manageFeatureEnabled, syncStop);
+    }
+
+    public boolean start() {
+        this.server.startup();
+        return true;
+    }
+
+    public void stop() {
+        this.server.stop();
+    }
+
+    public RpcServer getRpcServer() {
+        return this.server;
+    }
+
+    public void registerUserProcessor(UserProcessor<?> processor) {
+        this.server.registerUserProcessor(processor);
+    }
+
+    public void registerUserProcessor(List<UserProcessor<?>> processorList) {
+        for (UserProcessor<?> userProcessor : processorList) {
+            registerUserProcessor(userProcessor);
+        }
+    }
+
+    public void addConnectionEventProcessor(ConnectionEventType type,
+                                            ConnectionEventProcessor processor) {
+        this.server.addConnectionEventProcessor(type, processor);
+    }
+
+    public int getPort() {
+        return port;
+    }
+}

+ 44 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java

@@ -0,0 +1,44 @@
+package com.jay.monitor.data.server.config;
+
+import com.alipay.remoting.rpc.protocol.UserProcessor;
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+import com.jay.monitor.data.server.MonitorDataServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+
+import java.util.List;
+
+/**
+ * Spring定义
+ * 普通的Bean的定义
+ *
+ * @author Liuhx
+ * @version V1.0
+ * @create 2018/6/14 13:40
+ * @email liuhx@elab-plus.com
+ **/
+@Configuration
+@ComponentScan(basePackages = {"com.jay.monitor.data.server"}, excludeFilters = {
+        @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class, ControllerAdvice.class})
+})
+public class BeanConfig {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Bean
+    public MonitorDataServer boltServer(List<UserProcessor<?>> userProcessorList) {
+        MonitorDataServer monitorDataServer = new MonitorDataServer(MonitorDataConstants.DEFAULT_PORT);
+        monitorDataServer.registerUserProcessor(userProcessorList);
+        if (monitorDataServer.start()) {
+            logger.info(" 监控数据传输器启动完成 : " + monitorDataServer.getPort());
+        }
+        return monitorDataServer;
+    }
+
+}

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/config/MvcConfigBean.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.config;
+package com.jay.monitor.data.server.config;
 
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.ComponentScan;
@@ -19,7 +19,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
 @Configuration
 @EnableWebMvc
 //@EnableSwagger2
-@ComponentScan(basePackages = {"com.elab.backstage.controllers"}, includeFilters = {
+@ComponentScan(basePackages = {"com.jay.monitor.data.server.controllers"}, includeFilters = {
         @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class})})
 @ConfigurationProperties(prefix = "swagger2")
 public class MvcConfigBean extends WebMvcConfigurerAdapter {

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/config/MybatisConfig.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.config;
+package com.jay.monitor.data.server.config;
 
 import com.alibaba.druid.pool.DruidDataSource;
 import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/DaoAspectBean.java

@@ -1,4 +1,4 @@
-//package com.elab.backstage.config.aspect;
+//package com.jay.monitor.data.server.config.aspect;
 //
 //import com.elab.log.asepct.CatDaoAscept;
 //import org.aspectj.lang.ProceedingJoinPoint;
@@ -25,7 +25,7 @@
 //        return daoAspect;
 //    }
 //
-//    @Around(value = "execution(* com.elab.backstage.daos..*(..))")
+//    @Around(value = "execution(* com.jay.monitor.data.server.daos..*(..))")
 //    public Object around(ProceedingJoinPoint pjp) throws Throwable {
 //        return getDaoAspect().around(pjp);
 //    }

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/ServiceAspectBean.java

@@ -1,4 +1,4 @@
-//package com.elab.backstage.config.aspect;
+//package com.jay.monitor.data.server.config.aspect;
 //
 //import com.elab.log.asepct.CatAspect;
 //import org.aspectj.lang.ProceedingJoinPoint;
@@ -27,7 +27,7 @@
 //        return catAspect;
 //    }
 //
-//    @Around(value = "execution(* com.elab.backstage.services..*(..))")
+//    @Around(value = "execution(* com.jay.monitor.data.server.services..*(..))")
 //    public Object around(ProceedingJoinPoint pjp) throws Exception {
 //        if(pjp.getSignature().getName().equals("excel")){
 //            try {

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/config/aspect/ValidAspect.java

@@ -1,4 +1,4 @@
-//package com.elab.backstage.config.aspect;
+//package com.jay.monitor.data.server.config.aspect;
 //
 //import org.aspectj.lang.JoinPoint;
 //import org.aspectj.lang.annotation.Aspect;

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/config/mvc/WebInitializer.java

@@ -1,6 +1,6 @@
-package com.elab.backstage.config.mvc;
+package com.jay.monitor.data.server.config.mvc;
 
-import com.elab.backstage.config.BeanConfig;
+import com.jay.monitor.data.server.config.BeanConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.WebApplicationInitializer;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/controllers/IndexController.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.controllers;
+package com.jay.monitor.data.server.controllers;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 130 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/controllers/RouteController.java

@@ -0,0 +1,130 @@
+package com.jay.monitor.data.server.controllers;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jay.monitor.data.core.utils.ResponseUtils;
+import com.jay.monitor.data.core.model.response.ListResponseModel;
+import com.jay.monitor.data.core.model.response.ObjectResponseModel;
+import com.jay.monitor.data.core.model.response.ResponseCommonModel;
+import com.jay.monitor.data.server.models.entity.BackstageRoute;
+import com.jay.monitor.data.server.models.request.route.BackstageRoutePageRequest;
+import com.jay.monitor.data.server.models.request.route.RouteDataRequest;
+import com.jay.monitor.data.server.services.impl.DefaultBackstageRouteService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 后台路由管理
+ *
+ * @author liukx
+ * @Date 2019-02-28 15:16
+ */
+@Controller
+@RequestMapping(value = "/backstageRoute")
+public class RouteController {
+
+    final static private String page = "/route/";
+    @Autowired
+    private DefaultBackstageRouteService routesService;
+
+
+    @RequestMapping(value = "/list.html", method = RequestMethod.GET)
+    public String list() throws Exception {
+        return page + "routeList";
+    }
+
+    @RequestMapping(value = "/update.html", method = RequestMethod.GET)
+    public String update(@RequestParam("id") Integer id, Model model) throws Exception {
+        ResponseUtils.checkParamNull(id, "id");
+        BackstageRoute entity = routesService.getById(id + "");
+        model.addAttribute("obj", entity);
+        return page + "update";
+    }
+
+
+    @RequestMapping(value = "/refresh.html", method = RequestMethod.GET)
+    public String refreshHtml(Model model) throws Exception {
+        List<String> routes = routesService.getRoutes();
+        model.addAttribute("routes", routes);
+        return page + "refresh";
+    }
+
+    /**
+     * 添加后台路由管理管理模块
+     *
+     * @param request 请求参数
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "/insert", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ResponseCommonModel insertBackstageRoute(@RequestBody BackstageRoute request) throws Exception {
+        int result = routesService.insert(request);
+        ResponseCommonModel response = new ResponseCommonModel();
+        if (result < 0) {
+            response.setSuccess(false);
+        }
+        return response;
+    }
+
+    @RequestMapping(value = "/refresh", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ResponseCommonModel refresh(@RequestBody RouteDataRequest dataRequest) throws Exception {
+        ResponseCommonModel responseCommonModel = routesService.executeRefresh(dataRequest);
+        return responseCommonModel;
+    }
+
+    @RequestMapping(value = "/list", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ObjectResponseModel<BackstageRoute> findBackstageRouteList(@RequestBody BackstageRoutePageRequest request) throws Exception {
+        BackstageRoute entity = new BackstageRoute();
+        BeanUtils.copyProperties(request, entity);
+        // 将参数对应的全部匹配赋值
+        QueryWrapper queryWrapper = new QueryWrapper(entity);
+        Page<BackstageRoute> page = new Page<>(request.getPageNo(), request.getPageSize());
+        IPage pageInfo = routesService.page(page, queryWrapper);
+        ObjectResponseModel objectResponseModel = new ObjectResponseModel();
+        objectResponseModel.setSingle(pageInfo);
+        // 将查询出来的参数传递给对外的实体
+//        BeanUtils.copyProperties(backEntityPageModel, pageModel1);
+        return objectResponseModel;
+    }
+
+    @RequestMapping(value = "/getObjectById", method = RequestMethod.GET)
+    @ResponseBody
+    public ObjectResponseModel<BackstageRoute> getObjectById(@RequestParam("id") Integer id) throws Exception {
+        BackstageRoute result = routesService.getById(id + "");
+        ObjectResponseModel<BackstageRoute> model = new ObjectResponseModel<BackstageRoute>();
+        model.setSingle(result);
+        return model;
+    }
+
+    @RequestMapping(value = "/getObjectByList", method = RequestMethod.POST)
+    @ResponseBody
+    public ListResponseModel<BackstageRoute> getObjectByList(@RequestBody BackstageRoute request) throws Exception {
+        QueryWrapper queryWrapper = new QueryWrapper(request);
+        List<BackstageRoute> result = routesService.listObjs(queryWrapper);
+        ListResponseModel<BackstageRoute> model = new ListResponseModel<BackstageRoute>();
+        model.setList(result);
+        return model;
+    }
+
+    @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ResponseCommonModel updateBackstageRouteInfo(@RequestBody BackstageRoute request) throws Exception {
+        request.setUpdated(new Date());
+        boolean b = routesService.updateById(request);
+        ResponseCommonModel response = new ResponseCommonModel();
+        if (b) {
+            response.setSuccess(false);
+        }
+        return response;
+    }
+}

+ 29 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/controllers/ServerController.java

@@ -0,0 +1,29 @@
+package com.jay.monitor.data.server.controllers;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 服务的请求类
+ *
+ * @author : liukx
+ * @time2019/11/6 - 10:19
+ */
+@Controller
+@RequestMapping(value = "/server")
+public class ServerController {
+
+//    @Autowired
+//    private MapRegisterProcess mapRegisterProcess;
+
+//    @RequestMapping(value = "/list", method = RequestMethod.GET)
+//    @ResponseBody
+//    public List<DomainData> serverList() throws Exception {
+//        Map<String, DomainData> clientRegister = mapRegisterProcess.getClientRegister();
+//        List<DomainData> domainDataList = new ArrayList<>();
+//        clientRegister.forEach((K, V) -> {
+//            domainDataList.add(V);
+//        });
+//        return domainDataList;
+//    }
+}

+ 3 - 3
elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageRouteMapper.java

@@ -1,8 +1,8 @@
-package com.elab.backstage.daos;
+package com.jay.monitor.data.server.daos;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.elab.backstage.models.entity.BackstageRoute;
-import com.elab.backstage.models.entity.BackstageRouteExample;
+import com.jay.monitor.data.server.models.entity.BackstageRoute;
+import com.jay.monitor.data.server.models.entity.BackstageRouteExample;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;

+ 4 - 4
elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageUrlExtMapper.java

@@ -1,9 +1,9 @@
-package com.elab.backstage.daos;
+package com.jay.monitor.data.server.daos;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.elab.backstage.models.entity.BackstageUrlExt;
-import com.elab.backstage.models.entity.BackstageUrlExtExample;
-import com.elab.backstage.models.entity.BackstageUrlExtWithBLOBs;
+import com.jay.monitor.data.server.models.entity.BackstageUrlExt;
+import com.jay.monitor.data.server.models.entity.BackstageUrlExtExample;
+import com.jay.monitor.data.server.models.entity.BackstageUrlExtWithBLOBs;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;

+ 3 - 3
elab-backstage-service/src/main/java/com/elab/backstage/daos/BackstageUrlMapper.java

@@ -1,8 +1,8 @@
-package com.elab.backstage.daos;
+package com.jay.monitor.data.server.daos;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.elab.backstage.models.entity.BackstageUrl;
-import com.elab.backstage.models.entity.BackstageUrlExample;
+import com.jay.monitor.data.server.models.entity.BackstageUrl;
+import com.jay.monitor.data.server.models.entity.BackstageUrlExample;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/enums/CommonEnums.java

@@ -1,7 +1,7 @@
-package com.elab.backstage.enums;
+package com.jay.monitor.data.server.enums;
 
 
-import com.elab.backstage.core.enums.EnumService;
+import com.jay.monitor.data.core.enums.EnumService;
 
 public enum CommonEnums implements EnumService {
     COMMON_PARAM_ERROR("COMMON.PARAM.ERROR", "参数[%s]错误"),

+ 50 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduleJobService.java

@@ -0,0 +1,50 @@
+package com.jay.monitor.data.server.job;
+
+/**
+ * 调度接口
+ *
+ * @author : liukx
+ * @time2019/11/5 - 15:35
+ */
+public interface ScheduleJobService {
+
+    public final int HOUR_TYPE = 1;
+    public final int DAY_TYPE = 2;
+
+    /**
+     * 是否要执行跑批的前置条件。
+     * 考虑 :
+     * 1. 是否符合执行的条件 小时判断、天判断
+     * 2. 数据做幂等性判断
+     * 3. 还需要考虑的是如果是重跑的时候执行错过了你条件中的时间
+     *
+     * @return 是否执行任务
+     */
+    public boolean isDayInvoke();
+
+    /**
+     * 具体的任务,
+     *
+     * @return 是否需要重新跑
+     */
+    public void processDayJob() throws Exception;
+
+    /**
+     * 是否要执行跑批的前置条件。
+     * 考虑 :
+     * 1. 是否符合执行的条件 小时判断、天判断
+     * 2. 数据做幂等性判断
+     * 3. 还需要考虑的是如果是重跑的时候执行错过了你条件中的时间
+     *
+     * @return 是否执行任务
+     */
+    public boolean isHourInvoke();
+
+    /**
+     * 具体的任务,
+     *
+     * @return 是否需要重新跑
+     */
+    public void processHourJob() throws Exception;
+
+}

+ 37 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduleJobServiceAdaptor.java

@@ -0,0 +1,37 @@
+package com.jay.monitor.data.server.job;
+
+import org.springframework.core.Ordered;
+
+/**
+ * 默认按照天跑的任务
+ *
+ * @author : liukx
+ * @time2019/11/5 - 16:11
+ */
+public class ScheduleJobServiceAdaptor implements ScheduleJobService, Ordered {
+
+    @Override
+    public int getOrder() {
+        return Integer.MAX_VALUE;
+    }
+
+    @Override
+    public boolean isDayInvoke() {
+        return false;
+    }
+
+    @Override
+    public void processDayJob() throws Exception {
+
+    }
+
+    @Override
+    public boolean isHourInvoke() {
+        return false;
+    }
+
+    @Override
+    public void processHourJob() throws Exception {
+
+    }
+}

+ 180 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/job/ScheduledJob.java

@@ -0,0 +1,180 @@
+package com.jay.monitor.data.server.job;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ArrayBlockingQueue;
+
+/**
+ * 调度执行器
+ *
+ * @author : liukx
+ * @time2019/11/5 - 15:25
+ */
+@Component
+public class ScheduledJob implements Runnable {
+
+    private Logger logger = LoggerFactory.getLogger(ScheduledJob.class);
+
+    private Queue<FailsQueueData> failQueue = new ArrayBlockingQueue<FailsQueueData>(20);
+
+    @Autowired(required = false)
+    private List<ScheduleJobServiceAdaptor> dayJobServiceAdaptors;
+
+    private int maxCount = 3;
+
+    public void init() {
+        // 启动一个线程,用来处理跑失败的job
+        new Thread(this, "server-fails-job-Run").start();
+        /**
+         * 天的任务启动的时候就需要启动一次,因为每天就执行一次,避免因为宕机错过这一次时间而难以补救。
+         * 所以幂等这部分需要很好的做处理
+         */
+        dayJob();
+    }
+
+    /**
+     * 每天执行一次
+     */
+    @Scheduled(cron = "0 0 0 1/1 * ? ")
+    public void dayJob() {
+        processJob(ScheduleJobService.DAY_TYPE);
+    }
+
+    /**
+     * 每小时执行一次
+     */
+    @Scheduled(cron = "0 0 0/1 * * ?")
+    public void hourJob() {
+        processJob(ScheduleJobService.HOUR_TYPE);
+    }
+
+    private void processJobByType(ScheduleJobService job, int type) {
+        if (type == ScheduleJobService.DAY_TYPE) {
+            boolean invoke = job.isDayInvoke();
+            if (invoke) {
+                try {
+                    job.processDayJob();
+                } catch (Exception e) {
+                    logger.error(" day : " + job.toString() + " invoke fails", e);
+                    addFailsQueue(job, type);
+                    e.printStackTrace();
+                }
+            }
+        } else if (type == ScheduleJobService.HOUR_TYPE) {
+            boolean invoke = job.isHourInvoke();
+            if (invoke) {
+                try {
+                    job.processHourJob();
+                } catch (Exception e) {
+                    logger.error(" hour : " + job.toString() + " invoke fails", e);
+                    addFailsQueue(job, type);
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    private void processJob(int hourType) {
+        if (dayJobServiceAdaptors != null) {
+            dayJobServiceAdaptors.forEach((job) -> {
+                processJobByType(job, hourType);
+            });
+        }
+    }
+
+    /**
+     * 添加失败的任务到队列中重新执行
+     *
+     * @param job
+     */
+    private void addFailsQueue(ScheduleJobService job, int type) {
+        logger.warn(" 加入一个失败任务到队列中 : " + job.toString());
+        failQueue.add(new FailsQueueData(job, type));
+    }
+
+
+    @Override
+    public void run() {
+        logger.info(" 异常Job重跑线程启动 ...");
+        while (true) {
+            FailsQueueData queueData = null;
+            try {
+                queueData = failQueue.poll();
+                ScheduleJobService jobService = queueData.getJobService();
+                processJobByType(jobService, queueData.getType());
+            } catch (Throwable e) {
+                int count = queueData.getCount() + 1;
+                if (count > maxCount) {
+                    logger.error("job 重试执行超过最大次数 : " + queueData.getJobService().toString());
+                } else {
+                    logger.warn(" job : " + queueData.getJobService() + " 重试次数 + 1 目前 : " + count);
+                    queueData.setCount(count);
+                    failQueue.add(queueData);
+                }
+            }
+            try {
+                // 防止CPU飙高。
+                Thread.sleep(5);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 异常job的定义
+     */
+    class FailsQueueData {
+        /**
+         * 重试次数
+         */
+        private Integer count = 0;
+        /**
+         * 执行类型 [小时/天] @link ScheduleJobService
+         */
+        private Integer type;
+        /**
+         * 具体执行器
+         */
+        private ScheduleJobService jobService;
+
+        public FailsQueueData(ScheduleJobService jobService, int type) {
+            this.jobService = jobService;
+            this.type = type;
+        }
+
+        public Integer getType() {
+            return type;
+        }
+
+        public void setType(Integer type) {
+            this.type = type;
+        }
+
+        public Integer getCount() {
+            return count;
+        }
+
+        public void setCount(Integer count) {
+            this.count = count;
+        }
+
+        public ScheduleJobService getJobService() {
+            return jobService;
+        }
+
+        public void setJobService(ScheduleJobService jobService) {
+            this.jobService = jobService;
+        }
+    }
+//    @Scheduled(cron = "0/5 * * * * ?")
+//    public void test() {
+//        System.out.println("=======测试成功==========");
+//    }
+}

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageRoute.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import java.util.Date;
 

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageRouteExample.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import java.util.ArrayList;
 import java.util.Date;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrl.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExample.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import java.util.ArrayList;
 import java.util.Date;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExt.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExtExample.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 import java.util.ArrayList;
 import java.util.List;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/BackstageUrlExtWithBLOBs.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 public class BackstageUrlExtWithBLOBs extends BackstageUrlExt {
     private String requestBody;

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/entity/URLModel.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.entity;
+package com.jay.monitor.data.server.models.entity;
 
 /**
  * Url数据模型

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/models/request/route/BackstageRoutePageRequest.java

@@ -1,6 +1,6 @@
-package com.elab.backstage.models.request.route;
+package com.jay.monitor.data.server.models.request.route;
 
-import com.elab.backstage.core.model.response.PageRequestModel;
+import com.jay.monitor.data.core.model.response.PageRequestModel;
 
 import java.util.Date;
 

+ 1 - 1
elab-backstage-service/src/main/java/com/elab/backstage/models/request/route/RouteDataRequest.java

@@ -1,4 +1,4 @@
-package com.elab.backstage.models.request.route;
+package com.jay.monitor.data.server.models.request.route;
 
 /**
  * @describe :路由请求参数

+ 2 - 2
elab-backstage-service/src/main/java/com/elab/backstage/models/response/RouteDataResponse.java

@@ -1,6 +1,6 @@
-package com.elab.backstage.models.response;
+package com.jay.monitor.data.server.models.response;
 
-import com.elab.backstage.models.entity.BackstageRoute;
+import com.jay.monitor.data.server.models.entity.BackstageRoute;
 
 /**
  * @describe :路由数据

+ 0 - 0
jay-monitor-data-service/src/main/java/com/jay/monitor/data/server/process/AbstractUserProcess.java


Some files were not shown because too many files changed in this diff