Slide 1

Slide 1 text

࣮ફ net/http Middlewareύλʔϯ খࢁ݈Ұ࿠ / GMO PEPABO inc. 2024.7.26 Kizuku.go Vol.1 1

Slide 2

Slide 2 text

ࣗݾ঺հ ϗεςΟϯάࣄۀ෦ 2018೥ த్ೖࣾ খࢁ ݈Ұ࿠ Ken’ichiro Oyama গ࣮͠༻తͰখ͞ͳOSSΛॻ͘ͷ͕झຯɻ ● GitHub : k1LoW ● Twitter : @k1LoW 2

Slide 3

Slide 3 text

GMOϖύϘʹ͍ͭͯ 3 https://pepabo.com

Slide 4

Slide 4 text

ΞδΣϯμ • net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ • Α͘࢖ΘΕΔ Middleware ύλʔϯΛར༻ͨ͠ػೳ • զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ • ·ͱΊ 4

Slide 5

Slide 5 text

5 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ

Slide 6

Slide 6 text

• net/http ύοέʔδ • Package http provides HTTP client and server implementations. • HTTPΫϥΠΞϯτ΍HTTPαʔόͷ࣮૷ͷͨΊͷύοέʔδ • net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ • HTTPϦΫΤετ/ϨεϙϯεΛऔΓѻ͏HTTPαʔόʹ͓͍ͯػೳΛ࣮૷͢Δࡍʹ࢖༻Ͱ͖ Δ࣮૷ύλʔϯ 6 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯͱ͸Կ͔

Slide 7

Slide 7 text

