HServer是基於Netty做的一個超高性能WebServer

HServer是基於Netty做的一個超高性能WebServer同時支持RESTFul的輕量級,低入侵,高性能的框架,同時集成MVC等相關快速開發功能的高併發服務器,只需掌握幾個簡單的註解就像SpringBoot一樣,就可快速開發出接口或者其他的應用,同時性能報表。

快速開始

1.文件結構框架架構說明

HServer是基於Netty做的一個超高性能WebServer

2.註解認識

<code>以下註解基本模擬Spring的功能


@Bean
將Bean對象加入IOC容器中比如
//按默名字加入IOC容器
@Bean
class TestService{}
//指定名字加入容器,裝配的時候就只能通過名字裝配了
@Bean("testService")
class Test{}


@Autowired
自動裝配註解
//按類型注入
@Autowired
private TestService testService;
//按Bean名字注入
@Autowired("testServer1")
private TestService testService;


@Controller
控制器註解,將控制器加入IOC容器中,類似Spring mvc
註解在類上面直接加上即可比如
//Index控制器
@Controller
class IndexController{}


@GET,@POST,@RequestMapping
方法註解,在@Controller註解類類中使用,標註一個方法為GET或者POST方法,例如

@GET("/index")
public void index(){}
@POST("/index")
public void index(){}

//url規則匹配
@GET("/url1/{url}")
public String url(HttpRequest httpRequest){
String url = httpRequest.query("url");
System.out.println(url);
return url;
}

@GET("/url/{url}")
public String url(String url){
return "匹配到的URL:"+url;
}

@POST("/a/{url}/bb")
public String ab(String url){
return "匹配到的URL:"+url;
}

//2.9.4+以上支持
@RequestMapping(value = "/PUT", method = RequestMethod.PUT)
public JsonResult PUT() {
return JsonResult.ok();
}
//2.9.4+以上支持
@RequestMapping(value = "/get_post", method = {RequestMethod.POST,RequestMethod.GET})
public JsonResult get_post() {
return JsonResult.ok();
}

//2.9.4+以上支持
//全類型
@RequestMapping(value = "/all")
public JsonResult all() {
return JsonResult.ok();
}


@Filter
攔截器註解,標註一個類為攔截器,和JavaEE的Filter類似
@Filter(1)//1表示攔截優先級,越小越優先

public class MyFilter1 implements FilterAdapter {}
//需要實現FilterAdapter接口


@Hook
hook註解就是Aop
@Hook(value = Test.class, method = "show")
public class HookTest implements HookAdapter {}
//value表示aop的類,method要hook的方法,必須實現HookAdapter


@Task
定時任務
@Task(name = "測試定時任務Cron", time ="*/5 * * * * ?")
//標記在方法上,同時該類需要被@Bean 標記
@Task(name = "測試定時任務1", time ="2000")
public void timerTask() {}


@WebSocket
實現websocket通信
@WebSocket("/ws")
public class WebSocketTest implements WebSocketHandler {}
//這樣就可以完成基本的通信了


@Configuration
自定配置註解,需要配合@Bean註解一起使用,最後會把方法裡面的返回的對象
存儲到IOC容器中,同時可以通過Autowired註解注入
@Configuration
public class DataConfig {

//自定義名字(用例:比如多數據源注入)
@Bean("createUser")
public User createUser(){
User user = new User();
user.setAge(999);

user.setName("我是配置類自定義名字的數據");
user.setSex("未知");
return user;
}

//按類型存儲
@Bean
public User createUser1(){
User user = new User();
user.setAge(999);
user.setName("我是配置類的默認數據");
user.setSex("未知");
return user;
}

}


@RpcService
標註一個Bean對象是一個rpc服務,也可以分配一個名字
@Bean
@RpcService
public class RpcServiceTest {
public String test(String name){
return name+"我是RPC";
}
}


@Resource
注入一個Rpc服務,也可以通過名字注入。詳情,請看文檔介紹
@Resource
private RpcServiceTest rpcServiceTest;


@Sign("MD5")
@RequiresRoles("角色")
@RequiresPermissions(value = {"/權限1","/權限2"}, logical=Logical.OR)
該註解用於標註控制器裡面的方法,方便自己實現sign簽名算法,

角色檢查,權限檢查,實現token等,詳情下面的對應接口。/<code>

3.完成Hello World項目

<code> #第一步pom依賴引入

<dependency>
<groupid>top.hserver/<groupid>
<artifactid>HServer/<artifactid>
<version>最新版/<version>
/<dependency>

