简单、
- HTTP/1.1 and HTTP/1.0协议
支持 内 置 JSON/Protobuf序列 化 支持 ,JSON序列 化 框 架 使用 Fastjson,依 赖内置 ;
如果使用 protobuf序列 化 ,需要 自 行 添加 protobuf依 赖, protobuf版本 2.x基 于Trie数 据 结构实现的 Http路 由 支持 路 由 path支持 任意 的 java正 则表达式,通 过{pathVariable:regex}这种方式 支持 路 径 变量支持 文 件 上 传- Spring
框 架 支持 ,默 认支持 注解 方式 初 始 化 spring容器 - SpringBoot
集成 集成 swagger restful API文 档生成 工具 - 过滤
器 支持 ,实现类似于spring mvc的 interceptor功 能 支持 全局 异常处理支持 统一响应格式处理
0.0.56
<dependency>
<groupId>io.github.javagossip</groupId>
<artifactId>dorado-core</artifactId>
<version>0.0.56</version>
</dependency>
最 简单的 Dorado rest server
public class Application {
public static void main(String[] args) throws Exception {
// create simple rest server, scanPackages现在可 选,如果不 设置
//系 统默认会自 动找到main主 类所在 的 包 作 为basePackage进行扫描
DoradoServerBuilder.forPort(18888).build().start();
}
}
更 多 定 制 化 参 数 服 务器
public class Application {
public static void main(String[] args) throws Exception {
DoradoServerBuilder.forPort(18888).acceptors(2).ioWorkers(4)
.minWorkers(10).maxWorkers(100)
.backlog(1024)
.maxConnection(500).maxPendingRequest(10000)
.maxIdleTime(120).sendBuffer(256 * 1024)
.recvBuffer(256 * 1024)
.scanPackages("com.rtbstack.demo.controller",
"com.rtbstack.demo.controller1")
.build().start();
}
}
-
spring
框 架 支持 DoradoServerBuilder.forPort(port).springOn()
由 于框架 本身 不 直接 依 赖spring框 架 ,如果启用spring之 后 ,务必自 行 添加 spring框 架 相 关依赖到项目中 ,否 则系统启动会出 现ClassNotFoundException
public class Application {
public static void main(String[] args) throws Exception {
DoradoServerBuilder.forPort(18888).springOn()
.scanPackages("com.rtbstack.demo",
"com.rtbstack.demo.controller1")
.build().start();
}
}
- Rest Controller
@Controller
@Path("/campaign")
public class CampaignController {
@Path("/{id:[0-9]+}")
@GET
public Campaign newCampaign(int id) {
Campaign campaign = new Campaign();
campaign.setId(id);
campaign.setName("test campaign");
return campaign;
}
@Path("/name")
public String campaignName() {
return String.format("hello_campaign", "");
}
@POST
public Campaign save(Campaign campaign) {
System.out.println(campaign);
return campaign;
}
@Path("/{id}")
@DELETE
public void deleteCampaign(int id) {
System.out.println("delete campaign, id: " + id);
}
@GET
@Path("/{id}")
public Campaign getCampaign(int id) {
return Campaign.builder().withId(12)
.withName("网易考 拉 推广计划")
.build();
}
}
- Filter
@FilterPath(include = "/campaign/*")
public class DemoFilter implements Filter {
@Override
public boolean preFilter(HttpRequest request, HttpResponse response) {
System.out.println("execute demo filter");
response.sendError(403, "Forbidden");
return false;
}
}
文 件 上 传支持
支持 文 件 上 传很简单,只 需要 将 controller方法 的 参 数 设置未 MultipartFile或 者 MultipartFile[]即 可 ,单文件 用 MultipartFile,
多 文 件 用 MultipartFile[]
@Path("/file/upload")
@POST
public String uploadFile(MultipartFile[] fs,String name) {
for(MultipartFile f:fs) {
System.out.println(f.getName());
System.out.println(f.getContentType());
System.out.println(f.getSize());
}
return String.format("name: %s, file info: %s", name,f.toString());
}
-
全局 异常处理
dorado支持 用 户通过自定 义的类来进行全局 异常处理,处理异常的 方法 名 必须是 handleException,类上面 增加 ExceptionAdvice注解 @ExceptionAdvice public class TestExceptionAdvice { @ExceptionType(MyException.class) @Status(400) //Status
注解 来 指定 http响应状 态码 public String handleException(MyException ex) { return "cause: " + ex.getClass().getName() + "," + ex.getMessage(); } @ExceptionType(Exception.class) public String handleException(Exception ex) { return "use default exception handler,cause: " + ex.getClass().getName() + "," + ex.getMessage(); } } -
全局 统一响应格式处理
在 实际项目开发中 ,基 于rest的 服 务一般都会定义统一的响应格式,如下面 所 示 格式 :{ "code": 0, "data": data, "msg": "OK" }
为了避免
在 每 个方法的 时候都 要 执行相 同 的 处理操作 ,dorado支持 定 义一个io.github.javagossip.dorado.rest.http.MethodReturnValueHandler来
实现这个功 能 public class TestMethodReturnValueHandler implements MethodReturnValueHandler { @Override public Object handleMethodReturnValue(Object value, MethodDescriptor methodDescriptor) { return TestResp.builder().withCode(0).withMsg("OK").withData(value).build(); } //
自 定 义这个方法 实现,用 来 控 制 哪些返 回 值需要 被 这个类进行 处理 public boolean supportsReturnType(MethodDescriptor returnType) { return true; } } -
More examples
Please visit https://github.com/javagossip/dorado-examples
描述 | |
---|---|
Controller | |
Path | |
FilterPath | 过滤 |
描述 | |
---|---|
Path | 资源访问 |
GET | |
POST | |
PUT | |
DELETE | |
Consume | |
Produce |
描述 | ||
---|---|---|
RequestParam | Query or Form parameter | Primitive type&wrapper class,String |
PathVariable | Uri path variable, example: {var} | Primitive type&wrapper class,String |
HeaderParam | Request header value | Primitive type&wrapper class,String |
CookieParam | Request cookie value | Primitive type&wrapper class,String |
RequestBody | Http request body | String, byte[],InputStream or any serializable type |
- Get Server configuration: http://{ip}:{port}/config
- Get Server status: http://{ip}:{port}/status
- List All services: http://{ip}:{port}/services
-
添加 dorado-spring-boot-starter核心 依 赖<dependency> <groupId>io.github.javagossip</groupId> <artifactId>dorado-spring-boot-starter</artifactId> <version>${dorado.version}</version> </dependency>
-
基 于springboot的 dorado应用@SpringBootApplication @EnableDorado //
用 这个注解 开启dorado server public class SpringBootApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringBootApplication.class, args); } }或 者 直接 使用 DoradoSpringBootApplication来 替 换SpringBootApplication和 EnableDorado,如下:@DoradoSpringBootApplication public class SpringBootApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringBootApplication.class, args); } }
-
Dorado
框 架 的 spring-boot配置 参 数 参 数 名 描述 默 认值dorado.port dorado server监听 端 口 18888 dorado.backlog backlog队列 大小 10000 dorado.acceptors dorado acceptor count cpu 核心 数 *2dorado.io-workers dorado io worker count cpu 核心 数 *2dorado.min-workers 业务线程 池 最小 线程数 100 dorado.max-workers 业务线程 池 最大 线程数 100 dorado.max-connections 服 务器最大 连接数 100000 dorado.max-pending-request 业务线程 池 队列长度10000 dorado.send-buffer send buffer size 256k dorado.recv-buffer recv buffer size 256k dorado.max-idle-time 连接 最大 空 闲时间8h dorado.max-packet-length http请求 包 体 大小 1M
如果对swagger还不
添加 dorado-swagger-ui依 赖
<dependency>
<groupId>io.github.javagossip</groupId>
<artifactId>dorado-swagger-ui</artifactId>
<version>${dorado.version}</version>
</dependency>
- 项目启动类中
使用 EnableSwagger注解 启用swagger
@EnableSwagger
public class Application {
public static void main(String[] args) throws Exception {
// create simple rest server
DoradoServerBuilder.forPort(18888).maxPacketLength(1024*1024*10)
.build().start();
}
}
- 设置Api
文 档全局 信 息
实现io.github.javagossip.dorado.swagger.ext.ApiContextBuilder接 口
@Component //如果是 集成 spring或 springboot环境的 话,直接 增加 component注解 即 可
@Override
// 这里定 制 Api全局 信 息 ,如文档描述 、license,contact等 信 息
public ApiContext buildApiContext() {
Info info = new Info()
.contact(new Contact().email("javagossip@gmail.com").name("weiping wang")
.url("http://github.com/javagossip/dorado"))
.license(new License().name("apache v2.0").url("http://www.apache.org"))
.termsOfService("http://swagger.io/terms/").description("Dorado服 务框架 api接 口 文 档")
.title("dorado demo api接 口 文 档").version("1.0.0");
//构造api访问授权的 apiKey
ApiKey apiKey = ApiKey.builder().withName("Authorization").withIn("header").build();
ApiContext apiContext = ApiContext.builder().withApiKey(apiKey)
.withInfo(info).build();
return apiContext;
}
io.github.javagossip.dorado.demo.ApiContextBuilderImpl
在 controller实现里 面 增加 swagger相 关的注解 即 可 自 动生成 在 线的api doc
@Controller
@Path("/campaign")
@Api(tags = { "营销活 动管理 " })
public class CampaignController {
@Autowired
private CampaignService campaignService;
@Path("/{id:[0-9]+}")
@GET
@ApiOperation("新建 campaign")
public Campaign newCampaign(@PathVariable("id") int id) {
Campaign campaign = new Campaign();
campaign.setId(id);
campaign.setName("test campaign");
return campaign;
}
}
-
spring-boot环境,
可 以直接 引入dorado-swagger-spring-boot-starter依 赖来进一 步 简化swagger的 使用 <dependency> <groupId>io.github.javagossip</groupId> <artifactId>dorado-swagger-spring-boot-starter</artifactId> <version>${dorado.version}</version> </dependency>
然 后 在 application.properties配置 文 件 中 增加 如下配置 即 可 :dorado.swagger.title=Zhuque's dashboard api dorado.swagger.description=${dorado.swagger.title} dorado.swagger.license=Apache License dorado.swagger.licenseUrl=http://www.apache.org/licenses/LICENSE-2.0 dorado.swagger.contact.name=weiping wang dorado.swagger.contact.email=javagossip@gmail.com dorado.swagger.contact.url=https://github.com/javagossip //API
全局 认证配置 dorado.swagger.apiKey.name=Authorization dorado.swagger.apiKey.in=header or query
- 浏览
器 访问如下地 址 即 可
http://{host}:{port}/swagger-ui.html