摘要:以實現自己熟悉的東西為導向比如我們做后端開發,首先是常用的循環迭代條件判斷增刪改成。它是由實現的,不保證元素的順序,也就是說所說元素插入的順序與輸出的順序不一致。
下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...誤解
代碼:https://github.com/zhoumengka...
整個項目我們我又細分了6個版本來演進,希望更加便于大家對比學習。
我在收集大家是否愿意學習 java 的時候,得到了如下反饋:
java == 太復雜 java == 各種亂七八糟的配置 java == 面向 ide 編程
其實我們在學習的時候 java 的時候完全不用接觸那些高大上的工具,也可以盡量減少各種配置文件,比如下面我們只有個pom.xml配置文件。
還有的同學說還學 java 干嘛,不都應該去學 go 嗎?其實語言真的不重要,我們需要掌握的是快速學習利用一門語言的學習方法,這也是本課的真正目的。
就像盲人摸象一樣,他要想弄清楚大象的真實面貌可能要摸很久,就好比我們拿著放大鏡在學習 java 一樣,java 經過這么多年的發展,可以說非常龐大。如果我們要知道大象長什么樣,就應該放下手中的放大鏡,向后退遠點,反而能夠非常清晰的看到它的全貌。學習一門新的語言也一樣,有很多很多網上的教程,非常的大而全,一般得系統的學習30~60小時之后才能正式的接觸項目開發。基礎很重要,但是學習了太多的基礎會讓大家失去學習的樂趣和自信心。很多知識點其實可以項目之后再補。按需去學,反而是自我驅動著去學習的最佳方式。
比如 hashmap 的哈希分布、哈希碰撞、動態擴容,這些都是我們后期深入提高需要理解的內容,初期,我們只需要知道能拿 hashmap 做什么就行。
以實現自己熟悉的東西為導向比如我們做 Web 后端 api 開發,首先是常用的循環/迭代、條件判斷、增刪改成。那么能不能快速用 java 實現一遍這些我們用 php 做起來非常順手的事呢?
這樣有助于我們快速提升自信心。
PHP 里如何實現,重新用 java 實現一遍就行了。
最后深入系統的學習當自己實現了一些小 demo 再去參考別人的項目。如果一開始就直接看別人的項目,可能完全不知道別人在干嘛。比如別人用了ConcurrentHashMap,就再去思考為什么我用HashMap他卻用ConcurrentHashMap,帶著問題,帶著思考去看開源代碼。
完成了一些簡單的項目了之后就可以再回過頭來系統的學習了。這時候就會有不一樣的收獲。
最后就是當項目需要調優,性能提升的時候,再各個擊破,深入學習,更有針對性,更有目標性。
實戰開始我們用 netty 來提供高性能的 web 服務服務。使用簡單方便(netty 并不簡單),不依賴其他軟件。然后思考完成一個簡單的 web api 服務器需要哪些必不可少的組成部分。(其實在思考這的時候,你必須要要對做簡單的架構必須熟記于心)。
我簡單概括了下:
java 基礎數據類型(php 也有,不怕)
java 集合框架(php 有數組,很強大)
初識 maven(php 有 composer)
反射 (框架路由等地方要用到,php 也有)
序列化(數據傳輸要用到,php 沒有復雜的數據結構要簡單 N 倍)
jdbc (數據庫操作要用到,php 有 pdo)
大概認識泛型、注解等語法 (可選)
使用 netty 實戰開發一個 web api 服務(php 有 swoole)
Java 基本的數據結構、各種基本數據類型包裝類 Java - Collections Framework 高頻類舉例HashSet 是一個沒有重復元素的集合。它是由HashMap實現的,不保證元素的順序,也就是說所說元素插入的順序與輸出的順序不一致。這其實是我的老朋友了,redis 里經常用,比如咱們可以它來實現一個黑名單,這樣查找的速度就非常快,也不用去遠程查詢 redis 了,直接在當前內存中查詢。
ArrayList 基于數組來實現集合的功能,其內部維護了一個可變長的對象數組,集合內所有對象存儲于這個數組中,并實現該數組長度的動態伸縮。
這不就是我們的 PHP 里面常用的索引數組么?
HashMap 以哈希表數據結構實現,查找對象時通過哈希函數計算其位置,它是為快速查詢而設計的。特點就是快,非線程安全。
這不就是我們的 PHP 里面常用的關聯數組么?
http://www.cnblogs.com/ITtang...
http://www.jianshu.com/p/b54f...
http://www.cnblogs.com/xiaoxi...
Maven的基本原理很簡單,采用遠程倉庫和本地倉庫以及一個核心的配置文件pom.xml,pom.xml中定義的jar文件從遠程倉庫下載到本地倉庫,各個項目使用同一個本地倉庫的jar,同一個版本的jar只需下載一次,而且避免每個應用都去拷貝jar。
這和 php 的包管理工具 composer 很像,或者是 composer 是參考著 maven 而設計的。maven 的功能更強大,composer 需要每個項目都要導入一遍,maven 卻像 git 一樣,有一個本地倉庫,第三方包也不會直接引用到項目中,而是在編譯的時候才會引入(是不是很方便)。另一方面,maven 不僅僅是包管理工具,而且是一個項目管理工具,集成了編譯、打包、單元測試等功能。
下面是最簡單的一個演示,依賴了 netty 、junit 兩個包。然后使用maven-compiler-plugin指定了編譯時候的版本規則。
v1.0 構建 http web 服務器4.0.0 mengkang.net demo 1.0-SNAPSHOT io.netty netty-all 5.0.0.Alpha2 junit junit 4.7 test org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.8 UTF-8
我復制了 netty 官方的 demo 地址如下:
https://github.com/zhoumengkang/netty-http-demo/tree/v1.0
當我們運行api.mengkang.net.netty.HttpServer.main方法,服務器就跑起來了,當在瀏覽器里訪問 http://localhost:9009/ 就會返回Hello World。
方法 | 用途 |
---|---|
api.mengkang.net.netty.HttpServer#main | 服務器啟動的入口 |
api.mengkang.net.netty.HttpServerInitializer#initChannel | 初始化 Channel |
api.mengkang.net.netty.HttpServerHandler#channelRead | 進行網絡 I/O |
這是第一步,netty 這里就充當了一個 web server 的角色。而我們就可以直接在 netty 提供的接口的基礎上做編程,而不需要想 nginx + php-fpm 還需要一次反向代理,性能高了許多。(swoole 的方式就很像 netty 了)。
v2.0 實現控制器的訪問具體需求:提供一個 api 可以用戶指定用戶的信息
定義接口:
http://localhost:10000/users/{id} http://localhost:10000/?method=user.get&id={id}
可能現在大家早已習慣了前者 restful 的 api 接口。
因為這里需要一次路由的映射和 http method 的匹配,考慮到學習的成本呢,我沒有選擇這種方式。
我們今天的目標是以最簡單有效的方式實現我們的功能。
我們首先從最簡單的方式來實現(其實沒有路由的 api 反而是最快的,畢竟需要做的判斷少嘛)。
后面大家有興趣可以參考我寫的一個 restful api 的 demo netty-restful-server
具體代碼
https://github.com/zhoumengkang/netty-http-demo/tree/v2.0
這一版本中做一個過渡版本,暫時控制器還不解析過多的參數。只完成一個$_GET["method"]參數的解析。
主要的任務是通過獲取的$_GET["method"]去執行UserController里面的get方法。
方法 | 用途 |
---|---|
api.mengkang.net.RequestHandler#response | 從 HttpServerHandler 處接管網絡請求 |
api.mengkang.net.RequestHandler#invoke | 執行反射調用 |
api.mengkang.net.api.UserController#get | 模擬輸出一個用戶的信息 |
Class> classname; Method methodName; Object result = null; classname = Class.forName("api.mengkang.net.api." + clazz + "Controller"); Object inst = classname.newInstance(); methodName = classname.getMethod(function); result = methodName.invoke(inst);v3.0 解析請求參數
具體代碼
https://github.com/zhoumengkang/netty-http-demo/tree/v3.0
方法 | 用途 |
---|---|
api.mengkang.net.Request | 封裝一個通用 api 請求對象,包含客戶端請求的$_GET,$_POST,ip 等 |
api.mengkang.net.RequestHandler#requestFetch | 把請求解析成 api.mengkang.net.Request 對象 |
api.mengkang.net.RequestHandler#invoke | 把 api.mengkang.net.Request 傳遞給 Controller |
反射實例化對象使用了構造函數 ,這樣就把請求的對象Request實例傳到 Controller 中去了。Controller 中的方法就能取到$_GET,$_POST,以及類似 php://input 的數據了。
Class> classname; Object classObject; Constructor constructor; Method methodName; Object result = null; classname = Class.forName("api.mengkang.net.api." + clazz + "Controller"); constructor = classname.getConstructor(Request.class); classObject = constructor.newInstance(request); methodName = classname.getMethod(function); result = methodName.invoke(classObject);v3.1 完善返回體信息
具體代碼
https://github.com/zhoumengkang/netty-http-demo/tree/v3.1
類 | 用途 |
---|---|
api.mengkang.net.Response | 封裝一個通用 api 響應對象 |
api.mengkang.net.ErrorCode | 錯誤代碼統一規范起來 |
api.mengkang.net.netty.HttpServerHandler | http 頭信息 改為 json |
這樣就更像一個正規的 api 服務了。
v4.0 構建 User 對象增加 User 對象, 增加 UserModel 來處理 User 對象的返回, 完善了錯誤返回機制.
類 | 用途 |
---|---|
api.mengkang.net.entity.User | 描述用戶對象,用于user.get接口的數據返回 |
api.mengkang.net.model.UserModel | 供UserController調用,簡單分層 |
api.mengkang.net.ErrorCode | 完善了錯誤類型 |
api.mengkang.net.api.UserController | 完善了錯誤類型的判斷,返回給前端錯誤更友好 |
類 | 用途 |
---|---|
api/mengkang/net/utils/mysql | 新增自己封裝的簡單的數據連接池的操作工具 |
api.mengkang.net.dao.UserDao | 做數據庫連接的查詢,返回給UserModel |
中間引入三個包,來做數據庫的查詢和數據庫的連接池
mysql mysql-connector-java 5.1.18 commons-dbcp commons-dbcp 1.4 commons-pool commons-pool 1.6
最后整個項目結構如下
├── main │?? ├── java │?? │?? └── api │?? │?? └── mengkang │?? │?? └── net │?? │?? ├── Config.java │?? │?? ├── ErrorCode.java │?? │?? ├── Request.java │?? │?? ├── RequestHandler.java │?? │?? ├── Response.java │?? │?? ├── api │?? │?? │?? ├── BaseController.java │?? │?? │?? └── UserController.java │?? │?? ├── dao │?? │?? │?? └── UserDao.java │?? │?? ├── entity │?? │?? │?? └── User.java │?? │?? ├── model │?? │?? │?? └── UserModel.java │?? │?? ├── netty │?? │?? │?? ├── HttpServer.java │?? │?? │?? ├── HttpServerHandler.java │?? │?? │?? └── HttpServerInitializer.java │?? │?? └── utils │?? │?? └── mysql │?? │?? ├── DMLTypes.java │?? │?? ├── DbFiled.java │?? │?? ├── JdbcPool.java │?? │?? ├── MySelect.java │?? │?? └── Mysql.java │?? └── resources │?? ├── api.properties │?? ├── read.db.properties │?? └── write.db.properties
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67484.html
摘要:以實現自己熟悉的東西為導向比如我們做后端開發,首先是常用的循環迭代條件判斷增刪改成。它是由實現的,不保證元素的順序,也就是說所說元素插入的順序與輸出的順序不一致。 下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...代碼:https://github.com/zhoumengka...整個項目我們我又細分了6個版本來演進,希望更加便于大家對比...
摘要:下面一起學習下鳥哥的框架。揭開神秘面紗采用客戶端服務器模式。在服務器端,進程保持睡眠狀態直到調用信息的到達為止。這和我們外網的原理不都一個樣么那么我們一起看看高大上的是怎么在玩。整個傳輸以二進制流的形式傳送。 各位老鐵在點贊、收藏的時候敢不敢報名小弟的直播分享,絕對有干貨,絕對有驚喜!一次早餐錢的投入,可能是薪資的翻倍,可能是視野的拓展! PHP 進階之路 - 億級 pv 網站架構...
摘要:去年年底因為使用了云存儲和其他方面的原因,計劃的將服務器縮減一個機柜出來。云服務的回源服務器的配置中間漏了一臺,后期給補上了。監控遷移完畢之后,除了常規的業務代碼,還需要注意圖片資源的回源是否正常服務器壓力是否正常檢查日志是否出現錯誤。 去年年底因為使用了云存儲和其他方面的原因,計劃的將服務器縮減一個機柜出來。這樣今年每月機房的費用可以減少1萬左右。前前后后抽空在弄這個任務,現做個筆記...
摘要:唯一的知識點就是的基礎使用。可以簡單的理解下面的代碼就構建了一個服務器。握手完成之后的消息傳遞則在中處理。實際情況下,不可能那么多人同時說話廣播,而是說話的人少,接受廣播的人多。 硬廣一波 SF 官方首頁推薦《PHP進階之路》(你又多久沒有投資自己了?先看后買) 我們下面則將一些實際場景都添加進去,比如用戶身份的驗證,游客只能瀏覽不能發言,多房間(頻道)的聊天。該博客非常適合 Java...
摘要:如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。為解決線程的并發問題,引入了線程安全資源管理器。的全拼,用來存放各個線程的鏈表。 PHP 進階之路 - 零基礎構建自己的服務治理框架(上) PHP 進階之路 - 零基礎構建自己的服務治理框架(下) PHP 進階之路 - 億級 pv 網站架構的技術細節與套路 PHP 進階之路 - 億級 pv 網站架構實戰之性能壓榨 注...
閱讀 2352·2021-11-23 09:51
閱讀 2002·2021-10-14 09:43
閱讀 2768·2021-09-27 13:35
閱讀 1150·2021-09-22 15:54
閱讀 2503·2021-09-13 10:36
閱讀 3800·2019-08-30 15:56
閱讀 3410·2019-08-30 14:09
閱讀 1718·2019-08-30 12:57