public class WebApp {
public static void main(String[] args) {
//運行官方例子,直接運行既可以了,默認自帶了一些例子。
HServerApplication.run(TestWebApp.class, 8888);
}
}


#第二步搞一個主函數
public class WebApp {
public static void main(String[] args) {
HServerApplication.run(WebApp.class, 8888);
}
}

#第三步同主函數建立一個包文件夾比如controller

@Controller
public class Hello {

@GET("/hello")
public Map index(HttpRequest request, String name) {
Map<string> res = new HashMap<>();
res.put("code", 200);
res.put("res", request.getRequestParams());
res.put("msg", "Hello");
return res;
}

/**

* 模板測試
* @param httpResponse
*/
@GET("/template")
public void template(HttpResponse httpResponse) {
User user = new User();
user.setAge(20);
user.setName("xx");
user.setSex("男");
Map<string> obj=new HashMap<>();
obj.put("user",user);
// httpResponse.sendTemplate("/admin/user/list.ftl", obj);
httpResponse.sendTemplate("a.ftl", obj);
}
}
#就這樣你就完成了一個簡單得get請求定義,更多例子,可以參考包top.test下面的例子/<string>/<string>/<code>

4.文件上傳下載操作

<code>      #File類型得
@GET("/downFile")
public void downFile(HttpRequest request, HttpResponse response) {
response.setDownloadFile(new File("D:\\\\Java\\\\HServer\\\\README.md"));
}
#InputStream 類型得
@GET("/downInputStream")
public void downInputStream(HttpRequest request, HttpResponse response) throws Exception {
File file = new File("D:\\\\Java\\\\HServer\\\\README.md");
InputStream fileInputStream = new FileInputStream(file);
response.setDownloadFile(fileInputStream,"README.md");
}/<code>

5.Aop操作

<code>    #必須實現HookAdapter的接口
#同時被@Hook註解標註
@Slf4j
@Hook(value = Test.class, method = "show")
public class HookTest implements HookAdapter {

@Override
public void before(Object[] objects) {
log.info("aop.-前置攔截:" + objects[0]);

objects[0]="666";
}

@Override
public Object after(Object object) {
return object + "aop-後置攔截";
}
}/<code>

6.Filter操作

<code>    #必須實現FilterAdapter接口,同時被@Filter標註,數字越小,優先級越高,切不要重複
@Slf4j
@Filter(1)
public class MyFilter2 implements FilterAdapter {
@Override
public void doFilter(FilterChain chain, Webkit webkit) {
log.info("MyFilter->1");
chain.doFilter(webkit);
}
}/<code>

7.定時任務操作

<code>#需要被@Bean註解標註,可以通過TaskManager類進行定時任務的控制,動態添加和刪除
@Bean
public class TaskTest {

@Autowired
private TestService testService;

private boolean flag = true;

public void dynamicAddTimer() {
System.out.println("動態添加定時任務");
TaskManager.addTask("測試任務2", "2000", TestTask.class,"666");
}


@Task(name = "測試定時任務1", time ="*/5 * * * * ?")
public void timerTask() {
System.out.println("測試定時任務,注入的對象調用結果:" + testService.testa());

if (flag) {
dynamicAddTimer();
flag = false;
}
}

@Task(name = "測試定時任務2", time = "2000")
public void removeTask() {
//幹掉方法註解版本
boolean task1 = TaskManager.removeTask("測試定時任務1");
//幹掉動態添加的
boolean task2 = TaskManager.removeTask("測試任務2");
//幹掉自己
boolean task3 = TaskManager.removeTask("測試定時任務2");
//結果
System.out.println("任務已經被幹掉了 tash1=" + task1 + ",task2=" + task2 + ",task3=" + task3);
}

}

//動態添加定時任務的實現類必須要實現一個TaskJob,樣才能被TaskManager管理
//添加任務 TaskManager.addTask("測試任務2", "2000", TestTask.class,"666");
//刪除任務 boolean is_success = TaskManager.removeTask("測試任務2");
public class TestTask implements TaskJob {

@Override
public void exec(Object... args) {
String args_ = "";
for (Object arg : args) {
args_ += arg.toString();
}
System.out.println("測試定時器動態添加任務,參數是:" + args_);
}
}/<code>

8.websocket操作

<code>#需要被@WebSocket標註同時給一個連接地址,最後實現WebSocketHandler接口, 

