{"id":15154133,"url":"https://github.com/javagossip/dorado","last_synced_at":"2025-05-02T07:31:39.609Z","repository":{"id":57714855,"uuid":"141869327","full_name":"javagossip/dorado","owner":"javagossip","description":"基于Netty4开发的简单、轻量级、高性能的的Http restful api server","archived":false,"fork":false,"pushed_at":"2024-06-06T09:59:55.000Z","size":1662,"stargazers_count":75,"open_issues_count":2,"forks_count":24,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-10-29T22:56:39.406Z","etag":null,"topics":["dorado","http","httpserver","netty","netty4","rest","rest-api","restful","router","spring-boot","springboot","trie","trie-tree"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javagossip.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-22T05:45:18.000Z","updated_at":"2024-10-18T08:13:39.000Z","dependencies_parsed_at":"2024-05-08T06:29:00.047Z","dependency_job_id":"800015f2-a93a-48c2-abf1-061acd6c6eb6","html_url":"https://github.com/javagossip/dorado","commit_stats":null,"previous_names":[],"tags_count":55,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javagossip%2Fdorado","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javagossip%2Fdorado/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javagossip%2Fdorado/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javagossip%2Fdorado/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javagossip","download_url":"https://codeload.github.com/javagossip/dorado/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224305839,"owners_count":17289446,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dorado","http","httpserver","netty","netty4","rest","rest-api","restful","router","spring-boot","springboot","trie","trie-tree"],"created_at":"2024-09-26T17:03:02.714Z","updated_at":"2025-05-02T07:31:39.603Z","avatar_url":"https://github.com/javagossip.png","language":"Java","funding_links":[],"categories":["网络编程"],"sub_categories":["Spring Cloud框架"],"readme":"-   [Dorado](#dorado)\n    -   [Features](#features)\n    -   [Maven](#maven)\n    -   [Quick start](#quick-start)\n    -   [注解说明](#注解说明)\n        -   [类注解](#类注解)\n        -   [方法注解](#方法注解)\n        -   [方法参数注解](#方法参数注解)\n    -   [内置服务](#内置服务)\n    -   [SpringBoot集成](#springboot集成)\n    -   [swagger集成](#swagger集成)\n    -   [性能测试](#性能测试)\n\nDorado\n======\n\n简单、快速、轻量级的http restful server实现，基于Netty4和JDK1.8+\n\nFeatures\n--------\n\n-   HTTP/1.1 and HTTP/1.0协议支持\n-   内置JSON/Protobuf序列化支持，JSON序列化框架使用Fastjson, 依赖内置；\\\n    如果使用protobuf序列化，需要自行添加protobuf依赖, protobuf版本2.x\n-   基于Trie数据结构实现的Http路由支持\n    路由path支持任意的java正则表达式，通过{pathVariable:regex}这种方式支持路径变量\n-   支持文件上传\n-   Spring框架支持，默认支持注解方式初始化spring容器\n-   SpringBoot集成\n-   集成swagger restful API文档生成工具，支持swagger-ui\n-   支持全局异常处理\n-   支持统一响应格式处理\n\n## Latest version\n\n**0.0.61**\n\nMaven\n-----\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.javagossip\u003c/groupId\u003e\n    \u003cartifactId\u003edorado-core\u003c/artifactId\u003e\n    \u003cversion\u003eLATEST_VERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nQuick start\n-----------\n\n-   最简单的Dorado rest server\n\n```java\npublic class Application {\n\n    public static void main(String[] args) throws Exception {\n        // create simple rest server, scanPackages现在可选，如果不设置\n        //系统默认会自动找到main主类所在的包作为basePackage进行扫描\n        DoradoServerBuilder.forPort(18888).build().start();\n    }\n}\n```\n\n-   更多定制化参数服务器\n\n```java\n\npublic class Application {\n\n    public static void main(String[] args) throws Exception {\n        DoradoServerBuilder.forPort(18888).acceptors(2).ioWorkers(4)\n                .minWorkers(10).maxWorkers(100)\n                .backlog(1024)\n                .maxConnection(500).maxPendingRequest(10000)\n                .maxIdleTime(120).sendBuffer(256 * 1024)\n                .recvBuffer(256 * 1024)\n                .scanPackages(\"com.rtbstack.demo.controller\",\n                        \"com.rtbstack.demo.controller1\")\n               .build().start();\n    }\n}\n```\n\n-   spring框架支持\n\n    DoradoServerBuilder.forPort(port).\u003cfont color=red\u003e**springOn()**\u003c/font\u003e\n\n    由于框架本身不直接依赖spring框架，如果启用spring之后，务必自行添加spring框架相关依赖到项目中，否则系统启动会出现ClassNotFoundException\n\n```java\n\npublic class Application {\n\n    public static void main(String[] args) throws Exception {\n        DoradoServerBuilder.forPort(18888).springOn()\n                .scanPackages(\"com.rtbstack.demo\",\n                        \"com.rtbstack.demo.controller1\")\n               .build().start();\n    }\n}\n```\n\n-   Rest Controller\n\n```java\n@Controller\n@Path(\"/campaign\")\npublic class CampaignController {\n\n    @Path(\"/{id:[0-9]+}\")\n    @GET\n    public Campaign newCampaign(int id) {\n        Campaign campaign = new Campaign();\n        campaign.setId(id);\n        campaign.setName(\"test campaign\");\n\n        return campaign;\n    }\n\n    @Path(\"/name\")\n    public String campaignName() {\n        return String.format(\"hello_campaign\", \"\");\n    }\n\n    @POST\n    public Campaign save(Campaign campaign) {\n        System.out.println(campaign);\n        return campaign;\n    }\n\n    @Path(\"/{id}\")\n    @DELETE\n    public void deleteCampaign(int id) {\n        System.out.println(\"delete campaign, id: \" + id);\n    }\n\n    @GET\n    @Path(\"/{id}\")\n    public Campaign getCampaign(int id) {\n        return Campaign.builder().withId(12)\n                .withName(\"网易考拉推广计划\")\n                .build();\n    }\n}\n```\n\n-   Filter\n\n```java\n@FilterPath(include = \"/campaign/*\")\npublic class DemoFilter implements Filter {\n\n    @Override\n    public boolean preFilter(HttpRequest request, HttpResponse response) {\n        System.out.println(\"execute demo filter\");\n        response.sendError(403, \"Forbidden\");\n        return false;\n    }\n}\n```\n\n-   文件上传支持  \n    支持文件上传很简单，只需要将controller方法的参数设置未MultipartFile或者MultipartFile[]即可，单文件用MultipartFile,  \n    多文件用MultipartFile[]\n\n```java\n@Path(\"/file/upload\")\n@POST\npublic String uploadFile(MultipartFile[] fs,String name) {\n    for(MultipartFile f:fs) {\n        System.out.println(f.getName());\n        System.out.println(f.getContentType());\n        System.out.println(f.getSize());\n    }\n    return String.format(\"name: %s, file info: %s\", name,f.toString());\n}\n```\n\n-   全局异常处理  \n\tdorado支持用户通过自定义的类来进行全局异常处理，处理异常的方法名必须是handleException，类上面增加ExceptionAdvice注解  \n\t\n\t```java\n\t@ExceptionAdvice\n\tpublic class TestExceptionAdvice {\n\n\t\t@ExceptionType(MyException.class)\n\t\t@Status(400) //Status注解来指定http响应状态码\n\t\tpublic String handleException(MyException ex) {\n\t\t\treturn \"cause: \" + ex.getClass().getName() + \",\" + ex.getMessage();\n\t\t}\n\t\n\t\t@ExceptionType(Exception.class)\n\t\tpublic String handleException(Exception ex) {\n\t\t\treturn \"use default exception handler,cause: \" + ex.getClass().getName() + \",\" + ex.getMessage();\n\t\t}\n\t}\n\n\t```\n\t\n-\t全局统一响应格式处理  \n\t在实际项目开发中，基于rest的服务一般都会定义统一的响应格式，如下面所示格式：  \n\t\n\t```json\n\t{\n\t\t\"code\": 0,\n\t\t\"data\": data,\n\t\t\"msg\": \"OK\"\n\t}\n\t```\n\t\n\t为了避免在每个方法的时候都要执行相同的处理操作，dorado支持定义一个io.github.javagossip.dorado.rest.http.MethodReturnValueHandler来  \n\t实现这个功能\n\t\n\t```java\n\tpublic class TestMethodReturnValueHandler implements MethodReturnValueHandler {\n\n\t\t@Override\n\t\tpublic Object handleMethodReturnValue(Object value, MethodDescriptor methodDescriptor) {\n\t\t\treturn TestResp.builder().withCode(0).withMsg(\"OK\").withData(value).build();\n\t\t}\n\t\t\n\t\t//自定义这个方法实现，用来控制哪些返回值需要被这个类进行处理\n\t\tpublic boolean supportsReturnType(MethodDescriptor returnType) {\n\t\t    return true;\n\t\t}\n\t}\n\t```\n\t\n-   More examples\n\nPlease visit https://github.com/javagossip/dorado-examples\n\n注解说明\n--------\n\n### 类注解\n\n| 注解类型  | 描述  |\n|:-------------: |:---------------:|\n| Controller    | 控制器 |\n| Path      | 控制器访问Path|\n| FilterPath |过滤器过滤路径,包括include以及exclude属性|\n\n### 方法注解\n\n| 注解类型  | 描述  |\n|:-------------: |:---------------:|\n| Path      | 资源访问路径，实际访问path为：controllerPath+methodPath |\n|GET|方法仅支持Http GET请求|\n|POST|方法仅支持Http POST请求|\n|PUT|方法仅支持HTTP PUT请求|\n|DELETE|方法仅支持HTTP DELETE请求|\n|Consume | 方法参数支持的MediaType, 如：application/json|\n|Produce | 方法响应MediaType, 如：application/json|\n### 方法参数注解\n\n| 注解类型  | 描述  |参数支持数据类型|\n|:-------------: |:---------------:|:------------:|\n|RequestParam|Query or Form parameter|Primitive type\u0026wrapper class,String|\n|PathVariable|Uri path variable, example: {var}|Primitive type\u0026wrapper class,String|\n|HeaderParam|Request header value|Primitive type\u0026wrapper class,String|\n|CookieParam|Request cookie value|Primitive type\u0026wrapper class,String|\n|RequestBody|Http request body|String, byte[],InputStream or any serializable type|\n\n\n内置服务\n--------\n\n-   Get Server configuration: **[http://{ip}:{port}/config]()**\n-   Get Server status: **[http://{ip}:{port}/status]()**\n-   List All services: **[http://{ip}:{port}/services]()**\n-   Dump trie router config: **[http://{ip}:{port}/router/dump]()**\n\nSpringBoot集成\n--------------\n\n-   添加dorado-spring-boot-starter核心依赖\n\n    ```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.javagossip\u003c/groupId\u003e\n        \u003cartifactId\u003edorado-spring-boot-starter\u003c/artifactId\u003e\n        \u003cversion\u003e${dorado.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n    ```\n\n-   基于springboot的dorado应用\n\n    ```java\n    @SpringBootApplication\n    @EnableDorado       //用这个注解开启dorado server\n    @EnableSwagger     //用这个注解开启swagger\n    public class SpringBootApplication {\n\n        public static void main(String[] args) throws Exception {\n            SpringApplication.run(SpringBootApplication.class, args);\n        }\n    }\n    ```\n\n-   Dorado框架的spring-boot配置参数\n\n\t|参数名|描述|默认值|\n\t|:-----------|:----------:|:-----------:|\n\t|dorado.port|dorado server监听端口|18888|\n\t|dorado.backlog|backlog队列大小|10000|\n\t|dorado.acceptors|dorado acceptor count|cpu核心数*2|\n\t|dorado.io-workers|dorado io worker count|cpu核心数*2|\n\t|dorado.min-workers|业务线程池最小线程数|100|\n\t|dorado.max-workers|业务线程池最大线程数|100|\n\t|dorado.max-connections|服务器最大连接数|100000|\n\t|dorado.max-pending-request|业务线程池队列长度|10000|\n\t|dorado.send-buffer|send buffer size|256k|\n\t|dorado.recv-buffer|recv buffer size|256k|\n\t|dorado.max-idle-time|连接最大空闲时间|8h|\n\t|dorado.max-packet-length|http请求包体大小|1M|\n\t\nswagger集成\n-----------\n\n如果对swagger还不了解的话，参考：[https://swagger.io/]()\n\n-   添加dorado-swagger-ui依赖\n\n```xml\n   \u003cdependency\u003e\n       \u003cgroupId\u003eio.github.javagossip\u003c/groupId\u003e\n       \u003cartifactId\u003edorado-swagger-ui\u003c/artifactId\u003e\n       \u003cversion\u003e${dorado.version}\u003c/version\u003e\n   \u003c/dependency\u003e\n```\n\n-   项目启动类中使用EnableSwagger注解启用swagger\n\n```java\n@EnableSwagger\npublic class Application {\n    public static void main(String[] args) throws Exception {\n        // create simple rest server\n        DoradoServerBuilder.forPort(18888).maxPacketLength(1024*1024*10)\n           .build().start();\n    }\n}\n```\n\n-   设置Api文档全局信息\\\n    实现**io.github.javagossip.dorado.swagger.ext.ApiContextBuilder**接口\n\n```java\n@Component //如果是集成spring或springboot环境的话，直接增加component注解即可\n@Override\n// 这里定制Api全局信息，如文档描述、license,contact等信息\npublic ApiContext buildApiContext() {\n\tInfo info = new Info()\n\t\t\t.contact(new Contact().email(\"javagossip@gmail.com\").name(\"weiping wang\")\n\t\t\t\t\t.url(\"http://github.com/javagossip/dorado\"))\n\t\t\t.license(new License().name(\"apache v2.0\").url(\"http://www.apache.org\"))\n\t\t\t.termsOfService(\"http://swagger.io/terms/\").description(\"Dorado服务框架api接口文档\")\n\t\t\t.title(\"dorado demo api接口文档\").version(\"1.0.0\");\n\n\t//构造api访问授权的apiKey\n\tApiKey apiKey = ApiKey.builder().withName(\"Authorization\").withIn(\"header\").build();\n\tApiContext apiContext = ApiContext.builder().withApiKey(apiKey)\n\t\t\t.withInfo(info).build();\n\n\treturn apiContext;\n}\n```\n\n非spring环境需要在resources/META-INF/services下的io.github.javagossip.dorado.swagger.ext.ApiContextBuilder文件中增加如下配置：  \n**io.github.javagossip.dorado.demo.ApiContextBuilderImpl**\n\n-   在controller实现里面增加swagger相关的注解即可自动生成在线的api doc\n\n```java\n@Controller\n@Path(\"/campaign\")\n@Api(tags = { \"营销活动管理\" })\npublic class CampaignController {\n    @Autowired\n    private CampaignService campaignService;\n\n    @Path(\"/{id:[0-9]+}\")\n    @GET\n    @ApiOperation(\"新建campaign\")\n    public Campaign newCampaign(@PathVariable(\"id\") int id) {\n        Campaign campaign = new Campaign();\n        campaign.setId(id);\n        campaign.setName(\"test campaign\");\n\n        return campaign;\n    }\n}\n```\n\n* spring-boot环境，可以直接引入dorado-swagger-spring-boot-starter依赖来进一步简化swagger的使用  \n\n\t```xml\n\t\u003cdependency\u003e\n  \t\t\u003cgroupId\u003eio.github.javagossip\u003c/groupId\u003e\n  \t\t\u003cartifactId\u003edorado-swagger-spring-boot-starter\u003c/artifactId\u003e\n  \t\t\u003cversion\u003e${dorado.version}\u003c/version\u003e\n\t\u003c/dependency\u003e \n\t```\n\t\n\t然后在application.properties配置文件中增加如下配置即可：\n\t\n\t```java\n\tdorado.swagger.title=Zhuque's dashboard api\n\tdorado.swagger.description=${dorado.swagger.title}\n\tdorado.swagger.license=Apache License\n\tdorado.swagger.licenseUrl=http://www.apache.org/licenses/LICENSE-2.0\n\tdorado.swagger.contact.name=weiping wang\n\tdorado.swagger.contact.email=javagossip@gmail.com\n\tdorado.swagger.contact.url=https://github.com/javagossip\n\t\n\t//API全局认证配置\n\tdorado.swagger.apiKey.name=Authorization\n\tdorado.swagger.apiKey.in=header or query\n\t```\n\n-   浏览器访问如下地址即可  \n    http://{host}:{port}/swagger-ui.html\n\n性能测试\n--------\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavagossip%2Fdorado","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavagossip%2Fdorado","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavagossip%2Fdorado/lists"}