├── .github └── workflows │ └── blank.yml ├── .gitignore ├── README.md ├── docs ├── .vuepress │ ├── config.js │ ├── enhanceApp.js │ ├── public │ │ ├── favicon.ico │ │ ├── manifest.json │ │ └── mlogo.svg │ └── styles │ │ ├── fonts │ │ ├── DFPKingGothicGB-Light.ttf │ │ ├── JetBrainsMono-1.0.3 │ │ │ └── woff2 │ │ │ │ ├── JetBrainsMono-Bold-Italic.woff2 │ │ │ │ ├── JetBrainsMono-Bold.woff2 │ │ │ │ ├── JetBrainsMono-ExtraBold-Italic.woff2 │ │ │ │ ├── JetBrainsMono-ExtraBold.woff2 │ │ │ │ ├── JetBrainsMono-Italic.woff2 │ │ │ │ ├── JetBrainsMono-Medium-Italic.woff2 │ │ │ │ ├── JetBrainsMono-Medium.woff2 │ │ │ │ └── JetBrainsMono-Regular.woff2 │ │ └── index.styl │ │ └── index.styl ├── README.md ├── ddd │ ├── 00 │ │ ├── README.md │ │ └── assets │ │ │ └── dc32e8e4a317fe00121ce18adc407c66.jpg │ ├── 01 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 09ca1ccc982d02634a856b2e80cf24b8.jpg │ │ │ ├── 136512ac4c65b3f2ed4b2898b40965f6.jpg │ │ │ ├── 323c8aca1271cc043558dfd1f95f57fa.jpg │ │ │ ├── 3bb8915fd6e880d64e9029a1f8677473.jpg │ │ │ ├── 4c26f42d035da0cd5cbe1f25c48c205b.jpg │ │ │ ├── 69f44e120de5019c0fbff4d3fbc0afee.png │ │ │ ├── 8a859915250ffcab04675fb02fdf34f8.jpg │ │ │ ├── 96253ac8bd1d93a2786b59d7b9c2c423.jpg │ │ │ ├── ac0b9db12b201f24c7b2c1e343a88e26.png │ │ │ ├── c597d53a1a1aeca274d355e8ac79cc1b.jpg │ │ │ └── c99d4ef4fe28f483938e4fa03afb98c3.jpg │ ├── 02 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 09d70aae8b66092bc692ac30510f9145.jpg │ │ │ ├── 1680723ca91aa57d719d5cdbc1d910a1.jpg │ │ │ ├── 23e38df6e78c0a10ddf27f8a254c0093.jpg │ │ │ ├── 261b05056ae6056ff406f7dadf7ac081.jpg │ │ │ ├── 3caae85ef680eb7cbc2ffb5c6a603f47.png │ │ │ ├── 45de1af6a4b5dd6cf54921ff9f422571.png │ │ │ ├── 76c677ccc83912dbc4d09d62c259b391.jpg │ │ │ ├── 7f1e3891c9c11abce96020e0bf20d67c.jpg │ │ │ ├── 8579738f790f3ed1adbf58a5a2427e04.jpg │ │ │ ├── 85fb9fb2782b343d45b4ca18c8f21e6c.png │ │ │ ├── 89321072afd996c6a90fa9774f769e11.jpg │ │ │ ├── 991b8a5b685d8b0b3e172f38c0460a29.png │ │ │ ├── 9a602b741c222b19c7cc4780da79cf76.jpg │ │ │ ├── a308123994f87a5ce99adc85dd9b4d01.jpg │ │ │ ├── b221ed4011c23720ebe9f48ba8eee38f.jpg │ │ │ ├── b2e4dad1040857b5aedf0b1675ae4171.png │ │ │ ├── b4231550cfbd56c15ccb3795d1062f9e.png │ │ │ ├── ba2049c9a3696bbebbd9d60e496df72b.jpg │ │ │ ├── c647561ff910f97b8500b75de70281df.png │ │ │ ├── d6abc3e4f5837cd51b689d01433cace1.jpg │ │ │ ├── eeb66579c1725817d0e9185161f1843b.png │ │ │ └── fc8208d9f4cfadb7949d6e98a8c18442.png │ ├── 03 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── 07.md │ │ ├── 08.md │ │ ├── 09.md │ │ ├── 10.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 18acc5f5681c61a37957e5036f176274.jpg │ │ │ ├── 255beadd4cf7a842c083ccea0ec19807.jpg │ │ │ ├── 25cd1e7fe14bfa22a752c1b184b9c91d.jpg │ │ │ ├── 2d6a328a9fd8b4b3906bb9f59435ca1d.png │ │ │ ├── 30caee3ceaf1085b7aa2cc388f996e61.jpg │ │ │ ├── 33cbdd0f30a400a0cb9a2bd7ca5d54c5.jpg │ │ │ ├── 348d60eac28c9dbf7d120d1b7159cdf9.png │ │ │ ├── 35d5b6465f6978b16a5ddfa49a910d6f.jpg │ │ │ ├── 3a80b8e7648440a49b809d945e6439f8.jpg │ │ │ ├── 5bbe3454e2ecf4ff4770e887a4967b5a.jpg │ │ │ ├── 5e901b4f7fa964b349e4d6f344786ea1.png │ │ │ ├── 688dd55b8399779baff8fc5b7c124c2c.jpg │ │ │ ├── 689e27849a72b780ef62176fc0357204.jpg │ │ │ ├── 7d0eff75e60913a01aadfc7c6b24dad4.jpg │ │ │ ├── 84a486d4c0d9146462b31c7fcd5d835e.png │ │ │ ├── 88d709569367264d368b08a7d9658c3d.png │ │ │ ├── 89a65daccac054e97591c7259a60e4bc.jpg │ │ │ ├── 8d5fa14336fbf9a2cd239736e24c59f0.jpg │ │ │ ├── 915ad8d830d925a893cd09ff6cbdadb8.jpg │ │ │ ├── 95524b08051fcd181e65f825005a4c73.png │ │ │ ├── 97c049d18f7e7032f6feef70992a4828.jpg │ │ │ ├── a308123994f87a5ce99adc85dd9b4d01.jpg │ │ │ ├── a7fa9314002372f6ddad1c1b54573a66.png │ │ │ ├── a88e9695c7198a1f88f537564ada0bc5.jpg │ │ │ ├── ab304d69ee174b5e69cb63d79864ca07.png │ │ │ ├── ae33bc5c0cda28740363e39edbc1e53c.jpg │ │ │ ├── af21beade34a5f121f673c25a7c979be.jpg │ │ │ ├── b35d6fed54e26423c0d61de040ab04a0.jpeg │ │ │ ├── b5570b95095fd9103506fef3fa6a87ce.jpg │ │ │ ├── b56e20cd47d161eccbd86d014f9c6e76.jpg │ │ │ ├── b85983fa6a8c877e77387fdafe1598c4.jpg │ │ │ ├── bb9f2a7095da0c72504e0195dca34376.jpg │ │ │ ├── c1fce57f9e2a88ab2728db79ff45c770.png │ │ │ ├── c6ea040a520c91dfe6400f206ff36fef.jpg │ │ │ ├── cc697f4e8eef2629a660d247c8a1eceb.jpg │ │ │ ├── cf35a9437319169784db9e5aab97b1fd.jpg │ │ │ ├── d0191d4e4c51ff91dc830bf38c0e7ae1.jpg │ │ │ ├── d0f8fb06797a5983c7fd00d59d8be57d.jpg │ │ │ ├── d1bea7dc6bd93f3bd30ced821f36bb71.jpg │ │ │ ├── e2f91189e25bbaa81307d1fea694aee4.jpg │ │ │ ├── e5d025a6fd69d1f2cf2a1af53253abdb.png │ │ │ ├── e665d85381a9b2c599555cac6a06deda.jpg │ │ │ ├── eb626396fcb9f541ec46a799275e04b2.png │ │ │ ├── eca31d653a3171a8272c6b1f25140bf7.png │ │ │ ├── ed9da0faabb9c756a0067dbd3f75d103.png │ │ │ ├── ef218e23ea2a8dc756af885ae06e61b2.jpg │ │ │ ├── f1b2e04d38ba13d8c318aa3539604bc4.jpg │ │ │ ├── f537a7a43e77212c8a85241439b2f246.jpg │ │ │ └── fb11e6941fc471c734d0b85c25cc5370.jpg │ ├── 04 │ │ ├── 01.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 5f22ed9bb3d5b6c63f21583469399892.jpg │ │ │ └── 8a90eb7bb3a80baa917cef282b7ff042.jpg │ ├── README.md │ └── index.js ├── http-protocol │ ├── 01 │ │ └── README.md │ ├── 02 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── 07.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 261bac84bfb1f957c3e9fd45021a5d73.png │ │ │ ├── 2b8fee82b58cc8da88c74a33f2146703.png │ │ │ ├── 3abcf1462621ff86758a8d9571c07cdc.png │ │ │ ├── 5102fc33d04b59b36971a5e487779864.png │ │ │ ├── 613fffb6defee1735431dc5f89085d8b.png │ │ │ ├── 6b020454987543efdd1cf6ddec784bf2.png │ │ │ ├── 70bc19acacf2245fa841349f15cb7a6f.png │ │ │ ├── 85cadf90dc96cf413afaf8668689ef0b.png │ │ │ ├── 9470d41cab80f36438ebb06a71672242.png │ │ │ ├── 9d9b3c9274465c94e223676b6d434194.png │ │ │ ├── c1e411161fdf8818f47262d5e770cf95.png │ │ │ ├── d697ba915bcca40a11b8a25571516720.jpg │ │ │ ├── d7f12d4d480d7100cd9804d2b16b8a88.png │ │ │ ├── e51df3245609880641043af65bba94ac.png │ │ │ ├── image-20210303183633464.png │ │ │ ├── image-20210303184026726.png │ │ │ ├── image-20210303184415482.png │ │ │ ├── image-20210303190034087.png │ │ │ ├── image-20210303191137031.png │ │ │ ├── image-20210303191636900.png │ │ │ └── image-20210304101549294.png │ ├── 03 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── 07.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 174bb72bad50127ac84427a72327f095.png │ │ │ ├── 1fe4c1121c50abcf571cebd677a8bdea.png │ │ │ ├── 36108959084392065f36dff3e12967b9.png │ │ │ ├── 3cdc8ac71b80929f4a94dfeb9ffe4b6d.jpg │ │ │ ├── 46581d7e1058558d8e12c1bf37d30d2a.png │ │ │ ├── 5717c967b8d46e5ba438e1d8ed605a1b.png │ │ │ ├── 62e061618977565c22c2cf09930e1d3c.png │ │ │ ├── 7808b195c921e0685958c20509855d4a.png │ │ │ ├── 86e3c635e9a9ab0abd523c01fc181cb0.png │ │ │ ├── 8a5bddd3d8046daf7032c7d60a3d1a19.png │ │ │ ├── a1477b903cd4d5a69686683c0dbc3300.png │ │ │ ├── b191c8760c8ad33acd9bb005b251a2df.png │ │ │ ├── cb0d1d2c56400fe9c9988ee32842b175.png │ │ │ ├── df4696154fc8837e33117d8d6ab1776d.png │ │ │ ├── f1970aaecad58fb18938e262ea7f311c.png │ │ │ ├── ff41d020c7a27d1e8191057f0e658b38.png │ │ │ ├── image-20210304112013792.png │ │ │ ├── image-20210304115745790.png │ │ │ ├── image-20210304160835980.png │ │ │ ├── image-20210304161416507.png │ │ │ ├── image-20210304164924545.png │ │ │ ├── image-20210304165037886.png │ │ │ ├── image-20210305100326091.png │ │ │ ├── image-20210305100724706.png │ │ │ ├── image-20210305105208799.png │ │ │ ├── image-20210305105941548.png │ │ │ └── image-20210305131825952.png │ ├── 04 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── 07.md │ │ ├── 08.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 006059602ee75b176a80429f49ffc9aa.png │ │ │ ├── 0e9bcd6922fa8908bdba79d98ae5fa10.png │ │ │ ├── 25e7b09cf8cb4eaebba42b4598192410.png │ │ │ ├── 28237ef93ce0ddca076d2dc19c16fdf9.png │ │ │ ├── 37fbfef0490a20179c0ee274dccf5e6e.png │ │ │ ├── 4d210fa1adccb7299d632ed7e66391e8.png │ │ │ ├── 5191bce1329efa157a6cc37ab9e789b9.png │ │ │ ├── 52a3bd760584972011f6be1a5258e2d7.png │ │ │ ├── 54315ed9ac37fbc6547258040f00a80c.png │ │ │ ├── 57b3d80234a1f1b8c538a376aa01d3b4.png │ │ │ ├── 5a247e9e5bf66f5ac3316fddf4e2b254.png │ │ │ ├── 5e8d10b5758685850aeed2a473a6cdc2.png │ │ │ ├── 66a6d229058c7072ab5b28ef518da302.png │ │ │ ├── 6a6d30a89fb085d5f1773a887aaf5572.png │ │ │ ├── 81b9609c5f50281ec3d53fb4d299b690.png │ │ │ ├── 8a67535620ab9c7764560363f83982b2.png │ │ │ ├── 8c1fe47a7ca4b52702a6a14956033f7c.png │ │ │ ├── 9f6cca61802d65d063e24aa9ca7c38a4.png │ │ │ ├── a1968821f214df4a3ae16c9b30f99a5b.png │ │ │ ├── a8accc7e1836fa348c2fbd29f494069d.png │ │ │ ├── b2118315a977969ddfcc7ab9d26cb358.png │ │ │ ├── b239d0804be630ce182e24ea9e4ab237.png │ │ │ ├── c5aa6d5f82e8cc1a35772293972446e7.png │ │ │ ├── dd65b95de96d78552a92757d58de6a37.png │ │ │ ├── f2a12669e997ea6dc0f2228bcaf65a06.png │ │ │ ├── fffa3a65e367c496428f3c0c4dac8a37.png │ │ │ ├── image-20210305185305993.png │ │ │ ├── image-20210305192551220.png │ │ │ ├── image-20210305193331910.png │ │ │ ├── image-20210305193408952.png │ │ │ ├── image-20210305195213500.png │ │ │ ├── image-20210306102133840.png │ │ │ ├── image-20210306112247582.png │ │ │ ├── image-20210306113302710.png │ │ │ ├── image-20210306113321863.png │ │ │ ├── image-20210306160058378.png │ │ │ ├── image-20210306162038091.png │ │ │ ├── image-20210306163959411.png │ │ │ ├── image-20210306171215940.png │ │ │ ├── image-20210306171253309.png │ │ │ ├── image-20210306171441154.png │ │ │ ├── image-20210308184306725.png │ │ │ ├── image-20210308185222487.png │ │ │ ├── image-20210308193039343.png │ │ │ ├── image-20210308193305833.png │ │ │ ├── image-20210308193846660.png │ │ │ ├── image-20210309092029949.png │ │ │ ├── image-20210309092106572.png │ │ │ ├── image-20210309092631983.png │ │ │ ├── image-20210309095056568.png │ │ │ └── image-20210309113745228.png │ ├── 05 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── 06.md │ │ ├── 07.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 0274e31e74e92b61892ec11cc3cd58e7.png │ │ │ ├── 119cfd261db49550411a12b1f6d826ab.png │ │ │ ├── 125fe443a147ed38a97a4492045d98ac.png │ │ │ ├── 2865d2c77466efb7a480833bcb27f9d8.png │ │ │ ├── 40fbb989a9fd2217320ab287e80e1fb0.png │ │ │ ├── 44d8c3349ffdea5a1e4e13d222bc743c.png │ │ │ ├── 4d1df4d07dbb1c2500fc4ea69ecf7ab0.png │ │ │ ├── 50d57e18813e18270747806d5d73f0a3.png │ │ │ ├── 69493b53f1b1d540acf886ebf021a26c.png │ │ │ ├── 70b36338611d5a249a7d2fc448f06d42.png │ │ │ ├── 7a2bc39fdbb421cf72a01e887e9156db.png │ │ │ ├── 84a79826588ca35bf6ddcade027597d2.png │ │ │ ├── 89344c2e493600b486d5349a84318417.png │ │ │ ├── 8f0813e9555ba1a40bd2170734aced9c.png │ │ │ ├── 8feab67c25a534f8c72077680927ab49.png │ │ │ ├── 9caba6d4b527052bbe7168ed4013011e.png │ │ │ ├── a55051ca7ae941ae04791cdddde6658f.png │ │ │ ├── a662d410dfdaa8ab44b36cbb68ab8d1b.png │ │ │ ├── b452ceb3cbfc5c644a3053f2054b1aba.jpg │ │ │ ├── c2e10e9afa1393281b5633b1648f2696.png │ │ │ ├── c41da1f1b1bdf4dc92c46330542c5ded.png │ │ │ ├── cb9a89055eadb452b7835ba8db7c3ad2.png │ │ │ ├── e41f87110aeea3e548d58cc35a478e85.png │ │ │ ├── eeeb1d30acbc0e69541ce0620346b765.jpg │ │ │ ├── image-20210309154706676.png │ │ │ ├── image-20210309160439908.png │ │ │ ├── image-20210309161310028.png │ │ │ ├── image-20210310094117128.png │ │ │ ├── image-20210310094132913.png │ │ │ ├── image-20210310094519340.png │ │ │ ├── image-20210310105548742.png │ │ │ ├── image-20210310111820297.png │ │ │ ├── image-20210310112426920.png │ │ │ ├── image-20210310113404586.png │ │ │ ├── image-20210310141746246.png │ │ │ ├── image-20210310145052314.png │ │ │ ├── image-20210310165429813.png │ │ │ ├── image-20210310165529095.png │ │ │ └── image-20210311102432156.png │ ├── 06 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 19be1138574589458c96040e1a23b3a7.png │ │ │ ├── 2606cbaa1a2e606a3640cc1825f5605b.png │ │ │ ├── 57b0d1814567e6317c8de1e3c04b7503.png │ │ │ ├── 5fa90e123c68855140e2b40f4f73c56f.png │ │ │ ├── 615b49f9d13de718a34b9b98359066e3.png │ │ │ ├── 688630945be2dd51ca62515ae498db33.png │ │ │ ├── 769dcf953ddafc4573a0b4c3f0321f0c.png │ │ │ ├── 83c9f0ecad361ba8ef8f3b73d6872f1a.png │ │ │ ├── 8903a45c632b64c220299d5bc64ef717.png │ │ │ ├── 8fe2cbd57410299a1a36d7eb105ea896.png │ │ │ ├── 9ab3858bf918dffafa275c400d78d910.png │ │ │ ├── ae0c482ea0c3b8ebc71924b19feb9b3b.png │ │ │ ├── b49595a5a425c0e67d46ee17cc212e7e.png │ │ │ ├── d263202e431c84db0fd6c7e6b1980f03.png │ │ │ ├── d389ac436d8100406a4a488a69563cb4.png │ │ │ ├── d8f8606948bbd63c31466e464c1956b0.png │ │ │ ├── d8fd32a4d044f2078b3a260e4478c5bc.png │ │ │ ├── fd99221ede55272a998760cc6aaa037a.png │ │ │ ├── fdf1a6916c3ac22b6fb7628de3d7ddd1.png │ │ │ ├── image-20210312192121396.png │ │ │ ├── image-20210312192422763.png │ │ │ ├── image-20210312192806844.png │ │ │ └── image-20210312193750452.png │ ├── 07 │ │ ├── 01.md │ │ ├── 02.md │ │ ├── 03.md │ │ ├── 04.md │ │ ├── 05.md │ │ ├── README.md │ │ └── assets │ │ │ ├── 29d33e972dda5a27aa4773eea896a8c4.png │ │ │ ├── 3689312a970bae0e949b017ad45438df.png │ │ │ ├── 3e94fbd78ed043e88c443f6416f99dc1.png │ │ │ ├── 41318c867fda8a536d0e3db6f9987030.png │ │ │ ├── 413605355db69278cb137b318b70b3b9.png │ │ │ ├── 46d1dbbb545fcf3cfb53407e0afe9a5b.png │ │ │ ├── 4c6832cdce34133c9ed89237fb9d5059.png │ │ │ ├── 4f24aa3f53969b71baaf7d9c7cf68fd5.png │ │ │ ├── 6c39e76d58d9f17872c83ae72908faca.png │ │ │ ├── 84e9fa337f2b4c2c9f14760feb41c903.png │ │ │ ├── 8f007bb0e403b6cc28493565f709c997.png │ │ │ ├── 9f7b79c43c476890f03c2c716a20f301.png │ │ │ ├── 9fc3df52df7d6c11aa02b8013f8e9bc6.png │ │ │ ├── add929f8439c64f29db720d30f7de548.png │ │ │ ├── c5df0592cc8aef91ba961f7fab5a4a0b.png │ │ │ ├── c91ee4815097f5f9059ab798bb841594.png │ │ │ ├── e8369d077454e5b92e3722e7090551a3.png │ │ │ └── ee6685c7d3c673b95e46d582828eee28.png │ ├── 08 │ │ ├── README.md │ │ └── assets │ │ │ ├── 3a8ab1e3ace62d184adc2dc595d32f62.png │ │ │ ├── 5011b2998d2a0c58c87e31000d551732.png │ │ │ ├── 5cd2a91b4466ee63f48bc049ba61b9f4.png │ │ │ └── d77ee484b62910b8eedce0ecddb305a2.png │ ├── 09.md │ ├── README.md │ └── index.js └── monitor-tuning │ ├── 00.md │ ├── 01 │ ├── 01.md │ ├── 02.md │ ├── 03.md │ ├── 04.md │ ├── 05.md │ ├── README.md │ └── assets │ │ ├── 640.png │ │ ├── image-20210116223917540.png │ │ ├── image-20210117115238694.png │ │ ├── image-20210117131339185.png │ │ ├── image-20210117132304567.png │ │ ├── image-20210117134007388.png │ │ ├── image-20210117134137828.png │ │ ├── image-20210117135326331.png │ │ ├── image-20210117140732191.png │ │ ├── image-20210117141354222.png │ │ ├── image-20210117141644864.png │ │ ├── image-20210117142021701.png │ │ ├── image-20210117142252417.png │ │ ├── image-20210117143023843.png │ │ └── image-20210117181557059.png │ ├── 02 │ ├── 01.md │ ├── 02.md │ ├── README.md │ └── assets │ │ ├── image-20210117210523984.png │ │ ├── image-20210117211938381.png │ │ ├── image-20210117215032826.png │ │ ├── image-20210117215231403.png │ │ ├── image-20210117215523473.png │ │ ├── image-20210117215848221.png │ │ ├── image-20210117220016498.png │ │ ├── image-20210117220446231.png │ │ ├── image-20210117221101215.png │ │ ├── image-20210117221114887.png │ │ ├── image-20210117221823485.png │ │ ├── image-20210117223134434.png │ │ ├── image-20210117223157306.png │ │ ├── image-20210117223254593.png │ │ ├── image-20210117231350994.png │ │ └── image-20210117232009897.png │ ├── 03 │ ├── 01.md │ ├── 02.md │ ├── README.md │ └── assets │ │ └── image-20210125114833479.png │ ├── 04 │ ├── 01.md │ ├── 02.md │ ├── 03.md │ ├── 04.md │ ├── README.md │ └── assets │ │ ├── image-20210125194927728.png │ │ ├── image-20210125214202463.png │ │ ├── image-20210125214524106.png │ │ └── image-20210125221436472.png │ ├── 05 │ ├── 01.md │ ├── 02.md │ ├── 03.md │ ├── 04.md │ └── README.md │ ├── 06 │ ├── 01.md │ ├── 02.md │ ├── 03.md │ ├── 04.md │ ├── 05.md │ ├── README.md │ └── assets │ │ ├── image-20210128185758372.png │ │ ├── image-20210128193827100.png │ │ ├── image-20210130221129447.png │ │ ├── image-20210202221029440.png │ │ ├── image-20210207150551614.png │ │ ├── image-20210207150813253.png │ │ ├── image-20210207151320765.png │ │ └── jsgct_dt_004_grbg_frst_hp.png │ ├── 07 │ ├── 01.md │ ├── 02.md │ ├── 03.md │ ├── README.md │ └── assets │ │ ├── image-20210207174523696.png │ │ ├── image-20210207174547162.png │ │ ├── image-20210207174628514.png │ │ ├── image-20210207174722054.png │ │ ├── image-20210207174747794.png │ │ └── image-20210207174830081.png │ ├── README.md │ └── index.js ├── package.json └── yarn.lock /.github/workflows/blank.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | # 控制如何触发事件,这里针对 master 分支 4 | on: 5 | push: 6 | branches: [ master ] 7 | pull_request: 8 | branches: [ master ] 9 | 10 | # 一个工作流运行是由一个或多个作业组成的,这些作业可以连续或并行运行。 11 | jobs: 12 | # 该工作流包含一个名为 "build " 的单一工作。 13 | build: 14 | # 工作要运行的运行器类型。 15 | runs-on: ubuntu-latest 16 | 17 | # 步骤代表了作为工作的一部分将要执行的任务序列 18 | steps: 19 | # 签出你在 $GITHUB_WORKSPACE 下的仓库,这样你的工作就可以访问它。 20 | - uses: actions/checkout@v2 21 | 22 | # 缓存 yarn 的依赖? 23 | - name: Get yarn cache directory path 24 | id: yarn-cache-dir-path 25 | run: echo "::set-output name=dir::$(yarn cache dir)" 26 | 27 | - uses: actions/cache@v2 28 | id: yarn-cache # use this to check for `cache-hit` aac(`steps.yarn-cache.outputs.cache-hit != 'true'`) 29 | with: 30 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 31 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} 32 | restore-keys: | 33 | ${{ runner.os }}-yarn- 34 | 35 | - name: yarn run docs:build 36 | run: yarn install && yarn run docs:build 37 | - name: Deploy 38 | uses: peaceiris/actions-gh-pages@v3 39 | with: 40 | github_token: ${{ secrets.GITHUB_TOKEN }} 41 | publish_dir: ./build/.vuepress/dist 42 | 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | build/ 5 | npm-debug.log* 6 | yarn-debug.log* 7 | yarn-error.log* 8 | .idea 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | logo 4 | 5 |
6 |
7 | 8 | 所有笔记 → 系列导航 9 | 10 |

11 | 12 | # note-book2 13 | 14 | 用来记录工作和学习过程中的笔记,汇总成册方便查阅,类容涵盖各类技术 15 | 16 | 主要定位:暂没有那么多的同类型知识点,一个大杂烩仓库,一般都是系统学习某一个知识点的笔记仓库。 17 | 18 | 在线阅读: 19 | 20 | - [note-book](https://zq99299.github.io/note-book/) : 主仓 21 | - [note-book2](https://zq99299.github.io/note-book2/) : 第 2 分仓(本笔记) 22 | 23 | note-book 笔记太多,vuepress 构建吃力,分开写了 24 | 25 | ## 运行方式 26 | 27 | - 写作预览: 28 | 29 | yarn docs:dev 30 | - 打包发布: 31 | 32 | yarn docs:build 33 | -------------------------------------------------------------------------------- /docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | const monitorTuningSc = require('../monitor-tuning') 2 | const httpProtocolSc = require('../http-protocol') 3 | const dddSc = require('../ddd') 4 | 5 | module.exports = { 6 | // ~ 开发配置 7 | dest: 'build/.vuepress/dist', // 目录配置在外,纯粹是有代码洁癖和强迫症,并不能规避开发模式下同时构建不报错的问题 8 | host: 'localhost', // dev 的域名 9 | port: 8080, 10 | 11 | // ~ 站点配置 12 | title: 'NOTE-BOOK2', 13 | description: 'note-book 的第二分仓笔记仓库', 14 | base: '/note-book2/', // gh-page 中是增加了项目名 15 | markdown: { 16 | lineNumbers: true 17 | }, 18 | head: [ 19 | ['link', { rel: 'icon', href: '/favicon.ico' }], 20 | ['link', { rel: 'manifest', href: '/manifest.json' }], 21 | ], 22 | // theme: 'vue', 23 | themeConfig: { 24 | docsDir: 'docs', 25 | sidebar: 'auto', 26 | sidebarDepth: 3, // 嵌套标题侧边栏提取深度,最大为 2,会提取到 h3 27 | smoothScroll: true, 28 | lastUpdated: '上次更新', // string | boolean 29 | // 假定是 GitHub. 同时也可以是一个完整的 GitLab URL 30 | repo: 'https://github.com/zq99299/note-book2', 31 | // 自定义仓库链接文字。默认从 `themeConfig.repo` 中自动推断为 32 | // "GitHub"/"GitLab"/"Bitbucket" 其中之一,或是 "Source"。 33 | repoLabel: 'GitHub', 34 | // 以下为可选的编辑链接选项 35 | // 假如你的文档仓库和项目本身不在一个仓库: 36 | // docsRepo: 'vuejs/vuepress', 37 | // 假如文档不是放在仓库的根目录下: 38 | docsDir: 'docs', 39 | // 假如文档放在一个特定的分支下: 40 | docsBranch: 'man', 41 | // 默认是 false, 设置为 true 来启用 42 | editLinks: true, 43 | // 默认为 "Edit this page" 44 | editLinkText: '帮助我们改善此页面!', 45 | logo: '/mlogo.svg', 46 | // 主题级别的配置 47 | serviceWorker: { 48 | updatePopup: true 49 | }, 50 | nav: [ 51 | { text: 'JAVA 生产环境下性能监控与调优详解', link: '/monitor-tuning/' }, 52 | { text: '透视 HTTP 协议', link: '/http-protocol/' }, 53 | { text: 'DDD 实战课', link: '/ddd/' } 54 | ], 55 | sidebar: { 56 | '/monitor-tuning/': monitorTuningSc(), 57 | '/http-protocol/': httpProtocolSc(), 58 | '/ddd/': dddSc(), 59 | } 60 | }, 61 | plugins: [ 62 | ['@vuepress/back-to-top', true], 63 | ['@vuepress/pwa', { 64 | serviceWorker: true, 65 | updatePopup: { 66 | message: '有新内容更新啦~', 67 | buttonText: '立即获取新内容,确定后稍后自动刷新' 68 | } 69 | }], 70 | ['@vuepress/medium-zoom', { 71 | selector: '.theme-default-content img' 72 | }], 73 | ['@vuepress/search', { 74 | searchMaxSuggestions: 10 75 | }], 76 | ['vuepress-plugin-code-copy', true], 77 | ['@vuepress/last-updated', { 78 | transformer: (timestamp, lang) => { 79 | // 不要忘了安装 moment 80 | const moment = require('moment') 81 | return moment(timestamp).format('YYYY-MM-DD HH:mm:ss') 82 | } 83 | }], 84 | ['vuepress-plugin-tags'], 85 | ['vuepress-plugin-baidu-autopush', true] 86 | ] 87 | } 88 | -------------------------------------------------------------------------------- /docs/.vuepress/enhanceApp.js: -------------------------------------------------------------------------------- 1 | import './styles/fonts/index.styl' -------------------------------------------------------------------------------- /docs/.vuepress/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/public/favicon.ico -------------------------------------------------------------------------------- /docs/.vuepress/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "NOTE-BOOK2", 3 | "short_name": "MRCODE", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#fff", 7 | "description": "note-book 的第二分仓笔记仓库", 8 | "icons": [ 9 | { 10 | "src": "mlogo.svg", 11 | "sizes": "48x48", 12 | "type": "image/svg+xml" 13 | }, 14 | { 15 | "src": "mlogo.svg", 16 | "sizes": "100x100", 17 | "type": "image/svg+xml" 18 | }, 19 | { 20 | "src": "mlogo.svg", 21 | "sizes": "200x200", 22 | "type": "image/svg+xml" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /docs/.vuepress/public/mlogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 33 | 35 | 37 | 40 | 43 | 45 | 47 | 49 | 50 | -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/DFPKingGothicGB-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/DFPKingGothicGB-Light.ttf -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold-Italic.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold-Italic.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Italic.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium-Italic.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/.vuepress/styles/fonts/JetBrainsMono-1.0.3/woff2/JetBrainsMono-Regular.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/styles/fonts/index.styl: -------------------------------------------------------------------------------- 1 | @font-face 2 | { 3 | font-family: "JetBrains Mono"; 4 | src: url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold.woff2), 5 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Bold-Italic.woff2), 6 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold.woff2), 7 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-ExtraBold-Italic.woff2), 8 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Italic.woff2), 9 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium.woff2), 10 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Medium-Italic.woff2), 11 | url(./JetBrainsMono-1.0.3/woff2/JetBrainsMono-Regular.woff2); 12 | } 13 | 14 | //@font-face 15 | //{ 16 | // font-family: DFPKingGothicGB-Light; 17 | // src: url(./DFPKingGothicGB-Light.ttf); 18 | //} -------------------------------------------------------------------------------- /docs/.vuepress/styles/index.styl: -------------------------------------------------------------------------------- 1 | @media (min-width: 1024px) { 2 | .page { 3 | .theme-default-content, .page-edit, .page-nav { 4 | max-width 740px !important 5 | } 6 | } 7 | } 8 | 9 | /*>=1024的设备*/ 10 | @media (min-width: 1100px) { 11 | .page { 12 | .theme-default-content, .page-edit, .page-nav { 13 | max-width 740px !important 14 | } 15 | } 16 | } 17 | 18 | /*>=1100的设备*/ 19 | @media (min-width: 1280px) { 20 | .page { 21 | .theme-default-content, .page-edit, .page-nav { 22 | max-width 880px !important 23 | } 24 | } 25 | } 26 | 27 | /*>=1280的设备*/ 28 | @media (min-width: 1366px) { 29 | .page { 30 | .theme-default-content, .page-edit, .page-nav { 31 | max-width 966px !important 32 | } 33 | } 34 | } 35 | 36 | @media (min-width: 1440px) { 37 | .page { 38 | .theme-default-content, .page-edit, .page-nav { 39 | max-width 1000px !important 40 | } 41 | } 42 | } 43 | 44 | @media (min-width: 1680px) { 45 | .page { 46 | .theme-default-content, .page-edit, .page-nav { 47 | // max-width 1380px!important 48 | max-width 1000px !important 49 | } 50 | } 51 | } 52 | 53 | @media (min-width: 1920px) { 54 | .page { 55 | .theme-default-content, .page-edit, .page-nav { 56 | // max-width 1420px!important 57 | max-width 1000px !important 58 | } 59 | } 60 | } 61 | 62 | body { 63 | //font-family: "JetBrains Mono", "DFPKingGothicGB-Light", -apple-system, "Hiragino Sans GB", "MicroSoft YaHei", BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 64 | font-family: "JetBrains Mono", -apple-system, "Hiragino Sans GB", "MicroSoft YaHei", BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 65 | //color: rgba(0, 0, 0, .65); 66 | color: #333 67 | font-size 16px 68 | line-height: 1.7em; 69 | font-weight: 400; 70 | font-feature-settings: "tnum"; 71 | font-variant: tabular-nums; 72 | } 73 | 74 | .feature p, .page p, ol, ul, li { 75 | word-break: break-all; 76 | text-align: justify; 77 | font-weight: 400; 78 | letter-spacing: 1.6px; 79 | } 80 | 81 | ol, p, ul { 82 | line-height: 1.7em; 83 | } 84 | 85 | code { 86 | font-family: 'JetBrains Mono'; 87 | } 88 | 89 | // 侧边栏 root 间隔变小,字体变小 90 | .sidebar > .sidebar-links > li:not(:first-child) { 91 | margin-top: 0.0rem !important 92 | } 93 | 94 | .sidebar > .sidebar-links > li > a.sidebar-link { 95 | font-size: 1em !important; 96 | line-height: 1.5 !important; 97 | font-weight: normal !important; 98 | } 99 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | heroImage: mlogo.svg 3 | home: true 4 | actionText: JAVA 生产环境下性能监控与调优详解 → 5 | actionLink: /monitor-tuning/ 6 | features: 7 | - title: 持续学习 8 | details: 每天至少一小时学习,才是真的靠谱 9 | - title: 边学边记 10 | details: 学习过程中记录笔记,防止忘记。 11 | - title: 知识库 12 | details: 积少成多,串联知识,方便翻阅 13 | footer: MIT Licensed | Copyright © mrcode.cn 14 | --- 15 | -------------------------------------------------------------------------------- /docs/ddd/00/README.md: -------------------------------------------------------------------------------- 1 | # 开篇 | 学好了 DDD,你能做什么? 2 | 3 | 你好,我是欧创新,人保高级架构师,一名奋斗在软件架构一线十余年的技术人。 4 | 5 | 目前热衷于采用领域驱动设计(DDD)实现中台业务建模,专注基于 DDD 的微服务设计和开发等。另外,我也正在深入探索传统企业中台数字化转型的技术和方法体系。 6 | 7 | ## 我与 DDD 8 | 9 | 说起 DDD 的实践,那就不得不提微服务了。2015 年,我刚开始接触微服务,那时候和别人去介绍微服务的设计理念,接受度并不高,毕竟大家普遍采用的还是集中式架构。 10 | 11 | 但即便是在四年前,业务的日渐复杂也是可以预见的,微服务的价值确确实实存在。我就从那个时候开始深入研究,作为公司的高级架构师,我也一直处于公司中台转型和微服务建设的一线。 12 | 13 | 这个过程中,我和我的技术团队踩过不少坑,最尖锐的一个问题是:**微服务到底怎么拆分和设计才算合理,拆多小才叫微服务?** 而微服务的边界历来也是最容易产生争议的地方。 14 | 15 | 紧接着,阿里巴巴成功完成了中台战略转型。于是,很多大型公司也开启了中台数字化战略转型,中型公司也根据自身需求跃跃欲试。但也有很多公司由于历史原因,存在着大量系统重复建设的问题。 16 | 17 | 作为中台,需要将通用的可复用的业务能力沉淀到中台业务模型,实现企业级能力复用。因此中台面临的首要问题就是中台领域模型的重构。而中台落地时,**依然会面临微服务设计和拆分的问题** 。这两个问题一前一后,放在任何一家公司,我想都是一个不小的挑战。 18 | 19 | 这也是我一直在探索和解决的问题。这两年,中台越来越火,微服务越来越热,参与的人越来越多。那是否有好的方法来指导中台和微服务的设计呢? 20 | 21 | 一次偶然的机会我接触到了 DDD,深入研究后,我发现,运用 DDD 设计思想实现的微服务边界确实清晰很多,业务领域划分也十分合理。后来,我和我的伙伴们用 DDD 做了很多的微服务实践。 22 | 23 | ## 关于专栏 24 | 25 | 有了这样一个基础,我开始尝试将我对 DDD 的理解和一些实践经验沉淀,并写了几篇文章发表在了 [InfoQ](https://www.infoq.cn/article/s_LFUlU6ZQODd030RbH9) 上。在读者的留言中,我发现很多人对 DDD 是有一定的了解的,但由于 DDD 的知识点多且较为抽象,体系庞大,又缺少实践经验和案例指导,很多人对 DDD 的应用都有这样那样的困惑,哪怕知道 DDD 的好处,但是也感到无从下手。 26 | 27 | DDD 虽然历史很久了,但它与微服务和中台设计的结合,却是一片很新的领域。早在 2003 年就诞生的 DDD,怎么来指导迟到近 20 年才大热的微服务设计呢? 28 | 29 | 我认为,要想应用 DDD,首要任务就是要吃透 DDD 的核心设计思想,搞清楚 DDD、微服务和中台之间的关系 。 30 | 31 | - 中台本质是业务模型, 32 | - 微服务是业务模型的系统落地, 33 | - DDD 是一种设计思想,它可以同时指导中台业务建模和微服务设计 34 | 35 | 它们之间就是这样的一个铁三角关系。**DDD 强调领域模型和微服务设计的一体性,先有领域模型然后才有微服务,而不是脱离领域模型来谈微服务设计** 。 36 | 37 | 其次,就是通过战略设计,建立领域模型,划分微服务边界。这步是关键,你可以借助专栏中的一些经验。 38 | 39 | 最后,通过战术设计,我们会从领域模型转向微服务设计和落地。此时,边界清晰、可持续演进的微服务架构雏形就在你面前了。 40 | 41 | 遵循以上过程,这门课的设计思路也就诞生了。 42 | 43 | ## 关于课程设计 44 | 45 | 如果你以往对 DDD 的了解并不深入,甚至是第一次接触,你一定会觉得 DDD 的术语非常多,且非常陌生,这些术语之间的关系都算是个拦路虎。 46 | 47 | 搞懂这些之后呢,怎么应用它们,从何下手来设计领域模型等等这些问题又接踵而至。 48 | 49 | 如果你对 DDD 有过研究,在学会怎么用之后,你可能还会反过来想:我费了这么大劲儿去搞懂它,那它到底会让我的系统变成什么样呢?可以解决什么具体问题?是不是真有大家说得那么好? 50 | 51 | 这些都将是这个专栏要交付给你的内容。总结一下的话,我希望这个专栏能带给你这样几点收获: 52 | 53 | 1. 用浅显易懂的案例带你了解 DDD 必知必会的 10 大核心概念,深入设计思想,厘清各知识域之间的关系; 54 | 2. 用 DDD 分层架构带你弄懂微服务架构各层之间的关系,并完成微服务分层和代码模型设计; 55 | 3. 用 DDD 战略设计和事件风暴带你完成领域建模和企业级中台业务建模; 56 | 4. 用一个典型的案例带你完整走一遍 DDD 战略设计和战术设计的全流程,学习 DDD 在领域模型和微服务设计过程中的技术要点; 57 | 5. 带你深化微服务架构设计原则和注意事项,建立适应你公司技术能力和文化的微服务,建立演进式的微服务架构。 58 | 59 | 希望这些收获能够给正在从事或者有兴趣深入了解微服务设计和中台的你,提供一些实质性的帮助。 60 | 61 | 在具体的课程设计上,我将内容分为了三大部分:基础篇、进阶篇和实战篇。下面我来逐一介绍一下。 62 | 63 | ### 基础篇 64 | 65 | 基础篇主要讲解 DDD 的核心知识体系,具体包括:领域、子域、核心域、通用域、支撑域、限界上下文、实体、值对象、聚合和聚合根等概念。我会用浅显易懂的案例带你理解它们以及它们之间的合作、依赖关系。 66 | 67 | ![img](./assets/dc32e8e4a317fe00121ce18adc407c66.jpg) 68 | 69 | ### 进阶篇 70 | 71 | 进阶篇主要讲解领域事件、DDD 分层架构、几种常见的微服务架构模型以及中台设计思想等内容。具体包括: 72 | 73 | - 如何通过领域事件实现微服务解耦? 74 | - 怎样进行微服务分层设计? 75 | - 如何实现层与层之间的服务协作? 76 | - 通过几种微服务架构模型的对比分析,让你了解领域模型和微服务分层的作用和价值。 77 | - 另外,我还会介绍中台设计的核心思想,和你探讨如何实现前中后台的协同和融合?如何利用 DDD 进行中台设计? 78 | 79 | ### 实战篇 80 | 81 | 实战篇是我们专栏课程的重点,我准备了多个实战小项目。 82 | 83 | - 中台和领域建模的实战:带你了解如何用 DDD 设计思想构建企业级可复用的中台业务模型,了解事件风暴以及用事件风暴构建领域模型的过程。 84 | - 微服务设计实战:带你了解如何用 DDD 设计微服务代码模型,如何从领域模型完成微服务设计,建立领域模型与微服务代码模型的映射关系,如何完成微服务的架构演进等。 85 | 86 | 然后我会用一个典型的案例将 DDD 所有的知识点串联在一起,带你深入了解如何用 DDD 的设计思想来完成领域建模和微服务设计的全流程。 87 | 88 | 最后,我还会补充分享一个前端的最新设计思想,带你了解如何借鉴微服务的设计思想来设计前端应用,实现前端应用的解耦。同时,我还为你总结了微服务设计原则以及分布式架构设计的关键注意事项。 89 | 90 | 最后,我想说,DDD 看似复杂,可学习起来并不困难,多动手参与几次 DDD 事件风暴工作坊,你就能很快理解 DDD 的核心设计思想和设计过程,成功进阶了。 91 | 92 | 如果你的公司尚不能给你提供实战的机会,你可以在这里小试牛刀。 93 | 94 | 相信这个专栏会帮助你掌握一套完整而系统的基于 DDD 的微服务设计和拆分方法,明确从战略设计到战术设计的微服务标准设计过程,使得你的微服务设计思路能够更加清晰,设计过程更加规范,让你的中台和微服务落地如虎添翼。 95 | -------------------------------------------------------------------------------- /docs/ddd/00/assets/dc32e8e4a317fe00121ce18adc407c66.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/00/assets/dc32e8e4a317fe00121ce18adc407c66.jpg -------------------------------------------------------------------------------- /docs/ddd/01/05.md: -------------------------------------------------------------------------------- 1 | # 05 | 聚合和聚合根:怎样设计聚合? 2 | 3 | 我们先回顾下上一讲,在事件风暴中,我们会根据一些业务操作和行为找出实体(Entity)或值对象(ValueObject),进而将业务关联紧密的实体和值对象进行组合,构成聚合,再根据业务语义将多个聚合划定到同一个限界上下文(Bounded Context)中,并在限界上下文内完成领域建模。 4 | 5 | 那你知道为什么要在限界上下文和实体之间增加聚合和聚合根这两个概念吗?它们的作用是什么?怎么设计聚合?这就是我们这一讲重点要关注的问题。 6 | 7 | ## 聚合 8 | 9 | 在 DDD 中,实体和值对象是很基础的领域对象。实体一般对应业务对象,它具有业务属性和业务行为;而值对象主要是属性集合,对实体的状态和特征进行描述。但实体和值对象都只是个体化的对象,它们的行为表现出来的是个体的能力。 10 | 11 | **那聚合在其中起什么作用呢?** 12 | 13 | 举个例子。社会是由一个个的个体组成的,象征着我们每一个人。随着社会的发展,慢慢出现了社团、机构、部门等组织,我们开始从个人变成了组织的一员,大家可以协同一致的工作,朝着一个最大的目标前进,发挥出更大的力量。 14 | 15 | 领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。 16 | 17 | 你可以这么理解,聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。 18 | 19 | 聚合有一个聚合根和上下文边界,这个边界根据业务单一职责和高内聚原则,定义了聚合内部应该包含哪些实体和值对象,而聚合之间的边界是松耦合的。按照这种方式设计出来的微服务很自然就是“高内聚、低耦合”的。 20 | 21 | 聚合在 DDD 分层架构里属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑。聚合内实体以充血模型实现个体业务能力,以及业务逻辑的高内聚。跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现。比如有的业务场景需要同一个聚合的 A 和 B 两个实体来共同完成,我们就可以将这段业务逻辑用领域服务来实现;而有的业务逻辑需要聚合 C 和聚合 D 中的两个服务共同完成,这时你就可以用应用服务来组合这两个服务。 22 | 23 | ## 聚合根 24 | 25 | 聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题。 26 | 27 | 传统数据模型中的每一个实体都是对等的,如果任由实体进行无控制地调用和数据修改,很可能会导致实体之间数据逻辑的不一致。而如果采用锁的方式则会增加软件的复杂度,也会降低系统的性能。 28 | 29 | 如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。 30 | 31 | 首先它作为实体本身,拥有实体的属性和业务行为,实现自身的业务逻辑。 32 | 33 | 其次它作为聚合的管理者,在聚合内部负责协调实体和值对象按照固定的业务规则协同完成共同的业务逻辑。 34 | 35 | 最后在聚合之间,它还是聚合对外的接口人,以聚合根 ID 关联的方式接受外部任务和请求,在上下文内实现聚合之间的业务协同。也就是说,聚合之间通过聚合根 ID 关联引用,如果需要访问其它聚合的实体,就要先访问聚合根,再导航到聚合内部实体,外部对象不能直接访问聚合内实体。 36 | 37 | ## 怎样设计聚合? 38 | 39 | DDD 领域建模通常采用事件风暴,它通常采用用例分析、场景分析和用户旅程分析等方法,通过头脑风暴列出所有可能的业务行为和事件,然后找出产生这些行为的领域对象,并梳理领域对象之间的关系,找出聚合根,找出与聚合根业务紧密关联的实体和值对象,再将聚合根、实体和值对象组合,构建聚合。 40 | 41 | 下面我们以保险的投保业务场景为例,看一下聚合的构建过程主要都包括哪些步骤。 42 | 43 | ![img](./assets/ac0b9db12b201f24c7b2c1e343a88e26.png) 44 | 45 | **第 1 步:**采用事件风暴,根据业务行为,梳理出在投保过程中发生这些行为的所有的实体和值对象,比如投保单、标的、客户、被保人等等。 46 | 47 | **第 2 步:**从众多实体中选出适合作为对象管理者的根实体,也就是聚合根。判断一个实体是否是聚合根,你可以结合以下场景分析:是否有独立的生命周期?是否有全局唯一 ID?是否可以创建或修改其它对象?是否有专门的模块来管这个实体。图中的聚合根分别是投保单和客户实体。 48 | 49 | **第 3 步:**根据业务单一职责和高内聚原则,找出与聚合根关联的所有紧密依赖的实体和值对象。构建出 1 个包含聚合根(唯一)、多个实体和值对象的对象集合,这个集合就是聚合。在图中我们构建了客户和投保这两个聚合。 50 | 51 | **第 4 步:**在聚合内根据聚合根、实体和值对象的依赖关系,画出对象的引用和依赖模型。这里我需要说明一下:投保人和被保人的数据,是通过关联客户 ID 从客户聚合中获取的,在投保聚合里它们是投保单的值对象,这些值对象的数据是客户的冗余数据,即使未来客户聚合的数据发生了变更,也不会影响投保单的值对象数据。从图中我们还可以看出实体之间的引用关系,比如在投保聚合里投保单聚合根引用了报价单实体,报价单实体则引用了报价规则子实体。 52 | 53 | **第 5 步:**多个聚合根据业务语义和上下文一起划分到同一个限界上下文内。 54 | 55 | 这就是一个聚合诞生的完整过程了。 56 | 57 | ## 聚合的一些设计原则 58 | 59 | 我们不妨先看一下《实现领域驱动设计》一书中对聚合设计原则的描述,原文是有点不太好理解的,我来给你解释一下。 60 | 61 | **1. 在一致性边界内建模真正的不变条件。**聚合用来封装真正的不变性,而不是简单地将对象组合在一起。聚合内有一套不变的业务规则,各实体和值对象按照统一的业务规则运行,实现对象数据的一致性,边界之外的任何东西都与该聚合无关,这就是聚合能实现业务高内聚的原因。 62 | 63 | **2. 设计小聚合。**如果聚合设计得过大,聚合会因为包含过多的实体,导致实体之间的管理过于复杂,高频操作时会出现并发冲突或者数据库锁,最终导致系统可用性变差。而小聚合设计则可以降低由于业务过大导致聚合重构的可能性,让领域模型更能适应业务的变化。 64 | 65 | **3. 通过唯一标识引用其它聚合。**聚合之间是通过关联外部聚合根 ID 的方式引用,而不是直接对象引用的方式。外部聚合的对象放在聚合边界内管理,容易导致聚合的边界不清晰,也会增加聚合之间的耦合度。 66 | 67 | **4. 在边界之外使用最终一致性。**聚合内数据强一致性,而聚合之间数据最终一致性。在一次事务中,最多只能更改一个聚合的状态。如果一次业务操作涉及多个聚合状态的更改,应采用领域事件的方式异步修改相关的聚合,实现聚合之间的解耦(相关内容我会在领域事件部分详解)。 68 | 69 | **5. 通过应用层实现跨聚合的服务调用。**为实现微服务内聚合之间的解耦,以及未来以聚合为单位的微服务组合和拆分,应避免跨聚合的领域服务调用和跨聚合的数据库表关联。 70 | 71 | 上面的这些原则是 DDD 的一些通用的设计原则,还是那句话:“适合自己的才是最好的。”在系统设计过程时,你一定要考虑项目的具体情况,如果面临使用的便利性、高性能要求、技术能力缺失和全局事务管理等影响因素,这些原则也并不是不能突破的,总之一切以解决实际问题为出发点。 72 | 73 | ## 总结 74 | 75 | 前一章节和本章,其实是有强关联的。我们不妨在这里总结下聚合、聚合根、实体和值对象它们之间的联系和区别。 76 | 77 | **聚合的特点:**高内聚、低耦合,它是领域模型中最底层的边界,可以作为拆分微服务的最小单位,但我不建议你对微服务过度拆分。但在对性能有极致要求的场景中,聚合可以独立作为一个微服务,以满足版本的高频发布和极致的弹性伸缩能力。 78 | 79 | 一个微服务可以包含多个聚合,聚合之间的边界是微服务内天然的逻辑边界。有了这个逻辑边界,在微服务架构演进时就可以以聚合为单位进行拆分和组合了,微服务的架构演进也就不再是一件难事了。 80 | 81 | **聚合根的特点:**聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期。一个聚合只有一个聚合根,聚合根在聚合内对实体和值对象采用直接对象引用的方式进行组织和协调,聚合根与聚合根之间通过 ID 关联的方式实现聚合之间的协同。 82 | 83 | **实体的特点:**有 ID 标识,通过 ID 判断相等性,ID 在聚合内唯一即可。状态可变,它依附于聚合根,其生命周期由聚合根管理。实体一般会持久化,但与数据库持久化对象不一定是一对一的关系。实体可以引用聚合内的聚合根、实体和值对象。 84 | 85 | **值对象的特点:**无 ID,不可变,无生命周期,用完即扔。值对象之间通过属性值判断相等性。它的核心本质是值,是一组概念完整的属性组成的集合,用于描述实体的状态和特征。值对象尽量只引用值对象。 86 | 87 | ## 思考题 88 | 89 | 请你结合公司的某个业务场景,试试能分析出哪些聚合? -------------------------------------------------------------------------------- /docs/ddd/01/README.md: -------------------------------------------------------------------------------- 1 | # 基础篇 2 | 3 | - [01 | 领域驱动设计:微服务设计为什么要选择 DDD?](./01.md) 4 | - [02 | 领域、子域、核心域、通用域和支撑域:傻傻分不清?](./02.md) 5 | - [03 | 限界上下文:定义领域边界的利器](./03.md) 6 | - [04 | 实体和值对象:从领域模型的基础单元看系统设计](./04.md) 7 | - [05 | 聚合和聚合根:怎样设计聚合?](./05.md) 8 | -------------------------------------------------------------------------------- /docs/ddd/01/assets/09ca1ccc982d02634a856b2e80cf24b8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/09ca1ccc982d02634a856b2e80cf24b8.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/136512ac4c65b3f2ed4b2898b40965f6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/136512ac4c65b3f2ed4b2898b40965f6.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/323c8aca1271cc043558dfd1f95f57fa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/323c8aca1271cc043558dfd1f95f57fa.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/3bb8915fd6e880d64e9029a1f8677473.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/3bb8915fd6e880d64e9029a1f8677473.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/4c26f42d035da0cd5cbe1f25c48c205b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/4c26f42d035da0cd5cbe1f25c48c205b.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/69f44e120de5019c0fbff4d3fbc0afee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/69f44e120de5019c0fbff4d3fbc0afee.png -------------------------------------------------------------------------------- /docs/ddd/01/assets/8a859915250ffcab04675fb02fdf34f8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/8a859915250ffcab04675fb02fdf34f8.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/96253ac8bd1d93a2786b59d7b9c2c423.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/96253ac8bd1d93a2786b59d7b9c2c423.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/ac0b9db12b201f24c7b2c1e343a88e26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/ac0b9db12b201f24c7b2c1e343a88e26.png -------------------------------------------------------------------------------- /docs/ddd/01/assets/c597d53a1a1aeca274d355e8ac79cc1b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/c597d53a1a1aeca274d355e8ac79cc1b.jpg -------------------------------------------------------------------------------- /docs/ddd/01/assets/c99d4ef4fe28f483938e4fa03afb98c3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/01/assets/c99d4ef4fe28f483938e4fa03afb98c3.jpg -------------------------------------------------------------------------------- /docs/ddd/02/05.md: -------------------------------------------------------------------------------- 1 | # 10 | DDD、中台和微服务:它们是如何协作的? 2 | 3 | DDD 和微服务来源于西方,而中台诞生于中国的阿里巴巴。DDD 在二十多年前提出后一直默默前行,中台和微服务的理念近几年才出现,提出后就非常火爆。这三者看似风马牛不相及,实则缘分匪浅。中台是抽象出来的业务模型,微服务是业务模型的系统实现,DDD 作为方法论可以同时指导中台业务建模和微服务建设,三者相辅相成,完美结合。 4 | 5 | 你可能会问:凭什么 DDD 可以指导中台和微服务建设,究竟起到了什么作用呢? 6 | 7 | DDD 有两把利器,那就是它的战略设计和战术设计方法。 8 | 9 | 中台在企业架构上更多偏向业务模型,形成中台的过程实际上也是业务领域不断细分的过程。在这个过程中我们会将同类通用的业务能力进行聚合和业务重构,再根据限界上下文和业务内聚的原则建立领域模型。而 DDD 的战略设计最擅长的就是领域建模。 10 | 11 | 那在中台完成领域建模后,我们就需要通过微服务来完成系统建设。此时,DDD 的战术设计又恰好可以与微服务的设计完美结合。可以说,中台和微服务正是 DDD 实战的最佳场景。 12 | 13 | ## DDD 的本质 14 | 15 | 我们先简单回顾一下 DDD 领域、子域、核心域、通用域和支撑域等概念,后面会用到。 16 | 17 | 在研究和解决业务问题时,DDD 会按照一定的规则将业务领域进行细分,领域细分到一定的程度后,DDD 会将问题范围限定在特定的边界内,并在这个边界内建立领域模型,进而用代码实现该领域模型,解决相应的业务问题。领域可分解为子域,子域可继续分为子子域,一直到你认为适合建立领域模型为止。 18 | 19 | 子域还会根据自身重要性和功能属性划分为三类子域,它们分别是核心域、支撑域和通用域。 20 | 21 | ![img](./assets/991b8a5b685d8b0b3e172f38c0460a29.png) 22 | 23 | 接下来我们一起看下上面这张图,我选择了保险的几个重要领域,进行了高阶的领域划分。当然每个企业的领域定位和职责会有些不一样,那在核心域的划分上肯定会有一定差异。因此,当你去做领域划分的时候,请务必结合企业战略,这恰恰也体现了 DDD 领域建模的重要性。 24 | 25 | 通过领域划分和进一步的子域划分,我们就可以区分不同子域在企业内的功能属性和重要性,进而采取不同的资源投入和建设策略,这在企业 IT 系统的建设过程中十分重要,并且这样的划分还可以帮助企业进行中台设计。 26 | 27 | ## 中台的本质 28 | 29 | 中台来源于阿里的中台战略(详见《企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战》钟华编著)。2015 年年底,阿里巴巴集团对外宣布全面启动中台战略,构建符合数字时代的更具创新性、灵活性的“大中台、小前台”组织机制和业务机制,即作为前台的一线业务会更敏捷、更快速地适应瞬息万变的市场,而中台将集合整个集团的运营数据能力、产品技术能力,对各前台业务形成强力支撑。 30 | 31 | 中台的本质其实就是提炼各个业务板块的共同需求,进行业务和系统抽象,形成通用的可复用的业务模型,打造成组件化产品,供前台部门使用。前台要做什么业务,需要什么资源,可以直接找中台,不需要每次都去改动自己的底层。 32 | 33 | ## DDD、中台和微服务的协作模式 34 | 35 | 我们在 [第 09 讲] 已经说过了传统企业和阿里中台战略的差异,那实际上更多的企业还是会聚焦在传统企业中台建设的模式,也就是将通用能力与核心能力全部中台化,以满足不同渠道核心业务能力的复用,那么接下来我们就还是把重点放在传统企业上。 36 | 37 | 传统企业可以将需要共享的公共能力进行领域建模,建设可共享的 **通用中台**。除此之外,传统企业还会将核心能力进行领域建模,建设面向不同渠道的可复用的 **核心中台**。 38 | 39 | 而这里的通用中台和核心中台都属于我们上一讲讲到的业务中台的范畴。 40 | 41 | DDD 的子域分为核心域、通用域和支撑域。划分这几个子域的主要目的是为了确定战略资源的投入,一般来说战略投入的重点是核心域,因此后面我们就可以暂时不严格区分支撑域和通用域了。 42 | 43 | 领域、中台以及微服务虽然属于不同层面的东西,但我们还是可以将他们分解对照,整理出来它们之间的关系。你看下面这张图,我是从 DDD 领域建模和中台建设这两个不同的视角对同一个企业的业务架构进行分析。 44 | 45 | ![img](./assets/c647561ff910f97b8500b75de70281df.png) 46 | 47 | 如果将企业内整个业务域作为一个问题域的话,企业内的所有业务就是一个领域。在进行领域细分时,从 DDD 视角来看,子域可分为核心域、通用域和支撑域。从中台建设的视角来看,业务域细分后的业务中台,可分为核心中台和通用中台。 48 | 49 | 从领域功能属性和重要性对照来看,通用中台对应 DDD 的通用域和支撑域,核心中台对应 DDD 的核心域。从领域的功能范围来看,子域与中台是一致的。领域模型所在的限界上下文对应微服务。建立了这个映射关系,我们就可以用 DDD 来进行中台业务建模了。 50 | 51 | **我们这里还是以保险领域为例。** 保险域的业务中台分为两类:第一类是提供保险核心业务能力的核心中台(比如营销、承保和理赔等业务);第二类是支撑核心业务流程完成保险全流程的通用中台(比如订单、支付、客户和用户等)。 52 | 53 | 这里我要提醒你一下:根据 DDD 首先要建立通用语言的原则,在将 DDD 的方法引入中台设计时,我们要先建立中台和 DDD 的通用语言。这里的子域与中台是一致的,那我们就可以将子域统一为中台。 54 | 55 | 中台通过事件风暴可以进一步细分,最终完成业务领域建模。中台业务领域的功能不同,限界上下文的数量和大小就会不一样,领域模型也会不一样。 56 | 57 | 当完成业务建模后,我们就可以采用 DDD 战术设计,设计出聚合、实体、领域事件、领域服务以及应用服务等领域对象,再利用分层架构模型完成微服务的设计。 58 | 59 | 以上就是 DDD、中台和微服务在应用过程中的协作模式。 60 | 61 | ## 中台如何建模? 62 | 63 | 看完了三者的协作模式,我们就顺着上面的话题,接着来聊聊中台如何建模。 64 | 65 | 中台业务抽象的过程就是业务建模的过程,对应 DDD 的战略设计。系统抽象的过程就是微服务的建设过程,对应 DDD 的战术设计。下面我们就结合 DDD 领域建模的方法,讲一下中台业务建模的过程。 66 | 67 | **第一步:** 按照业务流程(通常适用于核心域)或者功能属性、集合(通常适用于通用域或支撑域),将业务域细分为多个中台,再根据功能属性或重要性归类到核心中台或通用中台。核心中台设计时要考虑核心竞争力,通用中台要站在企业高度考虑共享和复用能力。 68 | 69 | **第二步: **选取中台,根据用例、业务场景或用户旅程完成事件风暴,找出实体、聚合和限界上下文。依次进行领域分解,建立领域模型。 70 | 71 | 由于不同中台独立建模,某些领域对象或功能可能会重复出现在其它领域模型中,也有可能本该是同一个聚合的领域对象或功能,却分散在其它的中台里,这样会导致领域模型不完整或者业务不内聚。这里先不要着急,这一步我们只需要初步确定主领域模型就可以了,在第三步中我们还会提炼并重组这些领域对象。 72 | 73 | **第三步: **以主领域模型为基础,扫描其它中台领域模型,检查并确定是否存在重复或者需要重组的领域对象、功能,提炼并重构主领域模型,完成最终的领域模型设计。 74 | 75 | **第四步:** 选择其它主领域模型重复第三步,直到所有主领域模型完成比对和重构。 76 | 77 | **第五步:** 基于领域模型完成微服务设计,完成系统落地。 78 | 79 | ![img](./assets/3caae85ef680eb7cbc2ffb5c6a603f47.png) 80 | 81 | 结合上面这张图,你可以大致了解到 DDD 中台设计的过程。DDD 战略设计包括上述的第一步到第四步,主要为:业务域分解为中台,对中台归类,完成领域建模,建立中台业务模型。DDD 战术设计是第五步,领域模型映射为微服务,完成中台建设。 82 | 83 | ![img](./assets/45de1af6a4b5dd6cf54921ff9f422571.png) 84 | 85 | 那么如果还是以保险领域为例的话,完成领域建模后,里面的数据我们就可以填上了。这里我选取了通用中台的用户、客户和订单三个中台来做示例。客户中台提炼出了两个领域模型:客户信息和客户视图模型。用户中台提炼出了三个领域模型:用户管理、登录认证和权限模型。订单中台提炼出了订单模型。 86 | 87 | 这就是中台建模的全流程,当然看似简单的背后,若是遇上复杂的业务总会出现各种各样的问题,不然应用起来也不会有那么多的困难。 88 | 89 | ## 总结 90 | 91 | 今天我们主要讨论了传统企业中台建设的一些思路,梳理了 DDD、中台和微服务的关系。DDD 的战略设计可用于中台业务建模,战术设计可指导中台微服务设计。相信 DDD 与中台的完美结合,可以让你的中台建设如虎添翼! 92 | 93 | 另外,这一讲只是开一个头,在下一讲中我还会以一个传统核心业务的中台建设案例,详细讲解中台的设计过程。 94 | 95 | ## 思考题 96 | 97 | 你的企业是否在做中台?现在是用什么方法做中台业务建模呢?和 DDD 的设计方法相比,你觉得孰优孰劣? -------------------------------------------------------------------------------- /docs/ddd/02/06.md: -------------------------------------------------------------------------------- 1 | # 答疑:有关 3 个典型问题的讲解 2 | 3 | **问题 1:有关于领域可以划分为核心域、通用域和支撑域,以及子域和限界上下文关系的话题,还有是否有边界划分的量化标准?** 4 | 5 | 我在 [第 02 讲] 中讲到了,在领域不断划分的过程中,领域会被细分为不同的子域,这个过程实际上是将问题范围不断缩小的过程。 6 | 7 | 借用读者“密码 123456”的总结,他认为:“对于领域问题来说,可以理解为,对一个问题不断地划分,直到划分为我们熟悉的、能够快速处理的小问题。然后再对小问题的处理排列一个优先级。” 8 | 9 | 这个理解是很到位的。在领域细分到一定的范围后,我们就可以对这个子域进行事件风暴,为这个子域划分限界上下文,建立领域模型,然后就可以基于领域模型进行微服务设计了。 10 | 11 | 虽然 DDD 没有明确说明子域和限界上下文的关系。我个人认为,子域的划分是一种比较粗的领域边界的划分,它不考虑子域内的领域对象、对象之间的关系和结构。子域的划分往往按照业务阶段或者功能模块边界进行粗分,其目的就是为了让你能够在一个相对较小的问题空间内,比较方便地用事件风暴来梳理业务场景。 12 | 13 | 而限界上下文本质上也是子域,限界上下文是在明确的子域内,用事件风暴划分出来的。它体现的是一种详细的设计过程。这个过程设计出了领域模型,明确了领域对象以及领域对象的依赖等关系,有了领域模型,你就可以直接进行微服务设计了。 14 | 15 | 关于核心域、通用域和支撑域,划分这三个不同类型子域的主要目的是为了区分业务域的优先级,确定 IT 战略投入。我们会将重要的资源投入在核心域上,确保好钢用在刀刃上。每个企业由于商业模式或者战略方向不一样,核心域会有一些差异,不要用固定的眼光看待不同企业的核心域。 16 | 17 | 核心域、通用域和支撑域都是业务领域,只不过重要性和功能属性不一样。采用的 DDD 设计方法和过程,是没有差异的。 18 | 19 | 从目前来看,还没有可以量化的领域以及限界上下文的划分标准。它主要依赖领域专家经验,以及和项目团队在事件风暴过程中不断地权衡和分析。不要奢望一次迭代就能够给复杂的业务,建立一个完美的领域模型。领域模型很多时候也需要多次迭代才能成型,它也需要不断地演进。但如果是用 DDD 设计出来的领域模型的边界和微服务内聚合的边界非常清晰的话,这个演进过程相对来说会简单很多,所需的时间成本也会很低。 20 | 21 | **问题 2:关于聚合设计的问题?领域层与基础层为什么要依赖倒置(DIP)?** 22 | 23 | 聚合主要实现核心业务逻辑,里面有很多的领域对象,这些领域对象之间需要通过聚合根进行统一的管理,以确保数据的一致性。 24 | 25 | 在聚合设计时,我们会用到两个重要的设计模式:工厂(Factory)模式和仓储(Repository)模式。如果你有兴趣详细了解的话,推荐你阅读《实现领域驱动设计》一书的第 11 章和第 12 章。 26 | 27 | 那为什么要引入工厂模式呢? 28 | 29 | 这是因为有些聚合内可能含有非常多的实体和值对象,我们需要确保聚合根以及所有被依赖的对象实例同时被创建。如果都通过聚合根来构造,将会非常复杂。因此我们可以通过工厂模式来封装复杂对象的创建过程,但并不是所有对象的构造都需要用到工厂,如果构造过程不复杂,只是单一对象的构造,你用简单的构造方法就足够了。 30 | 31 | 又为什么要引入仓储模式?解答这个问题的同时,我也一起将依赖倒置的问题解答一下。 32 | 33 | 在传统的 DDD 四层架构中,所有层都是依赖基础层的。这样做有什么不好的地方呢?如果应用逻辑对基础层依赖太大的话,基础层中与资源有关的代码可能会渗透到应用逻辑中。而现在技术组件的更新频率是很快的,一旦出现基础组件的变更,且基础组件的代码被带入到了应用逻辑中,这样会对上层的应用逻辑产生致命的影响。 34 | 35 | 为了解耦应用逻辑和基础资源,在基础层和上层应用逻辑之间会增加一层,这一层就是仓储层。一个聚合对应一个仓储,仓储实现聚合内数据的持久化。聚合内的应用逻辑通过接口来访问基础资源,仓储实现在基础层实现。这样应用逻辑和基础资源的实现逻辑是分离的。如果变更基础资源组件,只需要替换仓储实现就可以了,不会对应用逻辑产生太大的影响,这样就实现了应用逻辑与基础资源的解耦,也就实现了依赖倒置。 36 | 37 | 关于聚合设计过程中的一些原则问题。大部分的业务场景我们都可以通过事件风暴,找到聚合根,建立聚合,划分限界上下文,建立领域模型。但也有部分场景,比如数据计算、统计以及批处理业务场景,所有的实体都是独立无关联的,找不到聚合根,也无法建立领域模型。但是它们之间的业务关系是非常紧密的,在业务上是高内聚的。我们也可以将这类场景作为一个聚合处理,除了不考虑聚合根的设计方法外,其它诸如 DDD 分层架构相关的设计方法都是可以采用的。 38 | 39 | 一些业务场景,如果复杂度并不高,而用 DDD 设计会带来不必要的麻烦的话,比如增加复杂度,有些原则也是可以突破的,不要为做 DDD 而做 DDD。即使采用传统的方式也是没有关系的,最终以解决实际问题为最佳。但必须记住一点,如果采用传统的设计方式,一定要保证领域模型的边界以及微服务内聚合的逻辑边界清晰,这样的话,以后微服务的演进就不会太复杂。 40 | 41 | **问题 3:领域事件采用消息异步机制,发布方和订阅方数据如何保证一致性?微服务内聚合之间领域事件是否一定要用事件总线?** 42 | 43 | 在领域事件设计中,为了解耦微服务,微服务之间数据采用最终一致性原则。由于发布方是在消息总线发布消息以后,并不关心数据是否送达,或者送达后订阅方是否正常处理,因此有些技术人会担心发布方和订阅方数据一致性的问题。 44 | 45 | 那在对数据一致性要求比较高的业务场景,我们是有相关的设计考虑的。也就是发送方和订阅方的事件数据都必须落库,发送方除了保存业务数据以外,在往消息中间件发布消息之前,会先将要发布的消息写入本地库。而接收方在处理消息之前,需要先将收到的消息写入本地库。然后可以采用定期对发布方和订阅方的事件数据对账的操作,识别出不一致的数据。如果数据出现异常或不一致的情况,可以启动定时程序再次发送,必要时可以转人工操作处理。 46 | 47 | 关于事件总线的问题。由于微服务内的逻辑都在一个进程内,后端数据库也是一个,微服务内的事务相比微服务之间会好控制一些。在处理微服务内的领域事件时,如果引入事件总线,会增加开发的复杂度,那是否引入事件总线,就需要你来权衡。 48 | 49 | 个人感觉如果你的场景中,不会出现导致聚合之间数据不一致的情况,就可以不使用事件总线。另外,通过应用服务也可以实现聚合之间的服务和数据协调。 -------------------------------------------------------------------------------- /docs/ddd/02/README.md: -------------------------------------------------------------------------------- 1 | # 进阶篇 2 | 3 | - [06 | 领域事件:解耦微服务的关键?](./01.md) 4 | - [07 | DDD 分层架构:有效降低层与层之间的依赖](./02.md) 5 | - [08 | 微服务架构模型:几种常见模型的对比和分析](./03.md) 6 | - [09 | 中台:数字转型后到底应该共享什么?](./04.md) 7 | - [10 | DDD、中台和微服务:它们是如何协作的?](./05.md) 8 | - [答疑:有关 3 个典型问题的讲解](./06.md) 9 | -------------------------------------------------------------------------------- /docs/ddd/02/assets/09d70aae8b66092bc692ac30510f9145.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/09d70aae8b66092bc692ac30510f9145.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/1680723ca91aa57d719d5cdbc1d910a1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/1680723ca91aa57d719d5cdbc1d910a1.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/23e38df6e78c0a10ddf27f8a254c0093.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/23e38df6e78c0a10ddf27f8a254c0093.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/261b05056ae6056ff406f7dadf7ac081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/261b05056ae6056ff406f7dadf7ac081.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/3caae85ef680eb7cbc2ffb5c6a603f47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/3caae85ef680eb7cbc2ffb5c6a603f47.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/45de1af6a4b5dd6cf54921ff9f422571.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/45de1af6a4b5dd6cf54921ff9f422571.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/76c677ccc83912dbc4d09d62c259b391.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/76c677ccc83912dbc4d09d62c259b391.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/7f1e3891c9c11abce96020e0bf20d67c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/7f1e3891c9c11abce96020e0bf20d67c.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/8579738f790f3ed1adbf58a5a2427e04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/8579738f790f3ed1adbf58a5a2427e04.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/85fb9fb2782b343d45b4ca18c8f21e6c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/85fb9fb2782b343d45b4ca18c8f21e6c.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/89321072afd996c6a90fa9774f769e11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/89321072afd996c6a90fa9774f769e11.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/991b8a5b685d8b0b3e172f38c0460a29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/991b8a5b685d8b0b3e172f38c0460a29.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/9a602b741c222b19c7cc4780da79cf76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/9a602b741c222b19c7cc4780da79cf76.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/a308123994f87a5ce99adc85dd9b4d01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/a308123994f87a5ce99adc85dd9b4d01.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/b221ed4011c23720ebe9f48ba8eee38f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/b221ed4011c23720ebe9f48ba8eee38f.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/b2e4dad1040857b5aedf0b1675ae4171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/b2e4dad1040857b5aedf0b1675ae4171.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/b4231550cfbd56c15ccb3795d1062f9e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/b4231550cfbd56c15ccb3795d1062f9e.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/ba2049c9a3696bbebbd9d60e496df72b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/ba2049c9a3696bbebbd9d60e496df72b.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/c647561ff910f97b8500b75de70281df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/c647561ff910f97b8500b75de70281df.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/d6abc3e4f5837cd51b689d01433cace1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/d6abc3e4f5837cd51b689d01433cace1.jpg -------------------------------------------------------------------------------- /docs/ddd/02/assets/eeb66579c1725817d0e9185161f1843b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/eeb66579c1725817d0e9185161f1843b.png -------------------------------------------------------------------------------- /docs/ddd/02/assets/fc8208d9f4cfadb7949d6e98a8c18442.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/02/assets/fc8208d9f4cfadb7949d6e98a8c18442.png -------------------------------------------------------------------------------- /docs/ddd/03/05.md: -------------------------------------------------------------------------------- 1 | # 15 | 边界:微服务的各种边界在架构演进中的作用? 2 | 3 | 前几讲我们已经介绍过了,在用 DDD 进行微服务设计时,我们可以通过事件风暴来确定领域模型边界,划定微服务边界,定义业务和系统运行边界,从而保证微服务的单一职责和随需而变的架构演进能力。 4 | 5 | 那重点落到边界的时候,总结一下就是,**微服务的设计要涉及到逻辑边界、物理边界和代码边界等等** 。 6 | 7 | 那么这些边界在微服务架构演进中到底起到什么样的作用?我们又该如何理解这些边界呢?这就是我们今天重点要解决的问题。 8 | 9 | ## 演进式架构 10 | 11 | 在微服务设计和实施的过程中,很多人认为:“将单体拆分成多少个微服务,是微服务的设计重点。”可事实真的是这样吗?其实并非如此! 12 | 13 | Martin Fowler 在提出微服务时,他提到了微服务的一个重要特征——演进式架构。那什么是演进式架构呢?演进式架构就是以支持增量的、非破坏的变更作为第一原则,同时支持在应用程序结构层面的多维度变化。 14 | 15 | 那如何判断微服务设计是否合理呢?其实很简单,只需要看它是否满足这样的情形就可以了:随着业务的发展或需求的变更,在不断重新拆分或者组合成新的微服务的过程中,不会大幅增加软件开发和维护的成本,并且这个架构演进的过程是非常轻松、简单的。 16 | 17 | **这也是微服务设计的重点,就是看微服务设计是否能够支持架构长期、轻松的演进。** 18 | 19 | 那用 DDD 方法设计的微服务,不仅可以通过限界上下文和聚合实现微服务内外的解耦,同时也可以很容易地实现业务功能积木式模块的重组和更新,从而实现架构演进。 20 | 21 | ## 微服务还是小单体? 22 | 23 | 有些项目团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的「微服」软件包,而这些「微服务」内的代码仍然是集中式三层架构的模式,微服务内的代码高度耦合,逻辑边界不清晰,这里我们暂且称它为「小单体微服务」。 24 | 25 | 下面这张图也很好地展示了这个过程。 26 | 27 | ![img](./assets/cc697f4e8eef2629a660d247c8a1eceb.jpg) 28 | 29 | 而随着新需求的提出和业务的发展,这些小单体微服务会慢慢膨胀起来。当有一天你发现这些膨胀了的微服务,有一部分业务功能需要拆分出去,或者部分功能需要与其它微服务进行重组时,你会发现原来这些看似清晰的微服务,不知不觉已经摇身一变,变成了臃肿油腻的大单体了,而这个大单体内的代码依然是高度耦合且边界不清的。 30 | 31 | 辛辛苦苦好多年,一夜回到解放前啊!这个时候你就需要一遍又一遍地重复着从大单体向单体微服务重构的过程。想想,这个代价是不是有点高了呢? 32 | 33 | 其实这个问题已经很明显了,那就是边界。 34 | 35 | 这种单体式微服务只定义了一个维度的边界,也就是微服务之间的物理边界,本质上还是单体架构模式。微服务设计时要考虑的不仅仅只有这一个边界,别忘了还要定义好微服务内的逻辑边界和代码边界,这样才能得到你想要的结果。 36 | 37 | 那现在你知道了,我们一定要避免将微服务设计为小单体微服务,那具体该如何避免呢?清晰的边界人人想要,可该如何保证呢?DDD 已然给出了答案。 38 | 39 | ## 微服务边界的作用 40 | 41 | 你应该还记得 DDD 设计方法里的限界上下文和聚合吧?它们就是用来定义领域模型和微服务边界的。 42 | 43 | 我们再来回顾一下 DDD 的设计过程。 44 | 45 | 在事件风暴中,我们会梳理出业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素梳理出实体等领域对象。根据实体对象之间的业务关联性,将业务紧密相关的多个实体进行组合形成聚合,聚合之间是第一层边界。根据业务及语义边界等因素将一个或者多个聚合划定在一个限界上下文内,形成领域模型,限界上下文之间的边界是第二层边界。 46 | 47 | 为了方便理解,我们将这些边界分为:**逻辑边界、物理边界和代码边界**。 48 | 49 | **逻辑边界** 主要定义同一业务领域或应用内紧密关联的对象所组成的不同聚类的组合之间的边界。事件风暴对不同实体对象进行关联和聚类分析后,会产生多个聚合和限界上下文,它们一起组成这个领域的领域模型。微服务内聚合之间的边界就是逻辑边界。一般来说微服务会有一个以上的聚合,在开发过程中不同聚合的代码隔离在不同的聚合代码目录中。 50 | 51 | 逻辑边界在微服务设计和架构演进中具有非常重要的意义! 52 | 53 | 微服务的架构演进并不是随心所欲的,需要遵循一定的规则,这个规则就是逻辑边界。微服务架构演进时,在业务端以聚合为单位进行业务能力的重组,在微服务端以聚合的代码目录为单位进行微服务代码的重组。由于按照 DDD 方法设计的微服务逻辑边界清晰,业务高内聚,聚合之间代码松耦合,因此在领域模型和微服务代码重构时,我们就不需要花费太多的时间和精力了。 54 | 55 | 现在我们来看一个微服务实例,在下面这张图中,我们可以看到微服务里包含了两个聚合的业务逻辑,两个聚合分别内聚了各自不同的业务能力,聚合内的代码分别归到了不同的聚合目录下。 56 | 57 | 那随着业务的快速发展,如果某一个微服务遇到了高性能挑战,需要将部分业务能力独立出去,我们就可以以聚合为单位,将聚合代码拆分独立为一个新的微服务,这样就可以很容易地实现微服务的拆分。 58 | 59 | ![img](./assets/88d709569367264d368b08a7d9658c3d.png) 60 | 61 | 另外,我们也可以对多个微服务内有相似功能的聚合进行功能和代码重组,组合为新的聚合和微服务,独立为通用微服务。现在你是不是有点做中台的感觉呢? 62 | 63 | **物理边界** 主要从部署和运行的视角来定义微服务之间的边界。不同微服务部署位置和运行环境是相互物理隔离的,分别运行在不同的进程中。这种边界就是微服务之间的物理边界。 64 | 65 | **代码边界 ** 主要用于微服务内的不同职能代码之间的隔离。微服务开发过程中会根据代码模型建立相应的代码目录,实现不同功能代码的隔离。由于领域模型与代码模型的映射关系,代码边界直接体现出业务边界。代码边界可以控制代码重组的影响范围,避免业务和服务之间的相互影响。微服务如果需要进行功能重组,只需要以聚合代码为单位进行重组就可以了。 66 | 67 | ## 正确理解微服务的边界 68 | 69 | 从上述内容中,我们知道了,按照 DDD 设计出来的逻辑边界和代码边界,让微服务架构演进变得不那么费劲了。 70 | 71 | 微服务的拆分可以参考领域模型,也可以参考聚合,因为聚合是可以拆分为微服务的最小单位的。但实施过程是否一定要做到逻辑边界与物理边界一致性呢?也就是说聚合是否也一定要设计成微服务呢?答案是不一定的,这里就涉及到微服务过度拆分的问题了。 72 | 73 | 微服务的过度拆分会使软件维护成本上升,比如:集成成本、发布成本、运维成本以及监控和定位问题的成本等。在项目建设初期,如果你不具备较强的微服务管理能力,那就不宜将微服务拆分过细。当我们具备一定的能力以后,且微服务内部的逻辑和代码边界也很清晰,你就可以随时根据需要,拆分出新的微服务,实现微服务的架构演进了。 74 | 75 | 当然,还要记住一点,微服务内聚合之间的服务调用和数据依赖需要符合高内聚松耦合的设计原则和开发规范,否则你也不能很快完成微服务的架构演进。 76 | 77 | ## 总结 78 | 79 | 今天我们主要讨论了微服务架构设计中的各种边界在架构演进中的作用。 80 | 81 | **逻辑边界:**微服务内聚合之间的边界是逻辑边界。它是一个虚拟的边界,强调业务的内聚,可根据需要变成物理边界,也就是说聚合也可以独立为微服务。 82 | 83 | **物理边界:**微服务之间的边界是物理边界。它强调微服务部署和运行的隔离,关注微服务的服务调用、容错和运行等。 84 | 85 | **代码边界:**不同层或者聚合之间代码目录的边界是代码边界。它强调的是代码之间的隔离,方便架构演进时代码的重组。 86 | 87 | 通过以上边界,我们可以让业务能力高内聚、代码松耦合,且清晰的边界,可以快速实现微服务代码的拆分和组合,轻松实现微服务架构演进。但有一点一定要格外注意,边界清晰的微服务,不是大单体向小单体的演进。 88 | 89 | ## 思考题 90 | 91 | 分享一下你们公司目前采用了什么样的方法来实现微服务的架构演进?和 DDD 设计方法相比,有何区别,你觉得哪种方式更好呢?可结合业务场景进行分析。 92 | 93 | 笔者这边听到目前最大的感受其实不是特别的明显:我们使用传统的三层模型,以数据为主,也不是严格的分层,在架构演进方面,其实是很困难的,别说架构演进了,就是业务改动方面就挺麻烦。但是以 DDD 来看,并不是所有的都是那么简单的对单个实体的操作,大部分是复杂的查询,或许这些不适合使用 DDD 来的分层架构来实现?因为他们不是互联网应用? -------------------------------------------------------------------------------- /docs/ddd/03/README.md: -------------------------------------------------------------------------------- 1 | # 实战篇 2 | -------------------------------------------------------------------------------- /docs/ddd/03/assets/18acc5f5681c61a37957e5036f176274.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/18acc5f5681c61a37957e5036f176274.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/255beadd4cf7a842c083ccea0ec19807.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/255beadd4cf7a842c083ccea0ec19807.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/25cd1e7fe14bfa22a752c1b184b9c91d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/25cd1e7fe14bfa22a752c1b184b9c91d.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/2d6a328a9fd8b4b3906bb9f59435ca1d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/2d6a328a9fd8b4b3906bb9f59435ca1d.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/30caee3ceaf1085b7aa2cc388f996e61.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/30caee3ceaf1085b7aa2cc388f996e61.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/33cbdd0f30a400a0cb9a2bd7ca5d54c5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/33cbdd0f30a400a0cb9a2bd7ca5d54c5.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/348d60eac28c9dbf7d120d1b7159cdf9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/348d60eac28c9dbf7d120d1b7159cdf9.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/35d5b6465f6978b16a5ddfa49a910d6f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/35d5b6465f6978b16a5ddfa49a910d6f.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/3a80b8e7648440a49b809d945e6439f8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/3a80b8e7648440a49b809d945e6439f8.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/5bbe3454e2ecf4ff4770e887a4967b5a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/5bbe3454e2ecf4ff4770e887a4967b5a.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/5e901b4f7fa964b349e4d6f344786ea1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/5e901b4f7fa964b349e4d6f344786ea1.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/688dd55b8399779baff8fc5b7c124c2c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/688dd55b8399779baff8fc5b7c124c2c.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/689e27849a72b780ef62176fc0357204.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/689e27849a72b780ef62176fc0357204.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/7d0eff75e60913a01aadfc7c6b24dad4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/7d0eff75e60913a01aadfc7c6b24dad4.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/84a486d4c0d9146462b31c7fcd5d835e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/84a486d4c0d9146462b31c7fcd5d835e.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/88d709569367264d368b08a7d9658c3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/88d709569367264d368b08a7d9658c3d.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/89a65daccac054e97591c7259a60e4bc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/89a65daccac054e97591c7259a60e4bc.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/8d5fa14336fbf9a2cd239736e24c59f0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/8d5fa14336fbf9a2cd239736e24c59f0.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/915ad8d830d925a893cd09ff6cbdadb8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/915ad8d830d925a893cd09ff6cbdadb8.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/95524b08051fcd181e65f825005a4c73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/95524b08051fcd181e65f825005a4c73.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/97c049d18f7e7032f6feef70992a4828.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/97c049d18f7e7032f6feef70992a4828.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/a308123994f87a5ce99adc85dd9b4d01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/a308123994f87a5ce99adc85dd9b4d01.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/a7fa9314002372f6ddad1c1b54573a66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/a7fa9314002372f6ddad1c1b54573a66.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/a88e9695c7198a1f88f537564ada0bc5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/a88e9695c7198a1f88f537564ada0bc5.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/ab304d69ee174b5e69cb63d79864ca07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/ab304d69ee174b5e69cb63d79864ca07.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/ae33bc5c0cda28740363e39edbc1e53c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/ae33bc5c0cda28740363e39edbc1e53c.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/af21beade34a5f121f673c25a7c979be.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/af21beade34a5f121f673c25a7c979be.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/b35d6fed54e26423c0d61de040ab04a0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/b35d6fed54e26423c0d61de040ab04a0.jpeg -------------------------------------------------------------------------------- /docs/ddd/03/assets/b5570b95095fd9103506fef3fa6a87ce.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/b5570b95095fd9103506fef3fa6a87ce.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/b56e20cd47d161eccbd86d014f9c6e76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/b56e20cd47d161eccbd86d014f9c6e76.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/b85983fa6a8c877e77387fdafe1598c4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/b85983fa6a8c877e77387fdafe1598c4.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/bb9f2a7095da0c72504e0195dca34376.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/bb9f2a7095da0c72504e0195dca34376.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/c1fce57f9e2a88ab2728db79ff45c770.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/c1fce57f9e2a88ab2728db79ff45c770.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/c6ea040a520c91dfe6400f206ff36fef.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/c6ea040a520c91dfe6400f206ff36fef.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/cc697f4e8eef2629a660d247c8a1eceb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/cc697f4e8eef2629a660d247c8a1eceb.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/cf35a9437319169784db9e5aab97b1fd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/cf35a9437319169784db9e5aab97b1fd.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/d0191d4e4c51ff91dc830bf38c0e7ae1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/d0191d4e4c51ff91dc830bf38c0e7ae1.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/d0f8fb06797a5983c7fd00d59d8be57d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/d0f8fb06797a5983c7fd00d59d8be57d.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/d1bea7dc6bd93f3bd30ced821f36bb71.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/d1bea7dc6bd93f3bd30ced821f36bb71.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/e2f91189e25bbaa81307d1fea694aee4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/e2f91189e25bbaa81307d1fea694aee4.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/e5d025a6fd69d1f2cf2a1af53253abdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/e5d025a6fd69d1f2cf2a1af53253abdb.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/e665d85381a9b2c599555cac6a06deda.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/e665d85381a9b2c599555cac6a06deda.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/eb626396fcb9f541ec46a799275e04b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/eb626396fcb9f541ec46a799275e04b2.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/eca31d653a3171a8272c6b1f25140bf7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/eca31d653a3171a8272c6b1f25140bf7.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/ed9da0faabb9c756a0067dbd3f75d103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/ed9da0faabb9c756a0067dbd3f75d103.png -------------------------------------------------------------------------------- /docs/ddd/03/assets/ef218e23ea2a8dc756af885ae06e61b2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/ef218e23ea2a8dc756af885ae06e61b2.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/f1b2e04d38ba13d8c318aa3539604bc4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/f1b2e04d38ba13d8c318aa3539604bc4.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/f537a7a43e77212c8a85241439b2f246.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/f537a7a43e77212c8a85241439b2f246.jpg -------------------------------------------------------------------------------- /docs/ddd/03/assets/fb11e6941fc471c734d0b85c25cc5370.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/03/assets/fb11e6941fc471c734d0b85c25cc5370.jpg -------------------------------------------------------------------------------- /docs/ddd/04/README.md: -------------------------------------------------------------------------------- 1 | # 结束 | 所谓高手,就是跨过坑和大海! 2 | 3 | 我站在架构师的角度,尽力将我在实践过程中的经验、思考和体会,以及原创案例等全面详细地呈现给你。希望能够对你的 DDD 实践和架构设计有所帮助,也希望你能快速成长为具有企业级战略视角的架构师和 DDD 设计大师。 4 | 5 | 那说到成长,相信我们每个人的轨迹都是独特的,但有一点,你一定和我有同样的体会。那就是“所谓高手,就是跨过坑和大海!”每一步都是积累,每一步都是经验,每一步都算数!所以啊,在本专栏的最后,我还是要分享一些干货给你,也是我曾经踩过的一些坑。 6 | 7 | 很多人接触 DDD,可能是从 DDD 战术设计开始的,因此不知道如何开始 DDD 实践。这个专栏开启后,咱们就可以从领域建模开始了。有了领域模型,我们就可以划分出合理的微服务的逻辑和物理边界;也是因为有了它,我们才能识别出微服务内各关键对象,并建立它们之间的依赖关系,然后开始微服务的设计和开发。 8 | 9 | 而很多 DDD 和微服务设计的书籍,大多侧重于讲述 DDD 战术设计或者一些通用的微服务设计模式。这些书籍大多没有告诉我们:如何从业务领域开始,去构建领域模型?如何用 DDD 的思想,来指导中台和微服务设计?如何将领域模型作为输入,来设计和拆分微服务?如何将 DDD 知识体系组合起来,应用到中台和微服务的设计和开发中… 10 | 11 | 这也是本专栏与这些书籍的不同点。当然,我并不是说它们不好,只是各有侧重。在真正实践的时候,强大的知识基础自然也是刚需,你可以把专栏和书籍结合起来学习,从而发挥最大效能。 12 | 13 | **下面是我推荐的几本书,这些内容是可以和本专栏互补的,如果你有意愿进一步学习 DDD,它们是非常好的学习资料。** 14 | 15 | ![img](./assets/8a90eb7bb3a80baa917cef282b7ff042.jpg) 16 | 17 | DDD 是一个相对复杂的方法体系,它与传统的软件开发模式或者流程存在一定的差异。在实践 DDD 时,你可能会遇到一些困难。企业需要在研发模式上有一定的调整,同时项目团队也需要提升 DDD 的设计和技术能力,培养适合 DDD 成长的土壤。拔高一点看的话,我觉得你可能会遇到这样三个大坑,下面我来说一说我的看法。 18 | 19 | ## 1. 业务专家或领域专家的问题 20 | 21 | 传统企业中业务人员是需求的主要提出者,但由于部门墙,他们很少会参与到软件设计和开发过程中。如果研发模式不调整,你不要奢望业务人员会主动加入到项目团队中,一起来完成领域建模。没有业务人员的参与,是不是就会觉得没有领域专家,不能领域建模了呢?其实并不是这样的。 22 | 23 | 对于成熟业务的领域建模,我们可以从团队需求人员或者经验丰富的设计或开发人员中,挑选出能够深刻理解业务内涵和业务管理要求的人员,担任领域专家完成领域建模。对于同时熟悉业务和面向对象设计的项目人员,这种设计经验尤其重要,他们可以利用面向对象的设计经验,更深刻地理解和识别出领域模型的领域对象和业务行为,有助于推进领域模型的设计。 24 | 25 | 而对于新的创业企业,他们面对的是从来没人做过的全新的业务和领域,没有任何可借鉴的经验,更不要提什么领域专家。对于这种情况,就需要团队一起经过更多次更细致的事件风暴,才能建立领域模型。当然建模过程离不开产品愿景分析,这个过程是确定和统一系统建设目标以及项目的核心竞争力在哪里。这种初创业务的领域模型往往需要经过多次迭代才能成型,不要奢望一次就可以建立一个完美的领域模型。 26 | 27 | ## 2. 团队 DDD 的理念和技术能力问题 28 | 29 | 完成领域建模和微服务设计后,就要投入开发和测试了。这时你可能会发现一些开发人员,并不理解 DDD 设计方法,不知道什么是聚合、分层以及边界?也不知道服务的依赖以及层与层之间的职责边界是什么? 30 | 31 | 这样容易出现设计很精妙,而开发很糟糕的状况。遇到这种情况,除了要在项目团队普及 DDD 的知识和设计理念外,你还要让所有的项目成员尽早地参与到领域建模中,事件风暴的过程除了统一团队语言外,还可以让团队成员提前了解领域模型、设计要点和注意事项。 32 | 33 | ## 3. DDD 设计原则问题 34 | 35 | DDD 基于各种考虑,有很多的设计原则,也用到了很多的设计模式。条条框框多了,很多人可能就会被束缚住,总是担心或犹豫这是不是原汁原味的 DDD。其实我们不必追求极致的 DDD,这样做反而会导致过度设计,增加开发复杂度和项目成本。 36 | 37 | DDD 的设计原则或模式,是考虑了很多具体场景或者前提的。有的是为了解耦,如仓储服务、边界以及分层,有的则是为了保证数据一致性,如聚合根管理等。在理解了这些设计原则的根本原因后,有些场景你就可以灵活把握设计方法了,你可以突破一些原则,不必受限于条条框框,大胆选择最合适的方法。 38 | 39 | **以上就是我对这三个问题的理解了。** 40 | 41 | 用好 DDD 的关键,首先要领悟 DDD 的核心设计思想和理念,了解它为什么适合微服务架构,然后慢慢体会、消化、吸收和实践。DDD 体系虽然复杂,但也是有矩可循的,照着样例多做几个事件风暴,完成领域建模和微服务设计,体会 DDD 的整个设计过程。相信你很快就能领悟到 DDD 的核心设计理念了,这样就可以做到收放自如,趟出一条适合自己的 DDD 实践之路。 -------------------------------------------------------------------------------- /docs/ddd/04/assets/5f22ed9bb3d5b6c63f21583469399892.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/04/assets/5f22ed9bb3d5b6c63f21583469399892.jpg -------------------------------------------------------------------------------- /docs/ddd/04/assets/8a90eb7bb3a80baa917cef282b7ff042.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/ddd/04/assets/8a90eb7bb3a80baa917cef282b7ff042.jpg -------------------------------------------------------------------------------- /docs/ddd/README.md: -------------------------------------------------------------------------------- 1 | # DDD 实战课 2 | 3 | - [开篇 | 学好了 DDD,你能做什么?](./00/) 4 | - [基础篇](./01/) 5 | - [01 | 领域驱动设计:微服务设计为什么要选择 DDD?](./01/01.md) 6 | - [02 | 领域、子域、核心域、通用域和支撑域:傻傻分不清?](./01/02.md) 7 | - [03 | 限界上下文:定义领域边界的利器](./01/03.md) 8 | - [04 | 实体和值对象:从领域模型的基础单元看系统设计](./01/04.md) 9 | - [05 | 聚合和聚合根:怎样设计聚合?](./01/05.md) 10 | - [进阶篇](./02/) 11 | - [06 | 领域事件:解耦微服务的关键?](./02/01.md) 12 | - [07 | DDD 分层架构:有效降低层与层之间的依赖](./02/02.md) 13 | - [08 | 微服务架构模型:几种常见模型的对比和分析](./02/03.md) 14 | - [09 | 中台:数字转型后到底应该共享什么?](./02/04.md) 15 | - [10 | DDD、中台和微服务:它们是如何协作的?](./02/05.md) 16 | - [答疑:有关 3 个典型问题的讲解](./02/06.md) 17 | - [实战篇](./03/) 18 | - [11 | DDD 实践:如何用 DDD 重构中台业务模型?](./03/01.md) 19 | - [12 | 领域建模:如何用事件风暴构建领域模型?](./03/02.md) 20 | - [13 | 代码模型(上):如何使用 DDD 设计微服务代码模型?](./03/03.md) 21 | - [14 | 代码模型(下):如何保证领域模型与代码模型的一致性?](./03/04.md) 22 | - [15 | 边界:微服务的各种边界在架构演进中的作用?](./03/05.md) 23 | - [16 | 视图:如何实现服务和数据在微服务各层的协作?](./03/06.md) 24 | - [17 | 从后端到前端:微服务后,前端如何设计?](./03/07.md) 25 | - [18 | 知识点串讲:基于 DDD 的微服务设计实例](./03/08.md) 26 | - [19 | 总结(一):微服务设计和拆分要坚持哪些原则?](./03/09.md) 27 | - [20 | 总结(二):分布式架构关键设计 10 问](./03/10.md) 28 | - [结束 | 所谓高手,就是跨过坑和大海!](./04/) 29 | - [基于 DDD 的微服务设计实例代码详解](./04/01.md) 30 | 31 | 32 | 注:此知识偏理论,不过根据描述,可以对应用到自己的项目中,但是领域建模感觉还是很难,而 DDD 的战略设计(领域分析、建模)又是重点,总之感觉还是挺难落地的。 33 | 34 | ## 推荐阅读 35 | 36 | - [美团-领域驱动设计在互联网业务开发中的实践](https://tech.meituan.com/2017/12/22/ddd-in-practice.html?utm_source=wechat_session&utm_medium=social&utm_oi=698166473230680064) :以一个抽奖为例子,讲述了如何设计和落地成代码的一篇文章 -------------------------------------------------------------------------------- /docs/ddd/index.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | return [ 3 | '', 4 | '00/', 5 | { 6 | title: '基础篇', 7 | path: '/ddd/01/', 8 | collapsable: true, 9 | children: [ 10 | '01/01.md', 11 | '01/02.md', 12 | '01/03.md', 13 | '01/04.md', 14 | '01/05.md' 15 | ] 16 | }, 17 | { 18 | title: '进阶篇', 19 | path: '/ddd/02/', 20 | collapsable: true, 21 | children: [ 22 | '02/01.md', 23 | '02/02.md', 24 | '02/03.md', 25 | '02/04.md', 26 | '02/05.md', 27 | '02/06.md' 28 | ] 29 | }, 30 | { 31 | title: '实战篇', 32 | path: '/ddd/03/', 33 | collapsable: true, 34 | children: [ 35 | '03/01.md', 36 | '03/02.md', 37 | '03/03.md', 38 | '03/04.md', 39 | '03/05.md', 40 | '03/06.md', 41 | '03/07.md', 42 | '03/08.md', 43 | '03/09.md', 44 | '03/10.md' 45 | ] 46 | }, 47 | '04/', 48 | '04/01.md' 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /docs/http-protocol/01/README.md: -------------------------------------------------------------------------------- 1 | # 01 | 开篇: To Be a HTTP Hero 2 | 3 | 要我写 HTTP 专栏的时候,我的第一反应是:「HTTP 协议好简单的,有这个必要吗?」 4 | 5 | 你可能也会有同样的想法:「HTTP 不就是请求 / 响应、GET/POST、Header/Body 吗?网络上的资料一抓一大把,有什么问题搜一下就是了。」 6 | 7 | 不瞒你说,我当时就是这么想的,在之前的工作中也是一直这么做的,而且一直「感觉良好」,觉得 HTTP 就是这个样子,没有什么特别的地方,没有什么值得讲的。 8 | 9 | 但在编辑的一再坚持下,我「勉为其难」接下了这个任务。然后做了一个小范围的「调查」,问一些周围的同事,各个领域的都有,比如产品、开发、运维、测试、前端、后端、手机端……想看看他们有什么意见。 10 | 11 | 出乎我的意料,他们无一例外都对这个「HTTP 专栏」有很强烈的需求,想好好「补补课」,系统地学习了解 HTTP,这其中甚至还包括有七、八年(甚至更多)工作经验的老手。 12 | 13 | 这不禁让我陷入了思考,为什么如此「简单」的协议却还有这么多的人想要学呢? 14 | 15 | 我想,一个原因可能是 HTTP 协议 **太常见** 了。就像现实中的水和空气一样,如此重要却又如此普遍,普遍到我们几乎忽视了它的存在。真的很像那句俗语所说:「鱼总是最后看见水的」,但水对鱼的生存却又是至关重要。 16 | 17 | 我认真回忆了一下这些年的工作经历,这才发现 HTTP 只是表面上显得简单,而底层的运行机制、工作原理绝不简单,可以说是非常地复杂。只是我们平常总是 KPI 优先,网上抓到一个解决方法用过就完事了,没有去深究里面的要点和细节。 18 | 19 | 下面的几个场景,都是我周围同事的实际感受,你是否也在工作中遇到过这样的困惑呢?你能把它们都解释清楚吗? 20 | 21 | - 用 Nginx 搭建 Web 服务器,照着网上的文章配好了,但里面那么多的指令,什么 keepalive、rewrite、proxy_pass 都是怎么回事?为什么要这么配置? 22 | - 用 Python 写爬虫,URI、URL 「傻傻分不清」,有时里面还会加一些奇怪的字符,怎么处理才好? 23 | - 都说 HTTP 缓存很有用,可以大幅度提升系统性能,可它是怎么做到的?又应该用在何时何地? 24 | - HTTP 和 HTTPS 是什么关系?还经常听说有 SSL/TLS/SNI/OCSP/ALPN……这么多稀奇古怪的缩写,头都大了,实在是搞不懂。 25 | 26 | 其实这些问题也并不是什么新问题,把关键字粘贴进搜索栏,再点一下按钮,搜索引擎马上就能找出几十万个相关的页面。但看完第一页的前几个链接后,通常还是有种懵懵懂懂、似懂非懂的感觉,觉得说的对,又不全对,和自己的思路总是不够「Match」。 27 | 28 | 不过大多数情况下你可能都没有时间细想,优先目标是把手头的工作「对付过去」。长此以来,你对 HTTP 的认识也可能仅限于这样的「知其然,而不知其所以然」,实际情况就是 HTTP 天天用,时时用,但想认真、系统地学习一下,梳理出自己的知识体系,经常会发现无从下手。 29 | 30 | 我把这种 HTTP 学习的现状归纳为三点: **正式资料少、网上资料杂、权威资料难** 。 31 | 32 | 第一个,**正式资料少** 33 | 34 | 上购书网站,搜个 Python、Java,搜个 MySQL、Node.js,能出一大堆。但搜 HTTP,实在是少得可怜,那么几本,一只手的手指头就可以数得过来,和语言类、数据库类、框架类图书真是形成了鲜明的对比。 35 | 36 | 现有的 HTTP 相关图书我都看过,怎么说呢,它们都有一个特点,「广撒网,捕小鱼」,都是知识点,可未免太照本宣科了,理论有余实践不足,看完了还是不知道怎么去用。 37 | 38 | 而且这些书的岁数都很大,依据的都是 20 年前的 RFC2616,很多内容都不合时宜,而新标准 7230 已经更新了很多关键的细节。 39 | 40 | 第二个,**网上资料杂** 41 | 42 | 正式的图书少,而且过时,那就求助于网络社区吧。现在的博客、论坛、搜索引擎非常发达,网上有很多 HTTP 协议相关的文章,也都是网友的实践经验分享,「干货」很多,很能解决实际问题。 43 | 44 | 但网上文章的特点是细小、零碎,通常只钉在一个很小的知识点上,而且由于帖子长度的限制,无法深入展开论述,很多都是浅尝辄止,通常都止步在 How 层次,很少能说到 Why ,能说透的更是寥寥无几。 45 | 46 | 网文还有一个难以避免的毛病,就是良莠不齐。同一个主题可能会有好几种不同的说法,有的还会互相矛盾、以讹传讹。这种情况是最麻烦的,你必须花大力气去鉴别真假,不小心就会被带到沟里。 47 | 48 | 可想而知,这种东一榔头西一棒子的学习方式,用碎片拼凑出来的 HTTP 知识体系是非常不完善的,会有各种漏洞,遇到问题时基本派不上用场,还得再去找其他的碎片。 49 | 50 | 第三个,**权威资料难** 51 | 52 | 图书少,网文杂,我们还有一个终极的学习资料,那就是 RFC 文档。 53 | 54 | RFC 是互联网工程组(IETF)发布的官方文件,是对 HTTP 最权威的定义和解释。但它也是最难懂的,全英文看着费劲,理解起来更是难上加难,文档之间还会互相关联引用,劝退率极高。 55 | 56 | 这三个问题就像是三座大山,阻碍了像你这样的很多有心人去学习、了解 HTTP 协议。 57 | 58 | 那么,怎么才能更好地学习 HTTP 呢? 59 | 60 | 我为这个专栏定了一个基调:**要有广度,但更要有深度** 。目标是成为含金量最高的 HTTP 学习资料,新手可以由浅入深、系统学习,老手可以温故知新、查缺补漏,让你花最少的时间,用最少的精力,掌握最多、最全面、最系统的知识。 61 | 62 | 由于 HTTP 应用得非常广泛,几乎涉及到所有的领域,所以我会在广度上从 HTTP 尽量向外扩展,不只讲协议本身,与它相关的 TCP/IP、DNS、SSL/TLS、Web Server 等都会讲到,而且会把它们打通串联在一起,形成知识链,让你知道它们之间是怎么联系、怎么运行的。 63 | 64 | 专栏文章的深度上我也是下足了功夫,全部基于最新的 RFC 标准文档,再结合我自己多年的实践体会,力求讲清讲透,能让你看了以后有豁然开朗的感觉。 65 | 66 | 比如分析 HTTPS,我会用 Wireshark 从建立 TCP 连接时就开始抓包,从二进制最底层来分析里面的 Record、Cipher Suite、Extension,讲 ECDHE、AES、SHA384,再画出详细的流程图,做到一览无余。 67 | 68 | 陆游有诗:**纸上得来终觉浅,绝知此事要躬行** 。学习网络协议最重要的就是实践,在专栏里我还会教你用 Nginx 搭建一个「麻雀虽小,五脏俱全」的实验环境,让你与 HTTP 零距离接触。 69 | 70 | 它有一个最大的优点:自身就是一个完整的网络环境,即使不联网也能够在里面收发 HTTP 消息。 71 | 72 | 我还精心设计了配套的测试用例,最小化应用场景,排除干扰因素,你可以在里面任意测试 HTTP 的各种特性,再配合 Wireshark 抓包,就能够理论结合实践,更好地掌握 HTTP 的知识。 73 | 74 | 每一讲的末尾,我也会留几个思考题,你可以把它当作是求职时的面试官问题,尽量认真思考后再回答,这样能够把专栏的学习由被动地听,转变为主动地学,实现学以致用。 75 | 76 | 当然了,你和我的兴趣点不可能完全一样,我在讲课时也难免顾此失彼、挂一漏万,希望你积极留言,我会视情况做些调整,或者用答疑的形式补充没讲到的内容。 77 | 78 | 今年是万维网和 HTTP 诞生 30 周年,也是 HTTP/1.1 诞生 20 周年,套用莎翁《哈姆雷特》里的名句,让我们在接下来的三个月里一起努力。 79 | 80 | 「To Be a HTTP Hero!」 81 | -------------------------------------------------------------------------------- /docs/http-protocol/02/README.md: -------------------------------------------------------------------------------- 1 | # 02 | 破冰篇 2 | 3 | - [01 | 时势与英雄:HTTP 的前世今生](./01.md) 4 | - [02 | HTTP 是什么?HTTP 又不是什么?](./02.md) 5 | - [03 | HTTP 世界全览:与 HTTP 相关的各种概念](./03.md) 6 | - [04 | HTTP 世界全览:与 HTTP 相关的各种协议](./04.md) 7 | - [05 | 常说的四层和七层到底是什么?五层、六层哪去了?](./05.md) 8 | - [06 | 域名里有哪些门道?](./06.md) 9 | - [07 | 自己动手,搭建 HTTP 实验环境](./07.md) 10 | -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/261bac84bfb1f957c3e9fd45021a5d73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/261bac84bfb1f957c3e9fd45021a5d73.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/2b8fee82b58cc8da88c74a33f2146703.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/2b8fee82b58cc8da88c74a33f2146703.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/3abcf1462621ff86758a8d9571c07cdc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/3abcf1462621ff86758a8d9571c07cdc.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/5102fc33d04b59b36971a5e487779864.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/5102fc33d04b59b36971a5e487779864.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/613fffb6defee1735431dc5f89085d8b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/613fffb6defee1735431dc5f89085d8b.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/6b020454987543efdd1cf6ddec784bf2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/6b020454987543efdd1cf6ddec784bf2.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/70bc19acacf2245fa841349f15cb7a6f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/70bc19acacf2245fa841349f15cb7a6f.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/85cadf90dc96cf413afaf8668689ef0b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/85cadf90dc96cf413afaf8668689ef0b.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/9470d41cab80f36438ebb06a71672242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/9470d41cab80f36438ebb06a71672242.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/9d9b3c9274465c94e223676b6d434194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/9d9b3c9274465c94e223676b6d434194.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/c1e411161fdf8818f47262d5e770cf95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/c1e411161fdf8818f47262d5e770cf95.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/d697ba915bcca40a11b8a25571516720.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/d697ba915bcca40a11b8a25571516720.jpg -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/d7f12d4d480d7100cd9804d2b16b8a88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/d7f12d4d480d7100cd9804d2b16b8a88.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/e51df3245609880641043af65bba94ac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/e51df3245609880641043af65bba94ac.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303183633464.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303183633464.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303184026726.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303184026726.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303184415482.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303184415482.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303190034087.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303190034087.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303191137031.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303191137031.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210303191636900.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210303191636900.png -------------------------------------------------------------------------------- /docs/http-protocol/02/assets/image-20210304101549294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/02/assets/image-20210304101549294.png -------------------------------------------------------------------------------- /docs/http-protocol/03/06.md: -------------------------------------------------------------------------------- 1 | # 06 | HTTP 有哪些特点? 2 | 3 | 通过基础篇前几讲的学习,你应该已经知道了 HTTP 协议的基本知识,了解它的报文结构,请求头、响应头以及内部的请求方法、URI 和状态码等细节。 4 | 5 | 你会不会有种疑惑:HTTP 协议好像也挺简单的啊,凭什么它就能统治互联网这么多年呢? 6 | 7 | 所以接下来的这两讲,我会跟你聊聊 HTTP 协议的特点、优点和缺点。既要看到它好的一面,也要正视它不好的一面,只有全方位、多角度了解 HTTP,才能实现“扬长避短”,更好地利用 HTTP。 8 | 9 | 今天这节课主要说的是 HTTP 协议的特点,但不会讲它们的好坏,这些特点即有可能是优点,也有可能是缺点,你可以边听边思考。 10 | 11 | ![img](./assets/7808b195c921e0685958c20509855d4a.png) 12 | 13 | ## 灵活可扩展 14 | 15 | 首先, HTTP 协议是一个 **灵活可扩展** 的传输协议。 16 | 17 | HTTP 协议最初诞生的时候就比较简单,本着开放的精神只规定了报文的基本格式,比如用空格分隔单词,用换行分隔字段,`header+body` 等,报文里的各个组成部分都没有做严格的语法语义限制,可以由开发者任意定制。 18 | 19 | 所以,HTTP 协议就随着互联网的发展一同成长起来了。在这个过程中,HTTP 协议逐渐增加了请求方法、版本号、状态码、头字段等特性。而 body 也不再限于文本形式的 TXT 或 HTML,而是能够传输图片、音频视频等任意数据,这些都是源于它的灵活可扩展的特点。 20 | 21 | 而那些 RFC 文档,实际上也可以理解为是对已有扩展的 **承认和标准化**,实现了 「从实践中来,到实践中去」的良性循环。 22 | 23 | 也正是因为这个特点,HTTP 才能在三十年的历史长河中「屹立不倒」,从最初的低速实验网络发展到现在的遍布全球的高速互联网,始终保持着旺盛的生命力。 24 | 25 | ## 可靠传输 26 | 27 | 第二个特点, HTTP 协议是一个“可靠”的传输协议。 28 | 29 | 这个特点显而易见,因为 HTTP 协议是基于 TCP/IP 的,而 TCP 本身是一个 **可靠** 的传输协议,所以 HTTP 自然也就继承了这个特性,能够在请求方和应答方之间“可靠”地传输数据。 30 | 31 | 它的具体做法与 TCP/UDP 差不多,都是对实际传输的数据(entity)做了一层包装,加上一个头,然后调用 Socket API,通过 TCP/IP 协议栈发送或者接收。 32 | 33 | 不过我们必须正确地理解 **可靠** 的含义,HTTP 并不能 100% 保证数据一定能够发送到另一端,在网络繁忙、连接质量差等恶劣的环境下,也有可能收发失败。 **可靠** 只是向使用者提供了一个 **承诺** ,会在下层用多种手段 **尽量** 保证数据的完整送达。 34 | 35 | 当然,如果遇到光纤被意外挖断这样的极端情况,即使是神仙也不能发送成功。所以,可靠传输是指在网络基本正常的情况下数据收发必定成功,借用运维里的术语,大概就是 「3 个 9」或者「4 个 9」的程度吧。 36 | 37 | ## 应用层协议 38 | 39 | 第三个特点,HTTP 协议是一个应用层的协议。 40 | 41 | 这个特点也是不言自明的,但却很重要。 42 | 43 | 在 TCP/IP 诞生后的几十年里,虽然出现了许多的应用层协议,但它们都仅关注很小的应用领域,局限在很少的应用场景。例如 FTP 只能传输文件、SMTP 只能发送邮件、SSH 只能远程登录等,在通用的数据传输方面 **完全不能打** 。 44 | 45 | 所以 HTTP 凭借着 **可携带任意头字段和实体数据的报文结构** ,以及连接控制、缓存代理等方便易用的特性,一出现就技压群雄,迅速成为了应用层里的明星协议。只要不太苛求性能,HTTP 几乎可以传递一切东西,满足各种需求,称得上是一个万能的协议。 46 | 47 | 套用一个网上流行的段子,HTTP 完全可以用开玩笑的口吻说:不要误会,我不是针对 FTP,我是说在座的应用层各位,都是垃圾。 48 | 49 | ## 请求 - 应答 50 | 51 | 第四个特点,HTTP 协议使用的是请求 - 应答通信模式。 52 | 53 | 这个请求 - 应答模式是 HTTP 协议最根本的通信模型,通俗来讲就是 **一发一收、有来有去** ,就像是写代码时的函数调用,只要填好请求头里的字段,调用后就会收到答复。 54 | 55 | 请求 - 应答模式也明确了 HTTP 协议里通信双方的定位,**永远是请求方先发起连接和请求** ,**是主动的** ,而应答方只有在收到请求后才能答复,是被动的,如果没有请求时不会有任何动作。 56 | 57 | 当然,请求方和应答方的角色也不是绝对的,在浏览器 - 服务器的场景里,通常服务器都是应答方,但如果将它用作代理连接后端服务器,那么它就可能同时扮演请求方和应答方的角色。 58 | 59 | HTTP 的请求 - 应答模式也恰好契合了传统的 C/S(Client/Server)系统架构,请求方作为客户端、应答方作为服务器。所以,随着互联网的发展就出现了 B/S(Browser/Server)架构,用轻量级的浏览器代替笨重的客户端应用,实现零维护的瘦客户端,而服务器则摈弃私有通信协议转而使用 HTTP 协议。 60 | 61 | 此外,请求 - 应答模式也完全符合 RPC(Remote Procedure Call)的工作模式,可以把 HTTP 请求处理封装成远程函数调用,导致了 WebService、RESTful 和 gPRC 等的出现。 62 | 63 | ## 无状态 64 | 65 | 第五个特点,HTTP 协议是无状态的。 66 | 67 | 这个所谓的 **状态** 应该怎么理解呢? 68 | 69 | 状态其实就是客户端或者服务器里保存的一些数据或者标志,记录了通信过程中的一些变化信息。 70 | 71 | 你一定知道,TCP 协议是有状态的,一开始处于 CLOSED 状态,连接成功后是 ESTABLISHED 状态,断开连接后是 FIN-WAIT 状态,最后又是 CLOSED 状态。 72 | 73 | 这些状态就需要 TCP 在内部用一些数据结构去维护,可以简单地想象成是个标志量,标记当前所处的状态,例如 0 是 CLOSED,2 是 ESTABLISHED 等等。 74 | 75 | 再来看 HTTP,那么对比一下 TCP 就看出来了,**在整个协议里没有规定任何的状态** ,客户端和服务器永远是处在一种 **无知** 的状态。建立连接前两者互不知情,每次收发的报文也都是互相独立的,没有任何的联系。收发报文也不会对客户端或服务器产生任何影响,连接后也不会要求保存任何信息。 76 | 77 | **无状态** 形象地来说就是没有记忆能力。比如,浏览器发了一个请求,说「我是小明,请给我 A 文件。」,服务器收到报文后就会检查一下权限,看小明确实可以访问 A 文件,于是把文件发回给浏览器。接着浏览器还想要 B 文件,但服务器不会记录刚才的请求状态,不知道第二个请求和第一个请求是同一个浏览器发来的,所以浏览器必须还得重复一次自己的身份才行:「我是刚才的小明,请再给我 B 文件。」 78 | 79 | 我们可以再对比一下 UDP 协议,不过它是无连接也无状态的,顺序发包乱序收包,数据包发出去后就不管了,收到后也不会顺序整理。而 HTTP 是有连接无状态,顺序发包顺序收包,按照收发的顺序管理报文。 80 | 81 | 但不要忘了 HTTP 是 **灵活可扩展** 的,虽然标准里没有规定状态,但完全能够在协议的框架里给它打个补丁,增加这个特性。 82 | 83 | ## 其他特点 84 | 85 | 除了以上的五大特点,其实 HTTP 协议还可以列出非常多的特点,例如传输的实体数据可缓存可压缩、可分段获取数据、支持身份认证、支持国际化语言等。但这些并不能算是 HTTP 的基本特点,因为这都是由第一个 **灵活可扩展** 的特点所衍生出来的。 86 | 87 | ## 小结 88 | 89 | 1. HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能; 90 | 2. HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达; 91 | 3. HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据; 92 | 4. HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求; 93 | 5. HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。 94 | 95 | ## 课下作业 96 | 97 | 1. 就如同开头我讲的那样,你能说一下今天列出的这些 HTTP 的特点中哪些是优点,哪些是缺点吗? 98 | 99 | 笔者认为:以上特点在既定的场景中就是优点也可能是缺点,比如无状态,需要额外的来打补丁实现 100 | 101 | 2. 不同的应用场合有不同的侧重方面,你觉得哪个特点对你来说是最重要的呢? 102 | 103 | 笔者认为:灵活可扩展是最重要的,不然也不会屹立三十年不倒了 104 | 105 | ## 课外小贴士 106 | 107 | - 如果要 100% 保证数据收发成功就不能使用 HTTP 或则 TCP 协议了,而是要用各种消息中间件(MQ),如 RabbitMQ、ZeroMQ、Kafka 等 108 | - 以前 HTTP 协议还有一个 **无连接** 的特点,指的是协议不保持连接状态,每次请求应答后都会关闭连接,这就和 UDP 几乎一模一样了。但这样很影响性能,在 HTTP/1.1 里就改成了总是默认启用 keepalive 长连接机制,所以现在的 HTTP 已经不再是 **无连接** 的了 109 | - 注意 HTTP 的 **无状态** 特点与响应头里的 **状态码** 是完全不相关的两个概念,状态码表示的是此次报文处理的结果,并不会导致服务器内部状态变化 -------------------------------------------------------------------------------- /docs/http-protocol/03/07.md: -------------------------------------------------------------------------------- 1 | # 07 | HTTP有哪些优点?又有哪些缺点? 2 | 3 | 上一讲我介绍了 HTTP 的五个基本特点,这一讲要说的则是它的优点和缺点。其实这些也应该算是 HTTP 的特点,但这一讲会更侧重于评价它们的优劣和好坏。 4 | 5 | 上一讲我也留了两道课下作业,不知道你有没有认真思考过,今天可以一起来看看你的答案与我的观点想法是否相符,共同探讨。 6 | 7 | 不过在正式开讲之前我还要提醒你一下,**今天的讨论范围仅限于 HTTP/1.1** ,所说的优点和缺点也仅针对 HTTP/1.1。实际上,专栏后续要讲的 HTTPS 和 HTTP/2 都是对 HTTP/1.1 优点的发挥和缺点的完善。 8 | 9 | ## 简单、灵活、易于扩展 10 | 11 | 初次接触 HTTP 的人都会认为,HTTP 协议是很 **简单** 的,基本的报文格式就是 `header+body`,头部信息也是简单的文本格式,用的也都是常见的英文单词,即使不去看 RFC 文档,只靠猜也能猜出个八九不离十。 12 | 13 | 可不要小看了 **简单** 这个优点,它不仅降低了学习和使用的门槛,能够让更多的人研究和开发 HTTP 应用,而且我在 [第 1 讲](../02/01.md) 时就说过,简单蕴含了进化和扩展的可能性,所谓 **少即是多**,把简单的系统变复杂,要比把复杂的系统变简单容易得多**。** 14 | 15 | 所以,在简单这个最基本的设计理念之下,HTTP 协议又多出了 **灵活和易于扩展** 的优点。 16 | 17 | **灵活和易于扩展** 实际上是一体的,它们互为表里、相互促进,因为灵活所以才会易于扩展,而易于扩展又反过来让 HTTP 更加灵活,拥有更强的表现能力。 18 | 19 | HTTP 协议里的请求方法、URI、状态码、原因短语、头字段等每一个核心组成要素都没有被写死,允许开发者任意定制、扩充或解释,给予了浏览器和服务器最大程度的信任和自由,也正好符合了互联网自由与平等的精神——缺什么功能自己加个字段或者错误码什么的补上就是了。 20 | 21 | 「请勿跟踪」所使用的头字段 DNT(Do Not Track)就是一个很好的例子。它最早由 Mozilla 提出,用来保护用户隐私,防止网站监测追踪用户的偏好。不过可惜的是 DNT 从推出至今有差不多七八年的历史,但很多网站仍然选择无视 DNT。虽然 DNT 基本失败了,但这也正说明 HTTP 协议是灵活自由的,不会受单方面势力的压制。 22 | 23 | 灵活、易于扩展的特性还表现在 HTTP 对可靠传输的定义上,它不限制具体的下层协议,不仅可以使用 TCP、UNIX Domain Socket,还可以使用 SSL/TLS,甚至是基于 UDP 的 QUIC,下层可以随意变化,而上层的语义则始终保持稳定。 24 | 25 | ## 应用广泛、环境成熟 26 | 27 | HTTP 协议的另一大优点是 **应用广泛** ,软硬件环境都非常成熟。 28 | 29 | 随着互联网特别是移动互联网的普及,HTTP 的触角已经延伸到了世界的每一个角落:从简单的 Web 页面到复杂的 JSON、XML 数据,从台式机上的浏览器到手机上的各种 APP,从看新闻、泡论坛到购物、理财、「吃鸡」,你很难找到一个没有使用 HTTP 的地方。 30 | 31 | 不仅在应用领域,在开发领域 HTTP 协议也得到了广泛的支持。它并不限定某种编程语言或者操作系统,所以天然具有 **跨语言、跨平台** 的优越性。而且,因为本身的简单特性很容易实现,所以几乎所有的编程语言都有 HTTP 调用库和外围的开发测试工具,这一点我觉得就不用再举例了吧,你可能比我更熟悉。 32 | 33 | HTTP 广泛应用的背后还有许多硬件基础设施支持,各个互联网公司和传统行业公司都不遗余力地「触网」,购买服务器开办网站,建设数据中心、CDN 和高速光纤,持续地优化上网体验,让 HTTP 运行的越来越顺畅。 34 | 35 | **应用广泛** 的这个优点也就决定了:无论是创业者还是求职者,无论是做网站服务器还是写应用客户端,HTTP 协议都是必须要掌握的基本技能。 36 | 37 | ## 无状态 38 | 39 | 看过了两个优点,我们再来看看一把 **双刃剑** ,也就是上一讲中说到的 **无状态**,它对于 HTTP 来说既是优点也是缺点。 40 | 41 | 无状态有什么好处呢? 42 | 43 | 因为服务器没有记忆能力,所以就不需要额外的资源来记录状态信息,不仅实现上会简单一些,而且还能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。 44 | 45 | 而且,无状态也表示服务器都是相同的,没有状态的差异,所以可以很容易地组成集群,让负载均衡把请求转发到任意一台服务器,不会因为状态不一致导致处理出错,使用堆机器的笨办法轻松实现高并发高可用。 46 | 47 | 那么,无状态又有什么坏处呢? 48 | 49 | 既然服务器没有记忆能力,它就无法支持需要连续多个步骤的事务操作。例如电商购物,首先要登录,然后添加购物车,再下单、结算、支付,这一系列操作都需要知道用户的身份才行,但无状态服务器是不知道这些请求是相互关联的,每次都得问一遍身份信息,不仅麻烦,而且还增加了不必要的数据传输量。 50 | 51 | 所以,HTTP 协议最好是既无状态又有状态,不过还真有鱼和熊掌两者兼得这样的好事,这就是小甜饼 Cookie 技术(后面章节讲解)。 52 | 53 | ## 明文 54 | 55 | HTTP 协议里还有一把优缺点一体的双刃剑,就是 **明文传输**。 56 | 57 | **明文** 意思就是协议里的报文(准确地说是 header 部分)不使用二进制数据,而是用简单可阅读的文本形式。 58 | 59 | 对比 TCP、UDP 这样的二进制协议,它的优点显而易见,不需要借助任何外部工具,用浏览器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,为我们的开发调试工作带来极大的便利。 60 | 61 | 当然,明文的缺点也是一样显而易见,HTTP 报文的所有信息都会暴露在光天化日之下,**在漫长的传输链路的每一个环节上都毫无隐私可言** ,不怀好意的人只要侵入了这个链路里的某个设备,简单地旁路一下流量,就可以实现对通信的窥视。 62 | 63 | 你有没有听说过免费 WiFi 陷阱之类的新闻呢? 64 | 65 | 黑客就是利用了 HTTP 明文传输的缺点,在公共场所架设一个 WiFi 热点开始钓鱼,诱骗网民上网。一旦你连上了这个 WiFi 热点,**所有的流量都会被截获保存** ,里面如果有银行卡号、网站密码等敏感信息的话那就危险了,黑客拿到了这些数据就可以冒充你为所欲为。 66 | 67 | ## 不安全 68 | 69 | 与明文缺点相关但不完全等同的另一个缺点是不安全。 70 | 71 | 安全有很多的方面,明文只是 **机密** 方面的一个缺点,在 **身份认证** 和 **完整性校验** 这两方面 HTTP 也是欠缺的。 72 | 73 | 身份认证简单来说就是 **怎么证明你就是你** 。在现实生活中比较好办,你可以拿出身份证、驾照或者护照,上面有照片和权威机构的盖章,能够证明你的身份。 74 | 75 | 但在虚拟的网络世界里这却是个麻烦事。HTTP 没有提供有效的手段来确认通信双方的真实身份。虽然协议里有一个基本的认证机制,但因为刚才所说的明文传输缺点,这个机制几乎可以说是「纸糊的」,非常容易被攻破。如果仅使用 HTTP 协议,很可能你会连到一个页面一模一样但却是个假冒的网站,然后再被钓走各种私人信息。 76 | 77 | HTTP 协议也不支持「完整性校验」,数据在传输过程中容易被窜改而无法验证真伪。 78 | 79 | 比如,你收到了一条银行用 HTTP 发来的消息:小明向你转账一百元,你无法知道小明是否真的就只转了一百元,也许他转了一千元或者五十元,但被黑客窜改成了一百元,真实情况到底是什么样子 HTTP 协议没有办法给你答案。 80 | 81 | 虽然银行可以用 MD5、SHA1 等算法给报文加上数字摘要,但还是因为明文这个致命缺点,黑客可以连同摘要一同修改,最终还是判断不出报文是否被窜改。 82 | 83 | 为了解决 HTTP 不安全的缺点,所以就出现了 HTTPS,这个我们以后再说。 84 | 85 | ## 性能 86 | 87 | 最后我们来谈谈 HTTP 的性能,可以用六个字来概括:**不算差,不够好** 。 88 | 89 | HTTP 协议基于 TCP/IP,并且使用了请求 - 应答的通信模式,所以性能的关键就在这两点上。 90 | 91 | 必须要说的是,TCP 的性能是不差的,否则也不会纵横互联网江湖四十余载了,而且它已经被研究的很透,集成在操作系统内核里经过了细致的优化,足以应付大多数的场景。 92 | 93 | 只可惜如今的江湖已经不是从前的江湖,现在互联网的特点是移动和高并发,不能保证稳定的连接质量,所以在 TCP 层面上 HTTP 协议有时候就会表现的不够好。 94 | 95 | 而 **请求 - 应答** 模式则加剧了 HTTP 的性能问题,这就是著名的 **队头阻塞**(Head-of-line blocking),当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。 96 | 97 | 为了解决这个问题,就诞生出了一个专门的研究课题 Web 性能优化,HTTP 官方标准里就有 **缓存** 一章(RFC7234),非官方的花招就更多了,例如切图、数据内嵌与合并,域名分片、JavaScript 黑科技等等。 98 | 99 | 不过现在已经有了终极解决方案:HTTP/2 和 HTTP/3,后面我也会展开来讲。 100 | 101 | ## 小结 102 | 103 | 1. HTTP 最大的优点是简单、灵活和易于扩展; 104 | 2. HTTP 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施; 105 | 3. HTTP 是无状态的,可以轻松实现集群化,扩展性能,但有时也需要用 Cookie 技术来实现“有状态”; 106 | 4. HTTP 是明文传输,数据完全肉眼可见,能够方便地研究分析,但也容易被窃听; 107 | 5. HTTP 是不安全的,无法验证通信双方的身份,也不能判断报文是否被窜改; 108 | 6. HTTP 的性能不算差,但不完全适应现在的互联网,还有很大的提升空间。 109 | 110 | 虽然 HTTP 免不了这样那样的缺点,但你也不要怕,别忘了它有一个最重要的灵活可扩展的优点,所有的缺点都可以在这个基础上想办法解决,接下来的进阶篇和安全篇就会讲到。 111 | 112 | ## 课下作业 113 | 114 | 1. 你最喜欢的 HTTP 优点是哪个?最不喜欢的缺点又是哪个?为什么? 115 | 2. 你能够再进一步扩展或补充论述今天提到这些优点或缺点吗? 116 | 3. 你能试着针对这些缺点提出一些自己的解决方案吗? 117 | 118 | ## 课外小贴士 119 | 120 | - 简洁至上,也是 Apple 公司前领导人乔布斯所崇尚的设计理念 121 | - 与 DNT 类似的还有 P3P(Platform for Privacy Preferences Project)字段,用来控制网站对用户的隐私访问,同样也失败了 122 | - 处于安全原因,绝大多数网站都封禁了 80/8080 以外的端口号,只允许 HTTP 协议穿透,这也是造成 HTTP 流行的客观原因之一 123 | - HTTP/1.1 以文本格式传输 header,有严重的数据冗余,也影响了它的性能 -------------------------------------------------------------------------------- /docs/http-protocol/03/README.md: -------------------------------------------------------------------------------- 1 | # 03 | 基础篇 2 | 3 | - [01 | 键入网址再按下回车,后面究竟发生了什么?](./01.md) 4 | - [02 | HTTP 报文是什么样子的?](./02.md) 5 | - [03 | 应该如何理解请求方法?](./03.md) 6 | - [04 | 你能写出正确的网址吗?](./04.md) 7 | - [05 | 响应状态码该怎么用?](./05.md) 8 | - [06 | HTTP 有哪些特点?](./06.md) 9 | - [07 | HTTP 有哪些优点?又有哪些缺点?](./07.md) 10 | -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/174bb72bad50127ac84427a72327f095.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/174bb72bad50127ac84427a72327f095.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/1fe4c1121c50abcf571cebd677a8bdea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/1fe4c1121c50abcf571cebd677a8bdea.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/36108959084392065f36dff3e12967b9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/36108959084392065f36dff3e12967b9.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/3cdc8ac71b80929f4a94dfeb9ffe4b6d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/3cdc8ac71b80929f4a94dfeb9ffe4b6d.jpg -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/46581d7e1058558d8e12c1bf37d30d2a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/46581d7e1058558d8e12c1bf37d30d2a.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/5717c967b8d46e5ba438e1d8ed605a1b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/5717c967b8d46e5ba438e1d8ed605a1b.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/62e061618977565c22c2cf09930e1d3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/62e061618977565c22c2cf09930e1d3c.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/7808b195c921e0685958c20509855d4a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/7808b195c921e0685958c20509855d4a.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/86e3c635e9a9ab0abd523c01fc181cb0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/86e3c635e9a9ab0abd523c01fc181cb0.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/8a5bddd3d8046daf7032c7d60a3d1a19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/8a5bddd3d8046daf7032c7d60a3d1a19.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/a1477b903cd4d5a69686683c0dbc3300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/a1477b903cd4d5a69686683c0dbc3300.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/b191c8760c8ad33acd9bb005b251a2df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/b191c8760c8ad33acd9bb005b251a2df.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/cb0d1d2c56400fe9c9988ee32842b175.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/cb0d1d2c56400fe9c9988ee32842b175.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/df4696154fc8837e33117d8d6ab1776d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/df4696154fc8837e33117d8d6ab1776d.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/f1970aaecad58fb18938e262ea7f311c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/f1970aaecad58fb18938e262ea7f311c.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/ff41d020c7a27d1e8191057f0e658b38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/ff41d020c7a27d1e8191057f0e658b38.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304112013792.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304112013792.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304115745790.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304115745790.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304160835980.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304160835980.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304161416507.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304161416507.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304164924545.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304164924545.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210304165037886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210304165037886.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210305100326091.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210305100326091.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210305100724706.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210305100724706.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210305105208799.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210305105208799.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210305105941548.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210305105941548.png -------------------------------------------------------------------------------- /docs/http-protocol/03/assets/image-20210305131825952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/03/assets/image-20210305131825952.png -------------------------------------------------------------------------------- /docs/http-protocol/04/README.md: -------------------------------------------------------------------------------- 1 | # 03 | 进阶篇 2 | 3 | - [01 | 海纳百川:HTTP 的实体数据](./01.md) 4 | - [02 | 把大象装进冰箱:HTTP 传输大文件的方法](./02.md) 5 | - [03 | 排队也要讲效率:HTTP 的连接管理](./03.md) 6 | - [04 | 四通八达:HTTP 的重定向和跳转](./04.md) 7 | - [05 | 让我知道你是谁:HTTP 的 Cookie 机制](./05.md) 8 | - [06 | 生鲜速递:HTTP 的缓存控制](./06.md) 9 | - [07 | 良心中间商:HTTP 的代理服务](./07.md) 10 | - [08 | 冷链周转:HTTP 的缓存代理](./08.md) 11 | -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/006059602ee75b176a80429f49ffc9aa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/006059602ee75b176a80429f49ffc9aa.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/0e9bcd6922fa8908bdba79d98ae5fa10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/0e9bcd6922fa8908bdba79d98ae5fa10.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/25e7b09cf8cb4eaebba42b4598192410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/25e7b09cf8cb4eaebba42b4598192410.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/28237ef93ce0ddca076d2dc19c16fdf9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/28237ef93ce0ddca076d2dc19c16fdf9.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/37fbfef0490a20179c0ee274dccf5e6e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/37fbfef0490a20179c0ee274dccf5e6e.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/4d210fa1adccb7299d632ed7e66391e8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/4d210fa1adccb7299d632ed7e66391e8.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/5191bce1329efa157a6cc37ab9e789b9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/5191bce1329efa157a6cc37ab9e789b9.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/52a3bd760584972011f6be1a5258e2d7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/52a3bd760584972011f6be1a5258e2d7.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/54315ed9ac37fbc6547258040f00a80c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/54315ed9ac37fbc6547258040f00a80c.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/57b3d80234a1f1b8c538a376aa01d3b4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/57b3d80234a1f1b8c538a376aa01d3b4.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/5a247e9e5bf66f5ac3316fddf4e2b254.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/5a247e9e5bf66f5ac3316fddf4e2b254.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/5e8d10b5758685850aeed2a473a6cdc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/5e8d10b5758685850aeed2a473a6cdc2.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/66a6d229058c7072ab5b28ef518da302.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/66a6d229058c7072ab5b28ef518da302.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/6a6d30a89fb085d5f1773a887aaf5572.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/6a6d30a89fb085d5f1773a887aaf5572.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/81b9609c5f50281ec3d53fb4d299b690.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/81b9609c5f50281ec3d53fb4d299b690.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/8a67535620ab9c7764560363f83982b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/8a67535620ab9c7764560363f83982b2.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/8c1fe47a7ca4b52702a6a14956033f7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/8c1fe47a7ca4b52702a6a14956033f7c.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/9f6cca61802d65d063e24aa9ca7c38a4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/9f6cca61802d65d063e24aa9ca7c38a4.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/a1968821f214df4a3ae16c9b30f99a5b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/a1968821f214df4a3ae16c9b30f99a5b.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/a8accc7e1836fa348c2fbd29f494069d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/a8accc7e1836fa348c2fbd29f494069d.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/b2118315a977969ddfcc7ab9d26cb358.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/b2118315a977969ddfcc7ab9d26cb358.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/b239d0804be630ce182e24ea9e4ab237.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/b239d0804be630ce182e24ea9e4ab237.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/c5aa6d5f82e8cc1a35772293972446e7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/c5aa6d5f82e8cc1a35772293972446e7.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/dd65b95de96d78552a92757d58de6a37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/dd65b95de96d78552a92757d58de6a37.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/f2a12669e997ea6dc0f2228bcaf65a06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/f2a12669e997ea6dc0f2228bcaf65a06.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/fffa3a65e367c496428f3c0c4dac8a37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/fffa3a65e367c496428f3c0c4dac8a37.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210305185305993.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210305185305993.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210305192551220.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210305192551220.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210305193331910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210305193331910.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210305193408952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210305193408952.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210305195213500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210305195213500.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306102133840.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306102133840.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306112247582.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306112247582.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306113302710.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306113302710.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306113321863.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306113321863.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306160058378.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306160058378.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306162038091.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306162038091.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306163959411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306163959411.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306171215940.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306171215940.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306171253309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306171253309.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210306171441154.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210306171441154.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210308184306725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210308184306725.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210308185222487.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210308185222487.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210308193039343.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210308193039343.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210308193305833.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210308193305833.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210308193846660.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210308193846660.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210309092029949.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210309092029949.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210309092106572.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210309092106572.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210309092631983.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210309092631983.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210309095056568.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210309095056568.png -------------------------------------------------------------------------------- /docs/http-protocol/04/assets/image-20210309113745228.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/04/assets/image-20210309113745228.png -------------------------------------------------------------------------------- /docs/http-protocol/05/README.md: -------------------------------------------------------------------------------- 1 | # 05 | 安全篇 2 | 3 | - [01 | TLS 又是什么?](./01.md) 4 | - [02 | 固若金汤的根本: 对称加密与非对称加密](./02.md) 5 | - [03 | 固若金汤的根本: 数字签名与证书](./03.md) 6 | - [04 | 信任始于握手: TLS 1.2 连接过程解析](./04.md) 7 | - [05 | 更好更快的握手: TLS 1.3 特性解析](./05.md) 8 | - [06 | 连接太慢该怎么办 HTTPS 的优化](./06.md) 9 | - [07 | 我应该迁移到 HTTPS 吗?](./07.md) 10 | -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/0274e31e74e92b61892ec11cc3cd58e7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/0274e31e74e92b61892ec11cc3cd58e7.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/119cfd261db49550411a12b1f6d826ab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/119cfd261db49550411a12b1f6d826ab.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/125fe443a147ed38a97a4492045d98ac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/125fe443a147ed38a97a4492045d98ac.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/2865d2c77466efb7a480833bcb27f9d8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/2865d2c77466efb7a480833bcb27f9d8.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/40fbb989a9fd2217320ab287e80e1fb0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/40fbb989a9fd2217320ab287e80e1fb0.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/44d8c3349ffdea5a1e4e13d222bc743c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/44d8c3349ffdea5a1e4e13d222bc743c.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/4d1df4d07dbb1c2500fc4ea69ecf7ab0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/4d1df4d07dbb1c2500fc4ea69ecf7ab0.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/50d57e18813e18270747806d5d73f0a3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/50d57e18813e18270747806d5d73f0a3.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/69493b53f1b1d540acf886ebf021a26c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/69493b53f1b1d540acf886ebf021a26c.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/70b36338611d5a249a7d2fc448f06d42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/70b36338611d5a249a7d2fc448f06d42.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/7a2bc39fdbb421cf72a01e887e9156db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/7a2bc39fdbb421cf72a01e887e9156db.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/84a79826588ca35bf6ddcade027597d2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/84a79826588ca35bf6ddcade027597d2.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/89344c2e493600b486d5349a84318417.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/89344c2e493600b486d5349a84318417.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/8f0813e9555ba1a40bd2170734aced9c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/8f0813e9555ba1a40bd2170734aced9c.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/8feab67c25a534f8c72077680927ab49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/8feab67c25a534f8c72077680927ab49.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/9caba6d4b527052bbe7168ed4013011e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/9caba6d4b527052bbe7168ed4013011e.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/a55051ca7ae941ae04791cdddde6658f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/a55051ca7ae941ae04791cdddde6658f.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/a662d410dfdaa8ab44b36cbb68ab8d1b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/a662d410dfdaa8ab44b36cbb68ab8d1b.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/b452ceb3cbfc5c644a3053f2054b1aba.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/b452ceb3cbfc5c644a3053f2054b1aba.jpg -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/c2e10e9afa1393281b5633b1648f2696.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/c2e10e9afa1393281b5633b1648f2696.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/c41da1f1b1bdf4dc92c46330542c5ded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/c41da1f1b1bdf4dc92c46330542c5ded.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/cb9a89055eadb452b7835ba8db7c3ad2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/cb9a89055eadb452b7835ba8db7c3ad2.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/e41f87110aeea3e548d58cc35a478e85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/e41f87110aeea3e548d58cc35a478e85.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/eeeb1d30acbc0e69541ce0620346b765.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/eeeb1d30acbc0e69541ce0620346b765.jpg -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210309154706676.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210309154706676.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210309160439908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210309160439908.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210309161310028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210309161310028.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310094117128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310094117128.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310094132913.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310094132913.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310094519340.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310094519340.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310105548742.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310105548742.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310111820297.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310111820297.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310112426920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310112426920.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310113404586.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310113404586.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310141746246.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310141746246.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310145052314.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310145052314.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310165429813.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310165429813.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210310165529095.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210310165529095.png -------------------------------------------------------------------------------- /docs/http-protocol/05/assets/image-20210311102432156.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/05/assets/image-20210311102432156.png -------------------------------------------------------------------------------- /docs/http-protocol/06/README.md: -------------------------------------------------------------------------------- 1 | # 06 | 飞翔篇 2 | 3 | - [01 | 时代之风:HTTP/2 特性概览](./01.md) 4 | - [02 | 时代之风:HTTP/2 内核剖析](./02.md) 5 | - [03 | 未来之路:HTTP/3 展望](./03.md) 6 | - [04 | 我应该迁移到 HTTP/2 吗?](./04.md) 7 | -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/19be1138574589458c96040e1a23b3a7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/19be1138574589458c96040e1a23b3a7.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/2606cbaa1a2e606a3640cc1825f5605b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/2606cbaa1a2e606a3640cc1825f5605b.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/57b0d1814567e6317c8de1e3c04b7503.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/57b0d1814567e6317c8de1e3c04b7503.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/5fa90e123c68855140e2b40f4f73c56f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/5fa90e123c68855140e2b40f4f73c56f.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/615b49f9d13de718a34b9b98359066e3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/615b49f9d13de718a34b9b98359066e3.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/688630945be2dd51ca62515ae498db33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/688630945be2dd51ca62515ae498db33.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/769dcf953ddafc4573a0b4c3f0321f0c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/769dcf953ddafc4573a0b4c3f0321f0c.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/83c9f0ecad361ba8ef8f3b73d6872f1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/83c9f0ecad361ba8ef8f3b73d6872f1a.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/8903a45c632b64c220299d5bc64ef717.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/8903a45c632b64c220299d5bc64ef717.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/8fe2cbd57410299a1a36d7eb105ea896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/8fe2cbd57410299a1a36d7eb105ea896.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/9ab3858bf918dffafa275c400d78d910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/9ab3858bf918dffafa275c400d78d910.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/ae0c482ea0c3b8ebc71924b19feb9b3b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/ae0c482ea0c3b8ebc71924b19feb9b3b.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/b49595a5a425c0e67d46ee17cc212e7e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/b49595a5a425c0e67d46ee17cc212e7e.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/d263202e431c84db0fd6c7e6b1980f03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/d263202e431c84db0fd6c7e6b1980f03.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/d389ac436d8100406a4a488a69563cb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/d389ac436d8100406a4a488a69563cb4.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/d8f8606948bbd63c31466e464c1956b0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/d8f8606948bbd63c31466e464c1956b0.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/d8fd32a4d044f2078b3a260e4478c5bc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/d8fd32a4d044f2078b3a260e4478c5bc.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/fd99221ede55272a998760cc6aaa037a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/fd99221ede55272a998760cc6aaa037a.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/fdf1a6916c3ac22b6fb7628de3d7ddd1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/fdf1a6916c3ac22b6fb7628de3d7ddd1.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/image-20210312192121396.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/image-20210312192121396.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/image-20210312192422763.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/image-20210312192422763.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/image-20210312192806844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/image-20210312192806844.png -------------------------------------------------------------------------------- /docs/http-protocol/06/assets/image-20210312193750452.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/06/assets/image-20210312193750452.png -------------------------------------------------------------------------------- /docs/http-protocol/07/README.md: -------------------------------------------------------------------------------- 1 | # 07 | 探索篇 2 | 3 | - [01 | Nginx:高性能的 Web 服务器](./01.md) 4 | - [02 | OpenResty:更灵活的 Web 服务器](./02.md) 5 | - [03 | WAF:保护我们的网络服务](./03.md) 6 | - [04 | CDN:加速我们的网络服务](./04.md) 7 | - [05 | WebSocket:沙盒里的 TCP](./05.md) 8 | -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/29d33e972dda5a27aa4773eea896a8c4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/29d33e972dda5a27aa4773eea896a8c4.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/3689312a970bae0e949b017ad45438df.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/3689312a970bae0e949b017ad45438df.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/3e94fbd78ed043e88c443f6416f99dc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/3e94fbd78ed043e88c443f6416f99dc1.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/41318c867fda8a536d0e3db6f9987030.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/41318c867fda8a536d0e3db6f9987030.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/413605355db69278cb137b318b70b3b9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/413605355db69278cb137b318b70b3b9.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/46d1dbbb545fcf3cfb53407e0afe9a5b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/46d1dbbb545fcf3cfb53407e0afe9a5b.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/4c6832cdce34133c9ed89237fb9d5059.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/4c6832cdce34133c9ed89237fb9d5059.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/4f24aa3f53969b71baaf7d9c7cf68fd5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/4f24aa3f53969b71baaf7d9c7cf68fd5.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/6c39e76d58d9f17872c83ae72908faca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/6c39e76d58d9f17872c83ae72908faca.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/84e9fa337f2b4c2c9f14760feb41c903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/84e9fa337f2b4c2c9f14760feb41c903.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/8f007bb0e403b6cc28493565f709c997.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/8f007bb0e403b6cc28493565f709c997.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/9f7b79c43c476890f03c2c716a20f301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/9f7b79c43c476890f03c2c716a20f301.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/9fc3df52df7d6c11aa02b8013f8e9bc6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/9fc3df52df7d6c11aa02b8013f8e9bc6.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/add929f8439c64f29db720d30f7de548.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/add929f8439c64f29db720d30f7de548.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/c5df0592cc8aef91ba961f7fab5a4a0b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/c5df0592cc8aef91ba961f7fab5a4a0b.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/c91ee4815097f5f9059ab798bb841594.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/c91ee4815097f5f9059ab798bb841594.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/e8369d077454e5b92e3722e7090551a3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/e8369d077454e5b92e3722e7090551a3.png -------------------------------------------------------------------------------- /docs/http-protocol/07/assets/ee6685c7d3c673b95e46d582828eee28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/07/assets/ee6685c7d3c673b95e46d582828eee28.png -------------------------------------------------------------------------------- /docs/http-protocol/08/assets/3a8ab1e3ace62d184adc2dc595d32f62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/08/assets/3a8ab1e3ace62d184adc2dc595d32f62.png -------------------------------------------------------------------------------- /docs/http-protocol/08/assets/5011b2998d2a0c58c87e31000d551732.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/08/assets/5011b2998d2a0c58c87e31000d551732.png -------------------------------------------------------------------------------- /docs/http-protocol/08/assets/5cd2a91b4466ee63f48bc049ba61b9f4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/08/assets/5cd2a91b4466ee63f48bc049ba61b9f4.png -------------------------------------------------------------------------------- /docs/http-protocol/08/assets/d77ee484b62910b8eedce0ecddb305a2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zq99299/note-book2/5e7295efddf0d1ad0b2e21586caffc16bf5dcd46/docs/http-protocol/08/assets/d77ee484b62910b8eedce0ecddb305a2.png -------------------------------------------------------------------------------- /docs/http-protocol/09.md: -------------------------------------------------------------------------------- 1 | # 参考资源 2 | ## RFC 3 | 4 | HTTP 5 | 6 | * [RFC2045](https://tools.ietf.org/html/rfc2045) - MIME(old) 7 | * [RFC2616](https://tools.ietf.org/html/rfc2616) - HTTP/1.1(old) 8 | * [RFC3986](https://tools.ietf.org/html/rfc3986) - URI 9 | * [RFC6265](https://tools.ietf.org/html/rfc6265) - Cookie 10 | * [RFC6648](https://tools.ietf.org/html/rfc6648) - Deprecating the "X-" Prefix 11 | * [RFC6838](https://tools.ietf.org/html/rfc6838) - MIME(new) 12 | * [RFC7230](https://tools.ietf.org/html/rfc7230) - HTTP/1.1(new) 13 | * [RFC7540](https://tools.ietf.org/html/rfc7540) - HTTP/2 14 | * [RFC7541](https://tools.ietf.org/html/rfc7541) - HPACK in HTTP/2 15 | * [RFC7838](https://tools.ietf.org/html/rfc7838) - Alt-Svc 16 | * [RFC????](https://tools.ietf.org/html/draft-ietf-quic-http) - HTTP/3(Draft) 17 | 18 | HTTPS/SSL/TLS 19 | 20 | * [RFC1122](https://tools.ietf.org/html/rfc1122) - TCP/IP Stack 21 | * [RFC2818](https://tools.ietf.org/html/rfc2818) - HTTPS 22 | * [RFC3526](https://tools.ietf.org/html/rfc3526) - DH Modular Exponential 23 | * [RFC4492](https://tools.ietf.org/html/rfc4492) - ECC Suites for TLS(old) 24 | * [RFC5077](https://tools.ietf.org/html/rfc5077) - TLS Session Resumption 25 | * [RFC5116](https://tools.ietf.org/html/rfc5116) - AES AEAD 26 | * [RFC5246](https://tools.ietf.org/html/rfc5246) - TLS 1.2 27 | * [RFC5280](https://tools.ietf.org/html/rfc5280) - X.509 v3 28 | * [RFC5288](https://tools.ietf.org/html/rfc5288) - AES_GCM Suites 29 | * [RFC5289](https://tools.ietf.org/html/rfc5289) - ECC_AES_GCM Suites 30 | * [RFC6066](https://tools.ietf.org/html/rfc6066) - TLS Extension(SNI) 31 | * [RFC6797](https://tools.ietf.org/html/rfc6797) - HSTS 32 | * [RFC6960](https://tools.ietf.org/html/rfc6960) - OCSP 33 | * [RFC6961](https://tools.ietf.org/html/rfc6961) - OCSP Stapling 34 | * [RFC7301](https://tools.ietf.org/html/rfc7301) - ALPN 35 | * [RFC7525](https://tools.ietf.org/html/rfc7525) - Recommendations for TLS 36 | * [RFC7748](https://tools.ietf.org/html/rfc7748) - ECC x25519 37 | * [RFC7918](https://tools.ietf.org/html/rfc7918) - False Start 38 | * [RFC8032](https://tools.ietf.org/html/rfc8032) - EdDSA 39 | * [RFC8422](https://tools.ietf.org/html/rfc8422) - ECC Suites for TLS(new) 40 | * [RFC8439](https://tools.ietf.org/html/rfc8439) - ChaCha-Poly1305 41 | * [RFC8446](https://tools.ietf.org/html/rfc8446) - TLS 1.3 42 | * [RFC8470](https://tools.ietf.org/html/rfc8470) - Using Early Data in HTTP 43 | * [RFC8484](https://tools.ietf.org/html/rfc8484) - DNS over HTTPS 44 | * [RFC8555](https://tools.ietf.org/html/rfc8555) - ACME 45 | 46 | Others 47 | 48 | * [RFC2324](https://tools.ietf.org/html/rfc2324) - HTCPCP 49 | * [RFC4122](https://tools.ietf.org/html/rfc4122) - UUID/GUID 50 | * [RFC4648](https://tools.ietf.org/html/rfc4648) - Base16/32/64 51 | * [RFC6455](https://tools.ietf.org/html/rfc6455) - WebSocket 52 | * [RFC7168](https://tools.ietf.org/html/rfc7168) - HTCPCP-TEA 53 | * [QUIC-Draft](https://quicwg.org/) - QUIC-Draft 54 | 55 | 56 | ## Websites 57 | 58 | * [Nginx](http://nginx.org/) - Nginx Website 59 | * [OpenResty](http://openresty.org/) - OpenResty Website 60 | * [OpenSSL](https://www.openssl.org/) - OpenSSL 61 | * [Let's encrypt](https://letsencrypt.org/) - Let's encrypt 62 | * [SSLLabs](https://www.ssllabs.com/) - SSLLabs 63 | * [ModSecurity](http://modsecurity.org/) - ModSecurity 64 | * [BIND9](https://www.isc.org/bind/) - BIND9 65 | * [WebPageTest](https://www.webpagetest.org/) - WebPageTest 66 | 67 | ## Dev Links 68 | 69 | * [ngx_lua](https://github.com/openresty/lua-nginx-module) - lua-nginx-module 70 | * [stream_lua](https://github.com/openresty/stream-lua-nginx-module) - stream-lua-nginx-module 71 | * [lua-resty-core](https://github.com/openresty/lua-resty-core) - lua-resty-core 72 | 73 | ## See Also 74 | 75 | * [《C++实战笔记》](https://time.geekbang.org/column/intro/309) 76 | * [annotated_nginx](https://github.com/chronolaw/annotated_nginx) - 注释nginx,学习研究源码 77 | * [ngx_ansic_dev](https://github.com/chronolaw/ngx_ansic_dev) - Nginc ANSI C Development 78 | * [openresty_dev](https://github.com/chronolaw/openresty_dev) - OpenResty/Lua Programming 79 | * [favorite-nginx](https://github.com/chronolaw/favorite-nginx) - Selected favorite nginx modules and resources. 80 | * [boost guide](https://github.com/chronolaw/boost_guide.git) - Sample code for Boost library Guide. 81 | * [professional_boost](https://github.com/chronolaw/professional_boost.git) - Professional boost development. 82 | -------------------------------------------------------------------------------- /docs/http-protocol/README.md: -------------------------------------------------------------------------------- 1 | # 透视 HTTP 协议 2 | 3 | - [01 | 开篇](./01/) 4 | - [02 | 破冰篇](./02/) 5 | - [01 | 时势与英雄:HTTP 的前世今生](./02/01.md) 6 | - [02 | HTTP 是什么?HTTP 又不是什么?](./02/02.md) 7 | - [03 | HTTP 世界全览:与 HTTP 相关的各种概念](./02/03.md) 8 | - [04 | HTTP 世界全览:与 HTTP 相关的各种协议](./02/04.md) 9 | - [05 | 常说的四层和七层到底是什么?五层、六层哪去了?](./02/05.md) 10 | - [06 | 域名里有哪些门道?](./02/06.md) 11 | - [07 | 自己动手,搭建 HTTP 实验环境](./02/07.md) 12 | 13 | - [03 | 基础篇](./03/) 14 | - [01 | 键入网址再按下回车,后面究竟发生了什么?](./03/01.md) 15 | - [02 | HTTP 报文是什么样子的?](./03/02.md) 16 | - [03 | 应该如何理解请求方法?](./03/03.md) 17 | - [04 | 你能写出正确的网址吗?](./03/04.md) 18 | - [05 | 响应状态码该怎么用?](./03/05.md) 19 | - [06 | HTTP 有哪些特点?](./03/06.md) 20 | - [07 | HTTP 有哪些优点?又有哪些缺点?](./03/07.md) 21 | - [04 | 进阶篇](./04/) 22 | - [01 | 海纳百川:HTTP 的实体数据](./04/01.md) 23 | - [02 | 把大象装进冰箱:HTTP 传输大文件的方法](./04/02.md) 24 | - [03 | 排队也要讲效率:HTTP 的连接管理](./04/03.md) 25 | - [04 | 四通八达:HTTP 的重定向和跳转](./04/04.md) 26 | - [05 | 让我知道你是谁:HTTP 的 Cookie 机制](./04/05.md) 27 | - [06 | 生鲜速递:HTTP 的缓存控制](./04/06.md) 28 | - [07 | 良心中间商:HTTP 的代理服务](./04/07.md) 29 | - [08 | 冷链周转:HTTP 的缓存代理](./04/08.md) 30 | - [05 | 安全篇](./05/) 31 | - [01 | TLS 又是什么?](./05/01.md) 32 | - [02 | 固若金汤的根本: 对称加密与非对称加密](./05/02.md) 33 | - [03 | 固若金汤的根本: 数字签名与证书](./05/03.md) 34 | - [04 | 信任始于握手: TLS 1.2 连接过程解析](./05/04.md) 35 | - [05 | 更好更快的握手: TLS 1.3 特性解析](./05/05.md) 36 | - [06 | 连接太慢该怎么办 HTTPS 的优化](./05/06.md) 37 | - [07 | 我应该迁移到 HTTPS 吗?](./05/07.md) 38 | - [06 | 飞翔篇](./06/) 39 | - [01 | 时代之风:HTTP/2 特性概览](./06/01.md) 40 | - [02 | 时代之风:HTTP/2 内核剖析](./06/02.md) 41 | - [03 | 未来之路:HTTP/3 展望](./06/03.md) 42 | - [04 | 我应该迁移到 HTTP/2 吗?](./06/04.md) 43 | - [07 | 探索篇](./07/) 44 | - [01 | Nginx:高性能的 Web 服务器](./07/01.md) 45 | - [02 | OpenResty:更灵活的 Web 服务器](./07/02.md) 46 | - [03 | WAF:保护我们的网络服务](./07/03.md) 47 | - [04 | CDN:加速我们的网络服务](./07/04.md) 48 | - [05 | WebSocket:沙盒里的 TCP](./07/05.md) 49 | - [08 | 总结篇: HTTP 性能优化面面观](./08/) 50 | - [RFC 地址与部分推荐](./09.md) 51 | -------------------------------------------------------------------------------- /docs/http-protocol/index.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | return [ 3 | '', 4 | '01/', 5 | { 6 | title: '02 | 破冰篇', 7 | path: '/http-protocol/02/', 8 | collapsable: true, 9 | children: [ 10 | '02/01.md', 11 | '02/02.md', 12 | '02/03.md', 13 | '02/04.md', 14 | '02/05.md', 15 | '02/06.md', 16 | '02/07.md' 17 | ] 18 | }, 19 | { 20 | title: '03 | 基础篇', 21 | path: '/http-protocol/03/', 22 | collapsable: true, 23 | children: [ 24 | '03/01.md', 25 | '03/02.md', 26 | '03/03.md', 27 | '03/04.md', 28 | '03/05.md', 29 | '03/06.md', 30 | '03/07.md' 31 | ] 32 | }, 33 | { 34 | title: '04 | 进阶篇', 35 | path: '/http-protocol/04/', 36 | collapsable: true, 37 | children: [ 38 | '04/01.md', 39 | '04/02.md', 40 | '04/03.md', 41 | '04/04.md', 42 | '04/05.md', 43 | '04/06.md', 44 | '04/07.md', 45 | '04/08.md' 46 | ] 47 | }, 48 | { 49 | title: '05 | 安全篇', 50 | path: '/http-protocol/05/', 51 | collapsable: true, 52 | children: [ 53 | '05/01.md', 54 | '05/02.md', 55 | '05/03.md', 56 | '05/04.md', 57 | '05/05.md', 58 | '05/06.md', 59 | '05/07.md' 60 | ] 61 | }, 62 | { 63 | title: '06 | 飞翔篇', 64 | path: '/http-protocol/06/', 65 | collapsable: true, 66 | children: [ 67 | '06/01.md', 68 | '06/02.md', 69 | '06/03.md', 70 | '06/04.md' 71 | ] 72 | }, 73 | { 74 | title: '07 | 探索篇', 75 | path: '/http-protocol/07/', 76 | collapsable: true, 77 | children: [ 78 | '07/01.md', 79 | '07/02.md', 80 | '07/03.md', 81 | '07/04.md', 82 | '07/05.md' 83 | ] 84 | }, 85 | '08/', 86 | '09.md' 87 | ] 88 | } 89 | -------------------------------------------------------------------------------- /docs/monitor-tuning/00.md: -------------------------------------------------------------------------------- 1 | # 为什么要学习这课程? 2 | 3 | **JAVA 性能监控与调优**,在开发阶段下基本上不用,但是在 **生产环境** 下就比较重要了。 4 | 5 | 生产环境比较复杂: 6 | 7 | 1. 硬件问题、网络问题、CPU 利用率高 8 | 9 | 2. 出现问题后不好进行定位 10 | 11 | 因为无法像开发环境下那样随随便便就重启应用、修改日志增加日志输出等手段,来进行定位 12 | 13 | 所以对生产环境进行监控是非常有必要的。这里不讲解基于硬件的监控,我们聚焦在 **对 JAVA 应用的性能做监控与调优** 14 | 15 | ## 你将迈过哪些坎? 16 | 17 | - 生产环境发生了内存溢出如何处理? 18 | - 生产环境应该给服务器分配多少内存合适? 19 | - 如何对垃圾收集器的性能进行调优? 20 | - 生产环境 CPU 负载彪高该如何处理? 21 | - 生产环境应该给应用分配多少线程合适? 22 | - 不加 log 如何确定请求是否执行了某一行代码? 23 | - 不加 log 如何实时查看某个方法的入参与返回值? 24 | - JVM 的字节码是什么东西? 25 | - 循环体中做字符串 `+` 拼接为什么效率低? 26 | - 字符串 `+` 拼接一定就是 StringBuilder.append 吗? 27 | - String 常量池是咋回事? 28 | - `i++` 与 `++i` 到底哪种写法效率更高? 29 | 30 | ## 你能收获什么? 31 | 32 | - 熟练使用各种监控和调试工具 33 | 34 | - 从容应对生产环境中遇到的各种调试和性能问题 35 | 36 | - 熟悉 JVM 的字节码指令 37 | 38 | 因为在源码层面上很多问题无法看的很清楚,编译器将很多语法糖都消除了,真正执行的是什么在源码里面不一定能看出来 39 | 40 | - 深入理解 JVM 的自动内存回收机制,学会 GC 调优 41 | 42 | - 从容应对面试中关于性能调优和调试的问题 43 | 44 | - 独当一面走向高级工程师很重要的一步 45 | 46 | ## 适合人群 47 | 48 | - 如果你不熟悉 JAVA 应用监控调优 49 | - 如果你对 JAVA 应用监控调优感兴趣 50 | - 如果你想跳槽面试高级工程师 51 | 52 | ## 课程如何安排? 53 | 54 | - 基于 JDK 命令行工具的监控 55 | 56 | - 如何定位内存溢出 57 | - 如何定位 CPU 利用率高 58 | 59 | - 基于 JVisualVM 的可视化监控 60 | 61 | 相当于将各种命令行工具做了一个集成 62 | 63 | - 基于 Btrace 的监控调试 64 | 65 | 在不重启应用的情况下,如何知道某个方法的入参和返回值等问题 66 | 67 | - Tomcat 性能监控与调优 68 | 69 | - Nginx 性能监控与调优 70 | 71 | - JVM 层 GC 调优 72 | 73 | 详细的讲解 JVM 内存结构、垃圾回收器、垃圾回收器日志以及如何分析这些日志、如何评价垃圾回收器的性能高低? 74 | 75 | - Java 代码层优化 76 | 77 | ### 基于 JDK 命令行工具的监控 78 | 79 | - JVM 参数类型 80 | 81 | - 查看运行时 JVM 参数 82 | 83 | - 查看 JVM 统计信息 84 | 85 | 如类加载信息 86 | 87 | - jmap + MAT 实战内存溢出 88 | 89 | - jstack 实战死循环与死锁 90 | 91 | ### 基于 JVisualVM 的可视化监控 92 | 93 | 相当于是前面那些命令的一个集成 94 | 95 | - 监控本地 JAVA 进程 96 | - 监控远程 JAVA 进程 97 | 98 | ### 基于 Btrace 的监控调试 99 | 100 | - Btrace 安装使用入门 101 | - Btrace 使用详解 102 | 103 | 它类似 AOP 的机制,原理很复杂利用了很多高级的知识,本课程还是以使用为主。 104 | 105 | ### Tomcat 性能监控与调优 106 | 107 | - Tomcat 远程 debug 108 | - Tomcat-manager 监控 Tomcat 109 | - psi-probe 监控 Tomcat 110 | - Tomcat 调优 111 | 112 | ### Nginx 性能监控与调优 113 | 114 | - ngx_http_stub_status 监控链接信息 115 | - ngxtop 监控请求信息 116 | - nginx-rrd 图形化监控 117 | - nginx 调优 118 | 119 | ### JVM 层 GC 调优 120 | 121 | - JVM 内存结构:基于 JDK 1.8 122 | - 垃圾回收算法 123 | - 垃圾收集器 124 | - GC 日志格式与可视化日志分析工具 125 | - Tomcat 的 GC 调优实战 126 | 127 | ### Java 代码层优化 128 | 129 | - JVM 字节码指令与 javap 130 | 131 | javap 可以将 class 文件中的一些字节码指令打印出来 132 | 133 | - i++ 与 ++i,字符串 + 拼接原理,string 常量池、intern 方法 134 | 135 | - 常用代码优化方法 -------------------------------------------------------------------------------- /docs/monitor-tuning/01/01.md: -------------------------------------------------------------------------------- 1 | # JVM 参数类型 2 | 3 | 分为 3 大类: 4 | 5 | - 标准参数 6 | - X 参数:非标准化参数 7 | - XX 参数:非标准化参数,主要用于 JVM 调优和 Debug 8 | 9 | ## 标准参数 10 | 11 | 在 JVM 各个版本中基本上不变,相对稳定 12 | 13 | - `-help` 14 | - `-server -client` 15 | - `-version -showversion` 16 | - `-cp -classpath` 17 | 18 | ```bash 19 | # 查看 jdk 版本 20 | mrcode:~ mrcode$ java -version 21 | java version "1.8.0_201" 22 | Java(TM) SE Runtime Environment (build 1.8.0_201-b09) 23 | Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode) 24 | ``` 25 | 26 | ## X 参数 27 | 28 | 非标准化参数,在各个版本中有可能会变,但是可能性比较小 29 | 30 | - `-Xint`:解释执行 31 | - `-Xcomp`:第一次使用就编译成本地代码 32 | - `-Xmixed`:混合模式,JVM 自己来决定是否编译成本地代码 33 | 34 | 如: 35 | 36 | ```bash 37 | # 默认是使用 mixed 模式 38 | mrcode:~ mrcode$ java -version 39 | java version "1.8.0_201" 40 | Java(TM) SE Runtime Environment (build 1.8.0_201-b09) 41 | Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode) 42 | 43 | # 指定使用 -Xint 看到输出的是:interpreted mode 44 | mrcode:~ mrcode$ java -Xint -version 45 | java version "1.8.0_201" 46 | Java(TM) SE Runtime Environment (build 1.8.0_201-b09) 47 | Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, interpreted mode) 48 | 49 | # 指定使用 -Xcomp ,输出的是:compiled mode 50 | mrcode:~ mrcode$ java -Xcomp -version 51 | java version "1.8.0_201" 52 | Java(TM) SE Runtime Environment (build 1.8.0_201-b09) 53 | Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, compiled mode) 54 | ``` 55 | 56 | ## XX 参数 57 | 58 | 非标准化参数、相对不稳定、主要用于 JVM 调优和 Debug 59 | 60 | - Boolean 类型 61 | 62 | 格式:`-XX:[+-]` 表示启用或禁用 name 属性,`+` 号表示启用 63 | 64 | 例如: 65 | 66 | ``` 67 | -XX:+UseConcMarkSweepGC 68 | -XX:+UseG1GC 69 | ``` 70 | 71 | - 非 Boolean 类型 72 | 73 | 格式:`-XX:=` 表示 name 属性的值是 value 74 | 75 | 例如: 76 | 77 | ``` 78 | -XX:MaxGCPauseMillis=500 79 | XX:GCTimeRatio=19 80 | ``` 81 | 82 | 83 | 84 | 但是有缩写版本的参数,看上去很像是 X 参数,其实是 XX 参数。比如 85 | 86 | - `-Xmx` :最大堆内存 87 | 88 | 对应的 XX 参数是 `-XX:InitialHeapSize` 89 | 90 | - `-Xms`:初始化堆大小 91 | 92 | 对应的 XX 参数是 `-XX:MaxHeapSize` 93 | 94 | -------------------------------------------------------------------------------- /docs/monitor-tuning/01/02.md: -------------------------------------------------------------------------------- 1 | # 查看运行时 JVM 参数 2 | 3 | - `-XX:+PrintFlagsInitial`:查看初始值 4 | 5 | - `-XX:+PrintFlagsFinal`:查看最终的值 6 | 7 | 一般都有一个默认值,可以通过命令行等配置方式覆盖掉这个默认值,这里查看的则是这个最终的值 8 | 9 | - `-XX:+UnlockExperimentaIVMOptions`:解锁实验参数 10 | 11 | JVM 中有一部分参数是无法直接赋值的,需要加该参数,解锁实验参数,才能配置 12 | 13 | - `-XX:UnlockDiagnosticVMOpeions`:解锁诊断参数 14 | 15 | - `-XX:+PrintCommandLineFlags`:打印命令行参数 16 | 17 | ## PrintFlagsFinal 18 | 19 | ``` 20 | mrcode:~ mrcode$ java -XX:+PrintFlagsInitial -version 21 | [Global flags] 22 | intx ActiveProcessorCount = -1 uintx 23 | MaxHeapSize := 4294967296 {product} 24 | bool UseThreadPriorities = true {pd product} 25 | bool UseTypeProfile = true {product} 26 | bool UseTypeSpeculation = true {C2 product} 27 | ``` 28 | 29 | 注:`=` 表示默认值,`:=` 表示被用户或则 JVM 修改后的值 30 | 31 | 这个命令查看的是当前运行这个命令的进程 `java -XX:+PrintFlagsInitial -version` 的值,运行这一条,也会去启动一个 java 进程,那么打印的参数则是这个进程的参数。如何查看一个正在运行的 JVM 进程参数,是后面课程要讲解的。 32 | 33 | ## jps 34 | 35 | jps 是专门用来查看 Java 进程的工具。 36 | 37 | ```bash 38 | mrcode:~ mrcode$ jps -help 39 | usage: jps [-help] 40 | jps [-q] [-mlvV] [] 41 | 42 | Definitions: 43 | : [:] 44 | ``` 45 | 46 | ```bash 47 | # 查看当前的 java 进程,左侧是进程 ID,右侧是名称 48 | mrcode:~ mrcode$ jps 49 | 35984 Launcher 50 | 39312 51 | 45777 Jps 52 | 478 53 | 2255 54 | 55 | # -l:显示完整的名称,显示应用程序main类的完整程序包名称或应用程序JAR文件的完整路径名 56 | mrcode:~ mrcode$ jps -l 57 | 35984 org.jetbrains.jps.cmdline.Launcher 58 | 39312 59 | 45778 sun.tools.jps.Jps 60 | 478 61 | 2255 62 | ``` 63 | 64 | 这些参数的含义在 JDK 官方文档上有,名字叫 [Java平台,标准版工具参考](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/) 65 | 66 | 比如这里的 [jps 工具](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html) 67 | 68 | ## jinfo 69 | 70 | 查看正在运行的 JVM 进程信息 71 | 72 | ```bash 73 | mrcode:~ mrcode$ jinfo --help 74 | Usage: 75 | jinfo [option] 76 | (to connect to running process) 77 | jinfo [option] 78 | (to connect to a core file) 79 | jinfo [option] [server_id@] 80 | (to connect to remote debug server) 81 | 82 | where