#Ws類定義了簡單的發送方法,如果有其他的業務操作,可以獲取ChannelHandlerContext,進行操作

@WebSocket("/ws")
public class WebSocketTest implements WebSocketHandler {

@Autowired
private TestService testService;

@Override
public void onConnect(Ws ws) {
System.out.println("連接成功,分配的UID:" + ws.getUid());
}

@Override
public void onMessage(Ws ws) {
ws.send("666" + testService.testa() + ws.getUid());
System.out.println("收到的消息,"+ws.getMessage()+",UID:" + ws.getUid());
}

@Override
public void disConnect(Ws ws) {
System.out.println("斷開連接,UID:" + ws.getUid());
}
}/<code>

9.自帶監控操作

<code>application.properties文件配置
#開啟訪問統計
statistics=true
#統計規則:以逗號分割的正則表達式
statisticalRules=/hel.*,/admin/.*
#StatisticsHandler操作
#獲取所有的IP地址
StatisticsHandler.getIpMap()
#請求隊列(調用的URI,(發送大小,接收大小)寬帶監視,耗時時間)
StatisticsHandler.getLogRequestQue()
#唯一IP請求的數量 uv

StatisticsHandler.getUniqueIpCount()
#請求總數 pv
StatisticsHandler.getCount()
#uri記錄 被訪問的記錄()
StatisticsHandler.getUriData()
#提示:
1,如果自己要做統計,完全可以自定義一個定時器,動態保存數據哦
2,StatisticsHandler,提供了一個remove方法,remove,用來清除,或者保存數據用,它會返回一個最新的數據同時清除自己
3,如果開啟統計,請務必,執行Remove方法,不然,內存可能就會蹦/<code>

10.全局異常處理

<code>類必須要被@Bean註解,同時實現GlobalException接口,
一個項目中最多隻有一個GlobalException實現哦,可以沒有.沒有異常處理,同時又報錯了,那麼直接顯示錯誤
@Bean
public class WebException implements GlobalException {

@Override
public void handler(Exception exception, Webkit webkit) {
exception.printStackTrace();
System.out.println(webkit.httpRequest.getUri() + "--->" + exception.getMessage());
webkit.httpResponse.sendHtml("全局異常處理");
}
}/<code>

11.服務器啟動完成是執行的方法

<code> 類必須要被@Bean註解,同時實現InitRunner接口,
@Bean
public class RunInit implements InitRunner {


@Autowired
private User user;

@Override
public void init(String[] args) {
System.out.println("初始化方法:注入的User對象的名字是-->"+user.getName());
}
}/<code>

12.鑑權認證相關操作

<code>//請使用相關注解對控制器的方法做標記,這樣在執行到被註解標記的方法就會執行下面的相關方法
// List<routerpermission> routerPermissions = PermissionAdapter.getRouterPermissions();
// 通過上面的代碼可以獲取到所有標記的註解,他可以幹嘛?
// 同步後臺數據庫裡面的權限,後臺管理面裡面可以動態給角色分配權限。
// 自己做一個下拉選擇列表,創建角色分配權限時,多選即可。

/**
* 驗證邏輯請自己實現哦
*/
@Bean
public class TestPermission implements PermissionAdapter {

@Override
public void requiresPermissions(RequiresPermissions requiresPermissions, Webkit webkit) {
//這裡你可以實現一套自己的權限檢查算法邏輯,判斷,
//如果滿足權限,不用其他操作,如果不滿足權限,那麼你可以通過,Webkit裡面的方法直接輸出相關內容

//或者自定義一個異常類,在全局異常類做相關操作
System.out.println(requiresPermissions.value()[0]);
}

@Override
public void requiresRoles(RequiresRoles requiresRoles, Webkit webkit) {
//這裡你可以實現一套自己的角色檢查算法邏輯,判斷,
//其他邏輯同上
System.out.println(requiresRoles.value()[0]);
}

@Override
public void sign(Sign sign, Webkit webkit) {
//這裡你可以實現一套自己的接口簽名算法檢查算法邏輯,判斷,
//其他邏輯同上
Map<string> requestParams = webkit.httpRequest.getRequestParams();
String sign1 = webkit.httpRequest.getHeader("sign");
System.out.println(sign.value());
}
}/<string>/<routerpermission>/<code>

13.RPC調用請看gitee的WIKi

14.HServer2.9.4+後添加APIDOC生成功能

<code>詳情請看WIKi/<code>
HServer是基於Netty做的一個超高性能WebServer


分享到:


相關文章: