# StartX
**Repository Path**: gary/StartX
## Basic Information
- **Project Name**: StartX
- **Description**: 基于Netty和Spring开发的服务端容器,支持Socket,WebSocket(SSL),HTTP(S)。支持对各种通讯协议进行定制,可以用于开发游戏后端,推送服务,即时通讯等。即将项目重构,以备申请码云GVP,有感兴趣想参与的朋友可以Q群联系:781722679
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 53
- **Created**: 2018-07-11
- **Last Updated**: 2020-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# StartX (已更新至v1.3.1)
### 版本更新
- v1.0.0 支持http(s)
- v1.1.0 支持ws(s)
- v1.1.1 支持http(s)+ws(s)
- v1.2.1 支持文本socket
- v1.3.1 支持Maven打包部署
### 项目简介
基于Netty和Spring开发的服务端MVC容器,支持Socket,WebSocket(SSL),HTTP(S),提供集成环境,能很快速的进入业务开发,对业务开发者透明,支持对各种通讯协议进行定制
### 后期计划
- 针对V1.3.1的Bug修复(主要工作)
- 开发规范定义,代码优化重构
- 新版本2.x开发(包含微服务模块)
- 基于StartX的推送服务
- 基于StartX的即时通讯
欢迎有兴趣的小伙伴跟我联系,一起完成后期设计和开发工作,也欢迎通过Q群联系作者,Q群:781722679
### 源码结构
```
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─startx
│ │ │ └─core
│ │ │ ├─config #系统配置
│ │ │ │ ├─holder
│ │ │ │ └─reader
│ │ │ │ └─impl
│ │ │ ├─netty #网络通讯
│ │ │ │ ├─handler
│ │ │ │ ├─output
│ │ │ │ │ ├─http
│ │ │ │ │ ├─socket
│ │ │ │ │ └─wss
│ │ │ │ ├─pipeline
│ │ │ │ └─server
│ │ │ │ └─impl
│ │ │ ├─point #MVC框架
│ │ │ │ ├─anotation
│ │ │ │ └─factory
│ │ │ ├─system #系统变量
│ │ │ │ ├─constants
│ │ │ │ ├─model
│ │ │ │ └─param
│ │ │ └─tools #系统工具
│ │ ├─resources #资源文件
│ │ └─test #测试代码
│ │ └─com
│ │ └─startx
│ │ ├─action
│ │ └─test
```
### 启动方式
- 导入maven项目
- 打开Bootrap类
- 新建一个测试类
- 创建main函数
- 调用Bootstrap.start()
### 修改配置(config.properties)
```
#项目启动端口
port=8081
#spring配置路径
springPath=classpath*:application.xml
#项目访问前缀(已实现)
endPoint=/j4
#是否开启ssl
isSSL=false
#若开启ssl,需要配置如下两个参数
jksPwd=your.pwd
jksPath=/your.jks
#配置使用websocketServer,同时支持ws(s)和http(s)
serverClass=com.startx.core.netty.server.impl.WebSocketServer
```
### 更多配置
```
/**
* 监听端口
*/
private int port = 8080;
/**
* boss线程数
*/
private int boss = 2;
/**
* workder线程数
*/
private int worker = 4;
/**
* spring配置路径
*/
private String springPath = "classpath*:application.xml";
/**
* 项目访问前缀
*/
private String endPoint = "/";
/**
* 是否为ssl
*/
private boolean isSSL = false;
/**
* 静态资源目录
*/
private String resource = "/resource";
/**
* endpoint扫描路径
*/
private String packages = "com.startx";
/**
* 设置NettyServer启动类
*/
private String serverClass = "com.startx.core.netty.server.impl.HttpServer";
// 以下配置在ssl连接时使用
/**
* jsk密码
*/
private String jksPwd;
/**
* jsk路径
*/
private String jksPath;
```
### 代码测试
打开演示代码J4.java,右键即可运行
```
package com.startx.test;
import com.startx.core.Bootstrap;
public class J4 {
public static void main(String[] args) throws Exception {
Bootstrap.start();
}
}
```
### 日志打印
```
2018-05-09 13:06:05 INFO com.startx.core.netty.server.impl.HttpServer - StartxConfig [port=8081, boss=2, worker=4, springPath=classpath*:application.xml, endPoint=/, isSSL=false, resource=/resource, jksPwd=your.pwd, jksPath=/your.jks, packages=com.startx, serverClass=com.startx.core.netty.server.impl.HttpServer]
2018-05-09 13:06:05 INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4bec1f0c: startup date [Wed May 09 13:06:05 CST 2018]; root of context hierarchy
2018-05-09 13:06:05 INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:/E:/zhangminghu/startx/target/classes/application.xml]
2018-05-09 13:06:05 INFO com.startx.core.accesspoint.factory.AccessPointFactory - GET_/abc/def2_JSON
2018-05-09 13:06:05 INFO com.startx.core.accesspoint.factory.AccessPointFactory - GET_/abc/def3_JSON
2018-05-09 13:06:05 INFO com.startx.core.accesspoint.factory.AccessPointFactory - GET_/abc/def4_JSON
2018-05-09 13:06:05 INFO com.startx.core.accesspoint.factory.AccessPointFactory - GET_/abc/def1_JSON
2018-05-09 13:06:06 INFO com.startx.core.netty.server.impl.HttpServer -
************************** ********* ****** ********************************
************************** *********** ****** ********************************
************************** ********* **************************************************************
************************** *** **************************************** *************************
************************** *** ******** ********* *** *************************
************************** *** **** *************************
************************** *** *** *************************
************************** *** *** *************************
************************** *** *** *************************
************************** **** *** *************************
************************** *** *** *************************
************************** *** ***** **** *** *************************
************************** *** ******** ********* ****************************
***************************** ******* ***** ***** ********* ****************************
***************************** **** *********************** ****************************
***************************** ******************* ****************************
**************************** ******************* ***************************
**************************** ******************* ***************************
**************************** ******************* ***************************
**************************** ***************** ***************************
**************************** ************ ***************************
************************** *** *** *************************
************************** *** V1.3.1 *** *************************
************************** **** ** *************************
**************************** *** ****************************** *** *************************
********************************** ************************************ *************************
************************************** ******************************* *************************
******************************* ****** ******* *************************
2018-05-09 13:06:06 INFO com.startx.core.netty.server.impl.HttpServer - 服务已启动,端口号: 8081.
```
### 业务代码
```
package com.startx.action;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import com.startx.core.accesspoint.anotation.AccessPoint;
import com.startx.core.accesspoint.anotation.RequestMethod;
import com.startx.core.accesspoint.anotation.RequestPoint;
import com.startx.core.accesspoint.anotation.ResponseType;
import com.startx.core.netty.output.http.JsonOutput;
import com.startx.core.system.Colorfulogo;
import com.startx.core.system.param.HttpArgs;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.HttpResponseStatus;
@Controller
@AccessPoint("/login")
public class LoginAction {
@RequestPoint(value={"/empty/param"},method=RequestMethod.GET,type=ResponseType.JSON)
public void emptyParam() {
System.out.println("login...");
}
@RequestPoint(value={"/body/ctx/args"},method=RequestMethod.GET,type=ResponseType.JSON)
public void test02(byte[] body,ChannelHandlerContext ctx,HttpArgs args) throws UnsupportedEncodingException {
Map response = new HashMap<>();
response.put("colorfulogo", Colorfulogo.get());
JsonOutput.object(ctx, HttpResponseStatus.OK,response);
}
@RequestPoint(value={"/args/body"},method=RequestMethod.GET,type=ResponseType.JSON)
public void test03(HttpArgs args,byte[] body) {
System.out.println("login...");
}
@RequestPoint(value={"/args"},method=RequestMethod.GET,type=ResponseType.JSON)
public Map test04(HttpArgs args) {
System.out.println("login... ");
Map response = new HashMap<>();
response.put("colorfulogo", Colorfulogo.get());
return response;
}
}
```
### 打包部署
#### 打包方法
- 下载V1.3.1源代码
- 导入Maven项目
- 执行maven打包命令(clean install)
#### 打包配置
- pom.xml 配置assembly打包插件以及项目打jar包需要排除的配置文件
- assembly.xml 配置assembly打包脚本,这里主要关注需要打包到jar之外的配置文件得include
#### 关键代码
- pom.xml
```
org.apache.maven.plugins
maven-jar-plugin
2.4
**/logs/
**/*.xml
**/*.properties
**/*.sh
config
org.apache.maven.plugins
maven-assembly-plugin
2.4
src/main/assembly/assembly.xml
make-assembly
package
single
```
- assembly.xml
```
release
tar.gz
true
lib
logs
logs
target/classes
conf
*.xml
*.properties
*.jks
config/*
src/main/scripts
bin
0733
*.sh
libs
lib
*.jar
```
#### 启动脚本
脚本文件startup.sh,实现了start,stop等命令,执行方式为:bin/startup.sh start|stop,这里关注两个配置项:
- 启动类(启动之后的进程名,也就是启动示例的J4,可以自己配置)
- JVM 参数,根据自己的服务器配置或优化经验进行调整
具体脚本请参见startup.sh
```
_ServerClass=com.startx.test.J4
JAVA_OPTS=" -server -Xms5120m -Xmx5120m -Xmn4096m -XX:MetaspaceSize=128M -verbose:gc -Xloggc:logs/gc.log -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:MaxTenuringThreshold=10 -XX:SurvivorRatio=8 -XX:PermSize=128m -XX:MaxPermSize=128m
-XX:+UseParNewGC -Xss1024k"
```
#### 执行编译
mvn clean install,得到xxx.tar.gz压缩包
解压之后结构如下:
```
├─bin #启动脚本
├─conf #项目配置文件
│ └─config #项目子配置文件
└─lib #项目依赖包
```
#### 部署服务
- 上传代码到安装有jdk环境的Linux服务器
- 执行代码转换脚本为unix格式: dos2unix bin/startup.sh
- 启动程序或停止程序:bin/startup.sh start|stop
- 会自动生成logs文件夹,日志内容为控制台输出日志
- 当前自动生成的pid文件请勿删除,以防重复启动
- 使用jps查看进程,能看到J4进程正在运行
#### 注意事项
请修改为当前合适的配置,代码已移除具体配置,例如Mysql地址。本框架不适用于页面网站开发,框架定位于API服务,游戏后端服务,数据统计服务等场景