• ಛఆͷϙʔτͰTCP઀ଓ(HTTP/3͸UDPʣΛ଴ͪड͚ɺTLSऴ୺ॲཧΛͨ͠ΓɺΫϥΠΞϯτ͔ Β௚઀HTTPϦΫΤετΛड͚ͯ࠷ऴతʹHTTPϨεϙϯεΛฦ͢αʔόϓϩηε • NGINX΍Apache͸HTTPαʔόͱݴ͑Δ • ʢຊηογϣϯͰ͸HTTPαʔόͱWebαʔόΛ۠ผ͠·ͤΜʣ 7 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ HTTPαʔό

Slide 8

Slide 8 text

• WebΞϓϦέʔγϣϯΛߏங͢Δͱ͖ɺHTTPαʔόͱWebΞϓϦέʔγϣϯ/ϑϨʔϜϫʔΫͷ ૊Έ߹ΘͤͰɺHTTPϦΫΤετ/ϨεϙϯεΛऔΓѻ͏͜ͱ͕ଟ͍ • HTTPαʔόͱWebΞϓϦέʔγϣϯ/ϑϨʔϜϫʔΫͷؒͷΠϯλʔϑΣΠεඪ४Խ͢Δ͜ͱ Ͱɺॊೈͳ૊Έ߹ΘͤΛ࣮ݱ͢Δ࢓༷͕͋Δ • WSGIʢPythonʣɺRackʢRubyʣɺPSGIʢPerlʣ 8 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ WebΞϓϦέʔγϣϯΛߏங͢Δ

Slide 9

Slide 9 text

• ʢதུʣ The process of wrapping the Pylons application in middleware results in a structure conceptually similar to the layers in an onionʢλϚωΪʣ. • ຊηογϣϯʹ͓͚ΔMiddlewareύλʔϯͱಉ͡ • WSGI Middleware ͸ HTTPαʔόͱWebΞϓϦέ
 ʔγϣϯ/ϑϨʔϜϫʔΫͷதؒͷWSGIϨΠϠͰ࣮ݱ • ͪͳΈʹɺHTTPαʔόͷϨΠϠͰ΋WebΞϓϦέʔγϣϯ/
 ϑϨʔϜϫʔΫͷϨΠϠͰ΋Middlewareύλʔϯ͸͋Δ
 ʢ͋ͬͯΑ͍ʣ 9 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ WSGI Middleware https://docs.pylonsproject.org/projects/pylons-webframework/en/latest/concepts.html#wsgi-middleware

Slide 10

Slide 10 text

10 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ WSGI Middleware

Slide 11

Slide 11 text

• Goͷ৔߹͸net/httpύοέʔδͷଘࡏ͔ΒHTTPαʔόͷػೳͱ·ͱΊͯ1ͭͷίʔυϕʔεͱ͠ ͯ͠·͏͜ͱ͕ଟ͍ • Middlewareύλʔϯʹ͓͚ΔMiddleware͕WebΞϓϦέʔγϣϯʹͱͬͯͷMiddlewareͰ͋Δ ͱͱ΋ʹHTTPαʔόͷMiddlewareͱͯ͠΋ड͚ೖΕΒΕΔ • ΞʔΩςΫνϟ͕γϯϓϧʹͳΔϝϦοτͩͱߟ͑Δ 11 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ Goʹ͓͚ΔWebΞϓϦέʔγϣϯ

Slide 12

Slide 12 text

12 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ net/http Middleware

Slide 13

Slide 13 text

13 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ ϕʔεͱͳΔίʔυ

Slide 14

Slide 14 text

• ServerHTTPϝιουΛ࣋ͭΠϯλʔϑΣʔε • ServeHTTPϝιου͸ɺͦͷ໊ͷ௨ΓHTTPϦΫΤετΛड͚ͯHTTPϨεϙϯεΛฦͨ͢ Ίͷϝιου 14 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ http.Handler

Slide 15

Slide 15 text

15 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ http.Handler http.Handler

Slide 16

Slide 16 text

• http.HandlerΛड͚औΓhttp.HandlerΛฦؔ͢਺γάωνϟ 16 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ net/http ύοέʔδʹ͓͚ΔMiddlewareύλʔϯ

Slide 17

Slide 17 text

🤔 17

Slide 18

Slide 18 text

• http.HandlerFuncͰؔ਺Λhttp.Handlerʹม׵͍ͯ͠Δ 18 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ MiddlewareύλʔϯͰͷ࣮૷Πϝʔδ

Slide 19

Slide 19 text

• http.HandlerΛड͚औΓhttp.HandlerΛฦ͢
 Middleware͸ೖΕࢠʹͰ͖Δ 19 net/http ύοέʔδʹ͓͚Δ Middleware ύλʔϯ MiddlewareύλʔϯͰͷ࣮૷Πϝʔδ

Slide 20

Slide 20 text

20 Α͘࢖ΘΕΔ Middleware ύλʔϯΛར༻ͨ͠ػೳ

Slide 21

Slide 21 text

• ΞΫηεϩά • CORS • ೝূೝՄ • ΞΫηε੍ޚ 21 Α͘࢖ΘΕΔ Middleware ύλʔϯΛར༻ͨ͠ػೳ Α͘࢖ΘΕΔ Middleware ύλʔϯΛར༻ͨ͠ػೳ

Slide 22

Slide 22 text

22 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ

Slide 23

Slide 23 text

• Goͷ৔߹͸net/httpύοέʔδͷଘࡏ͔ΒHTTPαʔόͷػೳͱ·ͱΊͯ1ͭͷίʔυϕʔεͱ͠ ͯ͠·͏͜ͱ͕ଟ͍ • Middlewareύλʔϯʹ͓͚ΔMiddleware͕WebΞϓϦέʔγϣϯʹͱͬͯͷMiddlewareͰ͋ Δͱͱ΋ʹHTTPαʔόͷMiddlewareͱͯ͠΋ඇ࿈ଓͰड͚ೖΕΒΕΔ • ΞʔΩςΫνϟ͕γϯϓϧʹͳΔϝϦοτ 23 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ ʢ࠶ܝʣGoʹ͓͚ΔWebΞϓϦέʔγϣϯ

Slide 24

Slide 24 text

• ྫ͑͹ʮHTTPϓϩΩγαʔόΛGoͰಠࣗʹॻ͘ʯͱ͍͏બ୒ • HTTPαʔόͷػೳΛGoͰॻ͘͜ͱͰɺΑΓυϝΠϯʹಛԽͨ͠ػೳΛఏڙ͢Δ͜ͱ͕Մೳ • ϓϩΩγαʔόͰ΋ net/http ύοέʔδΛ࢖͏͜ͱʹ͸มΘΓ͸ͳ͍ɻͭ·ΓɺMiddleware ύ λʔϯ͸ͦͷ··࣮ફͰ͖Δ 24 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ ౰વɺHTTPαʔόͷΈΛGoͰॻ͘͜ͱ΋Մೳ

Slide 25

Slide 25 text

2manymws/rc 25

Slide 26

Slide 26 text

• rc is a response cache middleware for cache. • ϦΫΤετʹԠͯ͡ಈతʹΩϟογϡ൑ఆΛม͑Δ͜ͱ͕Ͱ͖ΔMiddleware • Ωϟογϡ൑ఆ΍Ωϟογϡͷฦ٫͸ rc.Casher ΠϯλʔϑΣʔεΛຬ࣮ͨ͢૷Λ࡞Δ͜ ͱͰ೚ҙͷ൑ఆϩδοΫΛ૊ΈࠐΉ͜ͱ͕Մೳ • ΩϟογϡετϨʔδ΋ಠࣗʹ૊ΈࠐΈՄೳ • σΟεΫΩϟογϡͰ͋Ε͹ɹɹhttps://github.com/2manymws/rcutil Λ࢖༻Մೳ • Ωϟογϡૢ࡞ʹ͓͚ΔσϑΥϧτͷಈ࡞͸RFC9111ʹ४ڌ • ϓϩΩγαʔόʹඞཁͳػೳͷΈΛ࣮૷͍ͯ͠Δ 26 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ https://github.com/2manymws/rc

Slide 27

Slide 27 text

2manymws/rl 27

Slide 28

Slide 28 text

• rl is a rate limit middleware for multiple limit rules. • ϦΫΤετʹԠͯ͡ಈతʹϨʔτϦϛοτͷϧʔϧΛઃఆͰ͖ΔMiddleware • ϨʔτϦϛοτͷϧʔϧΛ rl.Limitter ΠϯλʔϑΣʔεΛຬͨ͢͜ͱͰ૊ΈࠐΉ͜ͱ͕Ͱ͖ Δɻ • ϨʔτϦϛοτͷϩδοΫʹ͸Sliding Window CounterύλʔϯΛ࠾༻ • https://blog.cloudflare.com/counting-things-a-lot-of-different-things/ • IPϕʔε΍ϗετϕʔεͳͲ࣮ફతͳϦϛοτϧʔϧ͸ http://github.com/2manymws/rlutils ʹޙ չ͍ͯ͠Δ 28 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ https://github.com/2manymws/rl

Slide 29

Slide 29 text

2manymws/mm 29

Slide 30

Slide 30 text

• mm is a middleware-middleware for multiple rules. • ϦΫΤετʹԠͯ͡ಈతʹMiddlewareΛ੾Γସ͑Δ͜ͱ͕Ͱ͖ΔMiddleware • Middlewareద༻ϧʔϧΛ mm.Builder ΠϯλʔϑΣʔεΛຬͨ͢͜ͱͰ૊ΈࠐΉ͜ͱ͕Ͱ͖ Δɻ • ·࣮ͩફ౤ೖ͸͍ͯ͠ͳ͍ • ར༻͍ͨ͠Middleware͕ϦΫΤετʹԠͯ͡੾Γସ͑Δͱ͍͏ػೳΛ࣋ͨͳ͍৔߹ͳͲʹ࢖༻ ͢ΔΠϝʔδ 30 զʑ͕࣮ફ͍ͯ͠Δ Middleware ύλʔϯΛར༻ͨ͠ػೳ https://github.com/2manymws/mm

Slide 31

Slide 31 text

31 ·ͱΊ

Slide 32

Slide 32 text

32 ·ͱΊ શͯ͸http.Handler • net/httpύοέʔδͷHTTPαʔό͸http.HandlerΛऔΓѻ͏ • http.ServeMux΋http.Handler • WebΞϓϦέʔγϣϯʹ͓͚Δʮϧʔλʯͱݺ͹ΕΔ΋ͷ͸ɺ୯ʹʮϦΫΤετύεΛݩʹಈతʹ http.HandlerΛ੾Γ͔͑Δhttp.Handlerʯͱݴ͑Δ • Middleware΋http.Handler • શͯͷϦΫΤετ/Ϩεϙϯεʹରͯ͠λϚωΪͷΑ͏ʹhttp.HanderΛϥοϓ͍ͯ͠Δ • Middlewareͷڍಈ΋ϦΫΤετΛݩʹಈతʹมΘ͍͍ͬͯ • Α͏͸ʮػೳશମΛͲ͏σβΠϯ͢Δ͔ʯʹམͪண͘ • શͯ͸http.Handler

Slide 33

Slide 33 text

33 Thank you!