# 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服务,游戏后端服务,数据统计服务等场景