摘要:在工作中用做了幾個(gè)服務(wù),感覺(jué)做出來(lái)的程序性能好,資源占用少,但是實(shí)現(xiàn)服務(wù)比較麻煩,于是就參考的注解基于實(shí)現(xiàn)了一個(gè)輕量級(jí)的框架。該框架提供了控制器注解全局異??刂破鲾r截器等功能。跨域攔截器不用攔截的測(cè)試服務(wù)源碼與實(shí)例程序典型應(yīng)用
在工作中用Netty做了幾個(gè)服務(wù),感覺(jué)Netty做出來(lái)的程序性能好,資源占用少,但是實(shí)現(xiàn)Http服務(wù)比較麻煩,于是就參考Spring MVC的注解基于Netty實(shí)現(xiàn)了一個(gè)輕量級(jí)的RESTful框架。
該框架提供了控制器注解、全局異??刂破鳌r截器等功能。
注解名稱(chēng)參考了Spring MVC,編譯理解和記憶,主要包括如下注解:@RestController
@RequestMapping
@GetMapping
@PostMapping
@DeleteMapping
@PutMapping
@PatchMapping
@JsonResponse
@RequestParam
@PathVariable
@RequestBody
@UploadFile
@UrlEncodedForm
@RequestHeader
Controller示例://默認(rèn)為單例,singleton = false表示啟用多例。 //@RestController(singleton = false) @RestController @RequestMapping("/users") public class UserController { @GetMapping("") @JsonResponse public ResponseEntity攔截器示例:listUser() { // 查詢(xún)用戶(hù) 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) { // 更新用戶(hù) return ResponseEntity.status(HttpStatus.CREATED).build(); } @DeleteMapping("/{id}") public ResponseEntity> deleteMethod(@PathVariable int id) { // 刪除用戶(hù) return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @PostMapping("") public ResponseEntity> postMethod(@RequestBody String body) { // 添加用戶(hù) 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發(fā)送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) { } }啟動(dòng)服務(wù):
@Test public void test() { // 忽略指定url WebServer.getIgnoreUrls().add("/favicon.ico"); // 全局異常處理 WebServer.setExceptionHandler(new ExceptionController()); // 設(shè)置監(jiān)聽(tīng)端口號(hào) WebServer server = new WebServer(2006); // 設(shè)置Http最大內(nèi)容長(zhǎng)度(默認(rèn) 為10M) server.setMaxContentLength(1024 * 1024 * 50); // 設(shè)置Controller所在包 server.setControllerBasePackage("org.leo.web.controller"); // 添加攔截器,按照添加的順序執(zhí)行。 // 跨域攔截器 server.addInterceptor(new CorsInterceptor(), "/不用攔截的url"); try { server.start(); } catch (InterruptedException e) { e.printStackTrace(); } }測(cè)試服務(wù)
http://localhost:2006/users
源碼與實(shí)例程序
典型應(yīng)用
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71256.html
摘要:服務(wù)和服務(wù)之間的解耦和通訊可使用內(nèi)置的隊(duì)列或發(fā)布訂閱實(shí)現(xiàn),消息處理器接收到任務(wù)后,會(huì)將該任務(wù)交由線程池處理,處理后通過(guò)發(fā)送廣播或發(fā)給指定的。前端基于開(kāi)發(fā),建議使用瀏覽器體驗(yàn)。在線體驗(yàn)測(cè)試用戶(hù),口令均為源碼地址服務(wù)端端 之前工作接觸了幾個(gè)開(kāi)源的IM產(chǎn)品,再加上曾經(jīng)用Netty實(shí)現(xiàn)過(guò)幾個(gè)服務(wù),于是就有了用Netty實(shí)現(xiàn)一個(gè)IM的想法,于是用業(yè)余時(shí)間寫(xiě)了一個(gè)IM,和喜歡Netty的程序員們分...
摘要:以實(shí)現(xiàn)自己熟悉的東西為導(dǎo)向比如我們做后端開(kāi)發(fā),首先是常用的循環(huán)迭代條件判斷增刪改成。它是由實(shí)現(xiàn)的,不保證元素的順序,也就是說(shuō)所說(shuō)元素插入的順序與輸出的順序不一致。 下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...代碼:https://github.com/zhoumengka...整個(gè)項(xiàng)目我們我又細(xì)分了6個(gè)版本來(lái)演進(jìn),希望更加便于大家對(duì)比...
摘要:以實(shí)現(xiàn)自己熟悉的東西為導(dǎo)向比如我們做后端開(kāi)發(fā),首先是常用的循環(huán)迭代條件判斷增刪改成。它是由實(shí)現(xiàn)的,不保證元素的順序,也就是說(shuō)所說(shuō)元素插入的順序與輸出的順序不一致。 下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...代碼:https://github.com/zhoumengka...整個(gè)項(xiàng)目我們我又細(xì)分了6個(gè)版本來(lái)演進(jìn),希望更加便于大家對(duì)比...
摘要:本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話(huà),筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)行詳細(xì)的剖析與解答。敬請(qǐng)關(guān)注服務(wù)端思維微信公眾號(hào),獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結(jié)合自己過(guò)往的面試經(jīng)驗(yàn),整理了一些核心的知識(shí)清單,幫助讀者更好地回顧與復(fù)習(xí) Java 服務(wù)端核心技術(shù)。本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話(huà),筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)...
摘要:在結(jié)構(gòu)上引入了頭結(jié)點(diǎn)和尾節(jié)點(diǎn),他們分別指向隊(duì)列的頭和尾,嘗試獲取鎖入隊(duì)服務(wù)教程在它提出十多年后的今天,已經(jīng)成為最重要的應(yīng)用技術(shù)之一。隨著編程經(jīng)驗(yàn)的日積月累,越來(lái)越感覺(jué)到了解虛擬機(jī)相關(guān)要領(lǐng)的重要性。 JVM 源碼分析之 Jstat 工具原理完全解讀 http://click.aliyun.com/m/8315/ JVM 源碼分析之 Jstat 工具原理完全解讀 http:...
閱讀 2252·2021-11-24 09:38
閱讀 3334·2021-11-08 13:27
閱讀 3153·2021-09-10 10:51
閱讀 3276·2019-08-29 12:20
閱讀 729·2019-08-28 18:28
閱讀 3518·2019-08-26 11:53
閱讀 2777·2019-08-26 11:46
閱讀 1588·2019-08-26 10:56