Java+Netty实现的RESTful框架--netty-rest-server
在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架。
该框架提供了控制器注解、全局异常控制器、拦截器等功能。
注解名称参考了Spring MVC,编译理解和记忆,主要包括如下注解:
@RestController
@RequestMapping
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping
@PatchMapping
@JsonResponse
@RequestParam
@PathVariable
@RequestBody
@UploadFile
@UrlEncodedForm
@RequestHeader
Controller示例:
//默认为单例,singleton = false表示启用多例。
//@RestController(singleton = false)
@RestController
@RequestMapping("/users")
public class UserController { @GetMapping("")
@JsonResponse
public ResponseEntity<User> listUser() {
// 查询用户
User user = new User();
user.setId(1);
user.setName("Leo");
user.setAge((short)18);
return ResponseEntity.ok().build(user);
} @PutMapping("/{id}")
public ResponseEntity<?> putMethod(@PathVariable("id") int id, @RequestBody String body) {
// 更新用户
return ResponseEntity.status(HttpStatus.CREATED).build();
} @DeleteMapping("/{id}")
public ResponseEntity<?> deleteMethod(@PathVariable int id) {
// 删除用户
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} @PostMapping("")
public ResponseEntity<?> postMethod(@RequestBody String body) {
// 添加用户
JSONObject json = JSONObject.parseObject(body);
User user = new User();
user.setId(json.getIntValue("id"));
user.setName(json.getString("name"));
user.setAge(json.getShortValue("age"));
return ResponseEntity.status(HttpStatus.CREATED).build(user);
} }
拦截器示例:
public final class CorsInterceptor implements Interceptor { @Override
public boolean preHandle(FullHttpRequest request, HttpResponse response) throws Exception {
// 使用axios发送cookie,这里不能用*,需要使用Web前端地址,如:http://localhost:8080
// response.getHeaders().put("Access-Control-Allow-Origin", "*");
response.getHeaders().put("Access-Control-Allow-Origin", System.getProperty("http.origin"));
response.getHeaders().put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");
response.getHeaders().put("Access-Control-Max-Age", "3600");
response.getHeaders().put("Access-Control-Allow-Headers", "Content-Type,X-Token");
response.getHeaders().put("Access-Control-Allow-Credentials", "true");
return true;
} @Override
public void postHandle(FullHttpRequest request, HttpResponse response) throws Exception {
} @Override
public void afterCompletion(FullHttpRequest request, HttpResponse response) {
} }
启动服务
@Test
public void test() {
// 忽略指定url
WebServer.getIgnoreUrls().add("/favicon.ico"); // 全局异常处理
WebServer.setExceptionHandler(new ExceptionController()); // 设置监听端口号
WebServer server = new WebServer(2006); // 设置Http最大内容长度(默认 为10M)
server.setMaxContentLength(1024 * 1024 * 50); // 设置Controller所在包
server.setControllerBasePackage("org.leo.web.controller"); // 添加拦截器,按照添加的顺序执行。
// 跨域拦截器
server.addInterceptor(new CorsInterceptor(), "/不用拦截的url"); try {
server.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
测试服务
http://localhost:2006/users
Java+Netty实现的RESTful框架--netty-rest-server的更多相关文章
- JAVA NIO 类库的异步通信框架netty和mina
Netty 和 Mina 我究竟该选择哪个? 根据我的经验,无论选择哪个,都是个正确的选择.两者各有千秋,Netty 在内存管理方面更胜一筹,综合性能也更优.但是,API 变更的管理和兼容性做的不是太 ...
- Java NIO框架Netty课程(一) – Hello Netty
首先啰嗦2,假如你不知道Netty怎么办怎么办.它可以是一个简单的搜索,找出.我只能说Netty是NIO该框架,它可用于开发分布式Java计划.详细情况可以做,我们可以尝试用你的想象力. 技术,它是服 ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java RESTful 框架的性能比较
来源:鸟窝, colobu.com/2015/11/17/Jax-RS-Performance-Comparison/ 如有好文章投稿,请点击 → 这里了解详情 在微服务流行的今天,我们会从纵向和横向 ...
- 最好的8个 Java RESTful 框架
原文出处: colobu 过去的每一年,涌现出越来越多的Java框架.就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的.连我的老祖母现在也使用 一个我从来没有听说过而且可 ...
- 如何在Java生态圈选择一个轻量级的RESTful框架?
在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元.微服务 ...
- 为什么选择Netty作为基础通信框架?
在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题 ...
- 分布式服务框架介绍:最成熟的开源NIO框架Netty
尽管JDK提供了丰富的NIO类库,网上也有很多NIO学习例程,但是直接使用Java NIO类库想要开发出稳定可靠的通信框架却并非易事,原因如下: 1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握 ...
- 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析
1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件 ...
随机推荐
- 【错误记录】记录蛋疼的 mysql 错误
-- 应用信息表 DROP TABLE IF EXISTS `table_name`; CREATE TABLE `ks_apps_info` ( `id` ) NOT NULL COMMENT 'i ...
- 判断是否是微信浏览器JavaScript代码
function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase(); if(ua.match(/MicroMe ...
- golang第三方库goconfig的使用
参考地址:http://studygolang.com/articles/818 详细的解析可以看上面链接,这里只做一点简单介绍 先安装好包,然后导入 import ( "githu ...
- 【转】Android业务组件化之URL Scheme使用
前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...
- oracle 事务 数据伪列
在用户进行数据更新操作(DML)事务一定会起作用. 事务的出现会保证数据的完整性.一致性.在整个事务的处理过程之中主要使用两个操作命令: · 事务的提交(COMMIT):是真正的向数据库之中发出更新指 ...
- mysql5.7.22 下载过程
进入官网www.mysql.com ,选择downloads: 选择 Community 再选择MySQL community server 选择5.7的版本,这个看自己选择,有问题看标题 选择5.7 ...
- 基于Babylon.js编写简单的骨骼动画生成器
使用骨骼动画技术可以将网格的顶点分配给若干骨头,通过给骨头设定关键帧和父子关系,可以赋予网格高度动态并具有传递性的变形 效果.这里结合之前的相关研究在网页端使用JavaScript实现了一个简单的骨骼 ...
- 数据库之redis
启动redis服务器:sudo redis-server /etc/redis/redis.conf 通过客户端进入,执行命令:redis-cli 测试服务是否可用:ping 查看redis当前状态: ...
- 基于BM3803处理器平台的PCI软硬件调试问题汇总(持续更新中)
一:相关基本配置: FPGA: XILINX XC5VFX130T-1FFG1738 PCI接口部分使用XILINX提供的pci32_v4_8硬核:PCI控制器由FPGA逻辑实现,主要完成PCI设备 ...
- 由Handle转换为控件
Control c = Control.FromHandle(this.textBox1.Handle); TextBox f = c as TextBox;