在工作中用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的更多相关文章

  1. JAVA NIO 类库的异步通信框架netty和mina

    Netty 和 Mina 我究竟该选择哪个? 根据我的经验,无论选择哪个,都是个正确的选择.两者各有千秋,Netty 在内存管理方面更胜一筹,综合性能也更优.但是,API 变更的管理和兼容性做的不是太 ...

  2. Java NIO框架Netty课程(一) – Hello Netty

    首先啰嗦2,假如你不知道Netty怎么办怎么办.它可以是一个简单的搜索,找出.我只能说Netty是NIO该框架,它可用于开发分布式Java计划.详细情况可以做,我们可以尝试用你的想象力. 技术,它是服 ...

  3. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  4. Java RESTful 框架的性能比较

    来源:鸟窝, colobu.com/2015/11/17/Jax-RS-Performance-Comparison/ 如有好文章投稿,请点击 → 这里了解详情 在微服务流行的今天,我们会从纵向和横向 ...

  5. 最好的8个 Java RESTful 框架

    原文出处: colobu 过去的每一年,涌现出越来越多的Java框架.就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的.连我的老祖母现在也使用 一个我从来没有听说过而且可 ...

  6. 如何在Java生态圈选择一个轻量级的RESTful框架?

    在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元.微服务 ...

  7. 为什么选择Netty作为基础通信框架?

    在开始之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果两个多月过去了,他们的NIO服务端始终无法稳定,问题 ...

  8. 分布式服务框架介绍:最成熟的开源NIO框架Netty

    尽管JDK提供了丰富的NIO类库,网上也有很多NIO学习例程,但是直接使用Java NIO类库想要开发出稳定可靠的通信框架却并非易事,原因如下: 1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握 ...

  9. 新手入门:目前为止最透彻的的Netty高性能原理和框架架构解析

    1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. 本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件 ...

随机推荐

  1. 一、Linux概述 二、Linux的安装 三、Linux的常用命令(重点)

    一.Linux概述###<1>操作系统 OS,管理和控制 计算机的 硬件和软件资源的 计算机程序. 最基本的系统软件. 是用户和计算机交互的桥梁,是硬件和软件交互的桥梁. 操作系统:she ...

  2. October 1st 2017 Week 40th Sunday

    It's only after we've lost everything that we're free to do anything. 只有我们失去了所有之后我们才能随心而为. After los ...

  3. 占位符 %s

    a = input("Name:")b = input("Age:")c = input("Job:")d = input("ho ...

  4. Ubuntu 14.04安装QQ2012

    GTkqq ,pidginQQ........等多多少少都存在一定的缺陷和问题. linuxQQ 有各种版本,这里介绍两种:linuxQQ(基本已不支持) 和 wineQQ (推荐使用) 1 ---- ...

  5. jquery根据字符切割字符串

    var str=new String(); var arr=new Array(); str="ddd,dsd,3,dd,g,k"; //可以用字符或字符串分割 arr=str.s ...

  6. 2754. [SCOI2012]喵星球上的点名【后缀数组】

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  7. P1710 地铁涨价

    题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...

  8. Python学习之路 (三)爬虫(二)

    通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...

  9. Java基础加强之集合

    集合整体框架图 各集合框架的概述 1. Collection(常用List和Set,不常用Queue和Vector),单元素集合. 2. Map(常用HashMap和TreeMap,不常用HashTa ...

  10. DB2创建表、操作表等常用命令

    转载:http://hi.baidu.com/ufobject/item/7fd03aeebf7be1266dabb881 一.创建库表 1.创建库 1).创建数据语句 CREATE DATABASE ...