Home
Softono

FastGateway

Open source MIT Java
17
Stars
3
Forks
0
Issues
0
Watchers
3 months
Last Commit

 About FastGateway

a high-performance, lightweight API gateway built with Spring Cloud Gateway

Platforms

Web Self-hosted Cloud Kubernetes

Languages

Java

Links

Need Help Installing FastGateway?

We provide expert installation service for this software. Our team will install, configure, and secure FastGateway on your server. plans start at just $30.

FastGateway

View on GitHub

FastGateway

้…็ฝฎ่ฆๆฑ‚

  • JDK 21
  • Maven 3.8+
  • Docker
  • Redis

๐Ÿ“– ้กน็›ฎไป‹็ป

FastGateway ๆ˜ฏไธ€ไธช่ฝป้‡็บงใ€้ซ˜ๆ€ง่ƒฝ็š„ API ็ฝ‘ๅ…ณๆœๅŠก๏ผŒๅŸบไบŽ Spring Boot 3.x ๅ’Œ Spring Cloud ๆž„ๅปบใ€‚ๅฎƒๆไพ›ไบ†ไธฐๅฏŒ็š„ๅŠŸ่ƒฝ้›†๏ผŒๅŒ…ๆ‹ฌ้ซ˜ๆ€ง่ƒฝ็š„่ฏทๆฑ‚่ทฏ็”ฑใ€ๆ™บ่ƒฝ่ดŸ่ฝฝๅ‡่กกใ€็ตๆดป็š„้™ๆต็ญ–็•ฅใ€ๆœๅŠกๅ‘็Žฐใ€ๅฎ‰ๅ…จๆŽงๅˆถ็ญ‰๏ผŒๆ˜ฏๆž„ๅปบ็ŽฐไปฃๅŒ–ๅพฎๆœๅŠกๆžถๆž„็š„็†ๆƒณ้€‰ๆ‹ฉใ€‚

็ณป็ปŸๆžถๆž„

                                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                    โ”‚   Client    โ”‚
                                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                           โ”‚
                                           โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                              Mo Gateway                                 โ”‚
โ”‚                                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  ่ทฏ็”ฑๆจกๅ—    โ”‚  โ”‚  ่ฎค่ฏ้‰ดๆƒ    โ”‚  โ”‚  ้™ๆตๆจกๅ—    โ”‚  โ”‚  ่ดŸ่ฝฝๅ‡่กกๆจกๅ—    โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚     ๆจกๅ—    โ”‚  โ”‚             โ”‚  โ”‚                 โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ่ฏทๆฑ‚่ทฏ็”ฑ  โ”‚  โ”‚ โ€ข JWT่ฎค่ฏ   โ”‚  โ”‚ โ€ข ไปค็‰Œๆกถ    โ”‚  โ”‚ โ€ข ่ฝฎ่ฏข็ฎ—ๆณ•      โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ่ทฏๅพ„ๅŒน้…  โ”‚  โ”‚ โ€ข API Key   โ”‚  โ”‚ โ€ข ๆป‘ๅŠจ็ช—ๅฃ  โ”‚  โ”‚ โ€ข ๅŠ ๆƒ่ฝฎ่ฏข      โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ๅ่ฎฎ่ฝฌๆข  โ”‚  โ”‚ โ€ข SPIๆ’ไปถ   โ”‚  โ”‚ โ€ข ๅˆ†ๅธƒๅผ    โ”‚  โ”‚ โ€ข ๆœ€ๅฐ‘่ฟžๆŽฅ      โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚                                                                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  ็›‘ๆŽงๆจกๅ—    โ”‚  โ”‚  ๆœๅŠกๅ‘็Žฐ    โ”‚  โ”‚  ้…็ฝฎ็ฎก็†    โ”‚  โ”‚  ็ผ“ๅญ˜ๆจกๅ—       โ”‚ โ”‚
โ”‚  โ”‚             โ”‚  โ”‚     ๆจกๅ—    โ”‚  โ”‚     ๆจกๅ—    โ”‚  โ”‚                 โ”‚ โ”‚
โ”‚  โ”‚ โ€ข Prometheusโ”‚  โ”‚ โ€ข K8sๅ‘็Žฐ   โ”‚  โ”‚ โ€ข ๅŠจๆ€้…็ฝฎ  โ”‚  โ”‚ โ€ข Redis็ผ“ๅญ˜     โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ๅฅๅบทๆฃ€ๆŸฅ  โ”‚  โ”‚ โ€ข ๅฅๅบทๆฃ€ๆŸฅ  โ”‚  โ”‚ โ€ข ็ƒญ้‡่ฝฝ    โ”‚  โ”‚ โ€ข ่ฎค่ฏ็ผ“ๅญ˜      โ”‚ โ”‚
โ”‚  โ”‚ โ€ข ๆ€ง่ƒฝๆŒ‡ๆ ‡  โ”‚  โ”‚ โ€ข ๆœๅŠกๆณจๅ†Œ  โ”‚  โ”‚ โ€ข ็Žฏๅขƒๅ˜้‡  โ”‚  โ”‚ โ€ข ้™ๆต็Šถๆ€      โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                      โ”‚
                                      โ–ผ
                               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                               โ”‚  Services   โ”‚
                               โ”‚             โ”‚
                               โ”‚ โ€ข Service A โ”‚
                               โ”‚ โ€ข Service B โ”‚
                               โ”‚ โ€ข Service C โ”‚
                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŒŸ ๆ ธๅฟƒ็‰นๆ€ง

1. ้ซ˜ๆ€ง่ƒฝ่ฏทๆฑ‚ๅค„็†

  • ้‡‡็”จ Spring WebFlux ๅ“ๅบ”ๅผ็ผ–็จ‹ๆจกๅž‹๏ผŒๆไพ›ๅ“่ถŠ็š„ๆ€ง่ƒฝ่กจ็Žฐ
  • ๆ”ฏๆŒ HTTP/2 ๅ่ฎฎ๏ผŒๅฎž็Žฐๆ›ด้ซ˜ๆ•ˆ็š„็ฝ‘็ปœไผ ่พ“
  • ๅผ‚ๆญฅ้ž้˜ปๅกž I/O ๅค„็†๏ผŒๆ้ซ˜็ณป็ปŸๅžๅ้‡
  • ๆ™บ่ƒฝ็š„่ฏทๆฑ‚ๅŽ‹็ผฉๅ’Œ็ผ“ๅญ˜็ญ–็•ฅ๏ผŒไผ˜ๅŒ–ๅ“ๅบ”ๆ—ถ้—ด

2. ๆ™บ่ƒฝ่ดŸ่ฝฝๅ‡่กก

  • ๆไพ›ๅคš็ง่ดŸ่ฝฝๅ‡่กก็ฎ—ๆณ•๏ผŒๆปก่ถณไธๅŒๅœบๆ™ฏ้œ€ๆฑ‚
    • ่ฝฎ่ฏข็ฎ—ๆณ•๏ผš้€‚็”จไบŽๆœๅŠกๅฎžไพ‹ๆ€ง่ƒฝ็›ธ่ฟ‘็š„ๅœบๆ™ฏ
    • ๅŠ ๆƒ่ฝฎ่ฏข๏ผšๆ”ฏๆŒๆœๅŠกๅฎžไพ‹ๅทฎๅผ‚ๅŒ–้…็ฝฎ
    • ๆœ€ๅฐ‘่ฟžๆŽฅ๏ผš้€‚็”จไบŽ้•ฟ่ฟžๆŽฅๅœบๆ™ฏ
    • ๅ“ๅบ”ๆ—ถ้—ดๅŠ ๆƒ๏ผšๆ นๆฎๆœๅŠกๅ“ๅบ”ๆ—ถ้—ดๅŠจๆ€่ฐƒๆ•ด
  • ่‡ชๅŠจๆœๅŠกๅฅๅบทๆฃ€ๆŸฅ๏ผŒๅŠๆ—ถๅ‰”้™คๅผ‚ๅธธๅฎžไพ‹
  • ๆ”ฏๆŒๅŠจๆ€่ฐƒๆ•ดๆœๅŠกๆƒ้‡๏ผŒๅฎž็Žฐๆ›ด็ฒพ็ป†็š„ๆต้‡ๆŽงๅˆถ

3. ็ตๆดป็š„้™ๆต็ญ–็•ฅ

  • ๅŸบไบŽ Redis ็š„ๅˆ†ๅธƒๅผ้™ๆต๏ผŒๆ”ฏๆŒ้›†็พค้ƒจ็ฝฒ
  • ๅคš็ง้™ๆต็ฎ—ๆณ•ๆ”ฏๆŒ๏ผŒ้€‚ๅบ”ไธๅŒไธšๅŠกๅœบๆ™ฏ
    • ไปค็‰Œๆกถ๏ผš้€‚ๅˆ็ชๅ‘ๆต้‡ๅœบๆ™ฏ
    • ๆผๆกถ๏ผš้€‚ๅˆๅนณๆป‘ๆต้‡ๅœบๆ™ฏ
    • ๆป‘ๅŠจ็ช—ๅฃ๏ผš้€‚ๅˆ็ฒพ็กฎๆŽงๅˆถๅœบๆ™ฏ
  • ๆ”ฏๆŒๆœๅŠก็บงๅˆซใ€ๆŽฅๅฃ็บงๅˆซ็š„้™ๆต้…็ฝฎ
  • ๆไพ›้™ๆต้™็บง็ญ–็•ฅ๏ผŒไฟ่ฏ็ณป็ปŸๅฏ็”จๆ€ง

4. ๆœๅŠกๅ‘็ŽฐไธŽๆณจๅ†Œ

  • ๅŽŸ็”Ÿๆ”ฏๆŒ Kubernetes ๆœๅŠกๅ‘็Žฐ
  • ๆไพ›่‡ชๅฎšไน‰ๆœๅŠกๆณจๅ†Œๆœบๅˆถ
  • ๆ”ฏๆŒๅŠจๆ€ๆœๅŠกไธŠไธ‹็บฟ
  • ๆœๅŠกๅ…ƒๆ•ฐๆฎ็ฎก็†๏ผŒๆ”ฏๆŒๆœๅŠกๆ ‡็ญพๅ’Œๅฑžๆ€ง้…็ฝฎ

5. ๆ’ไปถๅŒ–่ฎค่ฏ้‰ดๆƒ็ณป็ปŸ

  • SPI ๆ’ไปถๆžถๆž„๏ผšๅŸบไบŽ Java SPI ๆœบๅˆถ็š„ๅฏๆ‰ฉๅฑ•่ฎค่ฏ็ณป็ปŸ
  • ๅคš้‡่ฎค่ฏ็ญ–็•ฅ๏ผšๆ”ฏๆŒ JWTใ€API Key ็ญ‰ๅคš็ง่ฎค่ฏๆ–นๅผ
  • ็ƒญๆ’ๆ‹”ๆ”ฏๆŒ๏ผš่ฎค่ฏๆ’ไปถๅฏๅŠจๆ€ๅŠ ่ฝฝๅ’Œๅธ่ฝฝ
  • ่ฎค่ฏ้“พๅผๅค„็†๏ผšๅคšไธช่ฎค่ฏๆไพ›่€…ๆŒ‰ไผ˜ๅ…ˆ็บง้กบๅบๆ‰ง่กŒ
  • ็ผ“ๅญ˜ๆœบๅˆถ๏ผšRedis ็ผ“ๅญ˜่ฎค่ฏ็ป“ๆžœ๏ผŒๆๅ‡ๆ€ง่ƒฝ
  • ๅฎŒๆ•ด็š„ SSL/TLS ๅŠ ๅฏ†ๆ”ฏๆŒ
  • ๅฏ้…็ฝฎ็š„ CORS ็ญ–็•ฅ
่ฎค่ฏ้‰ดๆƒๆžถๆž„ๅ›พ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        ่ฎค่ฏ้‰ดๆƒๅค„็†ๆต็จ‹                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ๅฎขๆˆท็ซฏ     โ”‚โ”€โ”€โ”€โ”€โ”‚                ็ฝ‘ๅ…ณๅ…ฅๅฃ                         โ”‚
โ”‚   ่ฏทๆฑ‚      โ”‚    โ”‚             (GatewayController)                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚              ่ฎค่ฏๆœๅŠก                           โ”‚
                   โ”‚          (AuthenticationService)               โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚            ๆ’ไปถ็ฎก็†ๅ™จ                           โ”‚
                   โ”‚          (AuthPluginManager)                   โ”‚
                   โ”‚                                                โ”‚
                   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
                   โ”‚  โ”‚  JWT ๆ’ไปถ   โ”‚  โ”‚     API Key ๆ’ไปถ        โ”‚  โ”‚
                   โ”‚  โ”‚             โ”‚  โ”‚                         โ”‚  โ”‚
                   โ”‚  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚JWT่งฃๆž  โ”‚ โ”‚  โ”‚ โ”‚   API Key ้ชŒ่ฏ      โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚Token   โ”‚ โ”‚  โ”‚ โ”‚                     โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚้ชŒ่ฏ     โ”‚ โ”‚  โ”‚ โ”‚   ๆƒ้™ๆฃ€ๆŸฅ          โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚่ง’่‰ฒๆๅ– โ”‚ โ”‚  โ”‚ โ”‚                     โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚
                   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚              ่ฎค่ฏไธŠไธ‹ๆ–‡                          โ”‚
                   โ”‚          (AuthenticationContext)                โ”‚
                   โ”‚                                                โ”‚
                   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
                   โ”‚  โ”‚  ็ผ“ๅญ˜็ฎก็†   โ”‚  โ”‚       ้…็ฝฎ็ฎก็†           โ”‚  โ”‚
                   โ”‚  โ”‚             โ”‚  โ”‚                         โ”‚  โ”‚
                   โ”‚  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚Redis    โ”‚ โ”‚  โ”‚ โ”‚   ๅŠจๆ€้…็ฝฎ          โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚็ผ“ๅญ˜     โ”‚ โ”‚  โ”‚ โ”‚                     โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ”‚่ฎค่ฏ็ป“ๆžœ โ”‚ โ”‚  โ”‚ โ”‚   ็Žฏๅขƒๅ˜้‡          โ”‚ โ”‚  โ”‚
                   โ”‚  โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚ โ”‚                     โ”‚ โ”‚  โ”‚
                   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚ โ”‚   ๅฑžๆ€งๆ–‡ไปถ          โ”‚ โ”‚  โ”‚
                   โ”‚                   โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚  โ”‚
                   โ”‚                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ–ผ
                   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚             ่ฎค่ฏ็ป“ๆžœ                            โ”‚
                   โ”‚         (AuthenticationResult)                 โ”‚
                   โ”‚                                                โ”‚
                   โ”‚  ๆˆๅŠŸ: ็”จๆˆทไฟกๆฏ + ่ง’่‰ฒ + ๆƒ้™ + ๅ…ƒๆ•ฐๆฎ             โ”‚
                   โ”‚  ๅคฑ่ดฅ: ้”™่ฏฏไฟกๆฏ + ้”™่ฏฏ็                         โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
SPI ๆ’ไปถๅŒ–่ฎค่ฏๆไพ›่€…
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    SPI ่ฎค่ฏๆ’ไปถๆžถๆž„                                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

META-INF/services/com.mo.gateway.spi.auth.AuthenticationProvider
โ”œโ”€โ”€ com.mo.gateway.plugin.auth.jwt.JwtAuthenticationProvider
โ””โ”€โ”€ com.mo.gateway.plugin.auth.apikey.ApiKeyAuthenticationProvider

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                 AuthenticationProvider SPI ๆŽฅๅฃ                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  + getProviderName() : String                                      โ”‚
โ”‚  + getVersion() : String                                           โ”‚
โ”‚  + supports(request) : boolean                                     โ”‚
โ”‚  + authenticate(request, context) : AuthenticationResult          โ”‚
โ”‚  + initialize(config) : void                                      โ”‚
โ”‚  + destroy() : void                                               โ”‚
โ”‚  + health() : HealthStatus                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ–ฒ
                                    โ”‚
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚                               โ”‚
          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚   JWT ่ฎค่ฏๆไพ›่€…     โ”‚        โ”‚  API Key ่ฎค่ฏๆไพ›่€…  โ”‚
          โ”‚                    โ”‚        โ”‚                     โ”‚
          โ”‚ โ€ข Token ่งฃๆž       โ”‚        โ”‚ โ€ข Key ้ชŒ่ฏ          โ”‚
          โ”‚ โ€ข ็ญพๅ้ชŒ่ฏ         โ”‚        โ”‚ โ€ข ๆƒ้™ๆฃ€ๆŸฅ          โ”‚
          โ”‚ โ€ข ่ฟ‡ๆœŸๆฃ€ๆŸฅ         โ”‚        โ”‚ โ€ข ็ผ“ๅญ˜ๆ”ฏๆŒ          โ”‚
          โ”‚ โ€ข ่ง’่‰ฒๆๅ–         โ”‚        โ”‚ โ€ข ้ข‘็އ้™ๅˆถ          โ”‚
          โ”‚ โ€ข ๆƒ้™ๆๅ–         โ”‚        โ”‚                     โ”‚
          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6. ็›‘ๆŽงไธŽๅฏ่ง‚ๆต‹ๆ€ง

  • ้›†ๆˆ Prometheus ็›‘ๆŽง็ณป็ปŸ
  • ่ฏฆ็ป†็š„่ฏทๆฑ‚่ฟฝ่ธช
  • ไธฐๅฏŒ็š„ๆ€ง่ƒฝๆŒ‡ๆ ‡
  • ๅฎŒๅ–„็š„ๅฅๅบทๆฃ€ๆŸฅๆœบๅˆถ
  • ็ป“ๆž„ๅŒ–็š„ๆ—ฅๅฟ—่ฎฐๅฝ•

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

็Žฏๅขƒ่ฆๆฑ‚

  • JDK 21
  • Maven 3.8+
  • Docker ๅ’Œ Docker Compose
  • Redis 7.x
  • Kubernetes๏ผˆๅฏ้€‰๏ผŒ็”จไบŽ็”Ÿไบง็Žฏๅขƒ๏ผ‰

ๆœฌๅœฐๅผ€ๅ‘็Žฏๅขƒๆญๅปบ

  1. ๅ…‹้š†้กน็›ฎไปฃ็ 
  2. ๅฏๅŠจไพ่ต–ๆœๅŠก๏ผˆRedis็ญ‰๏ผ‰
  3. ๆž„ๅปบๅนถ่ฟ่กŒ้กน็›ฎ
  4. ้ชŒ่ฏๆœๅŠกๆ˜ฏๅฆๆญฃๅธธ่ฟ่กŒ

โš™๏ธ ้…็ฝฎ่ฏดๆ˜Ž

ๅŸบ็ก€้…็ฝฎ

็ฝ‘ๅ…ณๆœๅŠกๆ”ฏๆŒไธฐๅฏŒ็š„้…็ฝฎ้€‰้กน๏ผŒๅŒ…ๆ‹ฌ๏ผš

  • ๆœๅŠก็ซฏๅฃ้…็ฝฎ
  • SSL/TLS ้…็ฝฎ
  • HTTP/2 ๆ”ฏๆŒ
  • ่ฎค่ฏ้‰ดๆƒ้…็ฝฎ
  • ้™ๆตๅ‚ๆ•ฐ้…็ฝฎ
  • ่ดŸ่ฝฝๅ‡่กก็ญ–็•ฅ
  • ๆœๅŠกๅ‘็Žฐ้…็ฝฎ

่ฎค่ฏ้‰ดๆƒ้…็ฝฎ

JWT ่ฎค่ฏ้…็ฝฎ

gateway:
  auth:
    enabled: true
    plugin-directory: plugins
    enabled-providers:
      - jwt
      - apikey
    provider-configs:
      jwt:
        secret: ${JWT_SECRET:your-secret-key}
        issuer: ${JWT_ISSUER:mo-gateway}
        expiration-minutes: ${JWT_EXPIRATION_MINUTES:60}

API Key ่ฎค่ฏ้…็ฝฎ

gateway:
  auth:
    provider-configs:
      apikey:
        cache-enabled: ${APIKEY_CACHE_ENABLED:true}
        cache-expiration-minutes: ${APIKEY_CACHE_EXPIRATION_MINUTES:30}

่ฎค่ฏๆ’ไปถๆ‰ฉๅฑ•

ๆทปๅŠ ่‡ชๅฎšไน‰่ฎค่ฏๆ’ไปถๅช้œ€๏ผš

  1. ๅฎž็Žฐ AuthenticationProvider ๆŽฅๅฃ
  2. ๅœจ META-INF/services/com.mo.gateway.spi.auth.AuthenticationProvider ๆ–‡ไปถไธญๆณจๅ†Œ
  3. ๅฐ†ๆ’ไปถ JAR ๅŒ…ๆ”พๅ…ฅ plugins ็›ฎๅฝ•

่ฏฆ็ป†้…็ฝฎ่ฏดๆ˜Ž่ฏทๅ‚่€ƒ ้…็ฝฎๆŒ‡ๅ—

็Žฏๅขƒๅ˜้‡

ๆ”ฏๆŒ้€š่ฟ‡็Žฏๅขƒๅ˜้‡่ฆ†็›–้ป˜่ฎค้…็ฝฎ๏ผŒไธป่ฆ้…็ฝฎ้กนๅŒ…ๆ‹ฌ๏ผš

  • ๆœๅŠกๅ‘็Žฐ็ฑปๅž‹
  • Redis ่ฟžๆŽฅไฟกๆฏ
  • ้™ๆตๅ‚ๆ•ฐ
  • ๆ—ฅๅฟ—็บงๅˆซ
  • ็›‘ๆŽง้…็ฝฎ

๐Ÿ”Œ ไธšๅŠกๆœๅŠกๆŽฅๅ…ฅๆŒ‡ๅ—

ๆœๅŠกๆŽฅๅ…ฅๆต็จ‹

  1. ๆœๅŠกๆณจๅ†Œ
    • Kubernetes ็Žฏๅขƒ้…็ฝฎ
    • ้ž Kubernetes ็Žฏๅขƒ้…็ฝฎ
  2. ่ฎค่ฏ้‰ดๆƒ้…็ฝฎ
  3. ้™ๆต้…็ฝฎ
  4. ่ดŸ่ฝฝๅ‡่กก้…็ฝฎ
  5. ็›‘ๆŽง้›†ๆˆ

่ฎค่ฏ้‰ดๆƒไฝฟ็”จ็คบไพ‹

JWT ่ฎค่ฏ่ฏทๆฑ‚็คบไพ‹

# ไฝฟ็”จ JWT Token ่ฎฟ้—ฎๅ—ไฟๆŠค็š„API
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
     -X GET "http://gateway:8080/api/v1/protected-resource"

API Key ่ฎค่ฏ่ฏทๆฑ‚็คบไพ‹

# ไฝฟ็”จ API Key ่ฎฟ้—ฎๅ—ไฟๆŠค็š„API
curl -H "X-API-Key: your-api-key-here" \
     -X GET "http://gateway:8080/api/v1/protected-resource"

่ฎค่ฏๅคฑ่ดฅๅ“ๅบ”็คบไพ‹

{
  "timestamp": "2024-01-20T10:30:00Z",
  "status": 401,
  "error": "AUTHENTICATION_FAILED",
  "message": "Invalid JWT token",
  "path": "/api/v1/protected-resource"
}

่ฏฆ็ป†ๆŽฅๅ…ฅ่ฏดๆ˜Ž่ฏทๅ‚่€ƒ ๆœๅŠกๆŽฅๅ…ฅๆŒ‡ๅ—

๐Ÿณ ้ƒจ็ฝฒๆŒ‡ๅ—

้ƒจ็ฝฒๆ–นๅผ

  1. Docker ้ƒจ็ฝฒ
    • ๅ•ๆœบ้ƒจ็ฝฒ
    • ้›†็พค้ƒจ็ฝฒ
  2. Kubernetes ้ƒจ็ฝฒ
    • ๅŸบ็ก€้ƒจ็ฝฒ
    • ้ซ˜ๅฏ็”จ้ƒจ็ฝฒ

่ฏฆ็ป†้ƒจ็ฝฒ่ฏดๆ˜Ž่ฏทๅ‚่€ƒ ้ƒจ็ฝฒๆŒ‡ๅ—

๐Ÿ“Š ็›‘ๆŽงไธŽ่ฟ็ปด

็›‘ๆŽงๆŒ‡ๆ ‡

  • ๆœๅŠกๅฅๅบท็Šถๆ€
  • ๆ€ง่ƒฝๆŒ‡ๆ ‡
  • ้™ๆต็ปŸ่ฎก
  • ็ณป็ปŸ่ต„ๆบไฝฟ็”จๆƒ…ๅ†ต

ๆ—ฅๅฟ—็ฎก็†

  • ็ป“ๆž„ๅŒ–ๆ—ฅๅฟ—
  • ๆ—ฅๅฟ—ๆ”ถ้›†
  • ๆ—ฅๅฟ—ๅˆ†ๆž

่ฏฆ็ป†่ฟ็ปด่ฏดๆ˜Ž่ฏทๅ‚่€ƒ ่ฟ็ปดๆŒ‡ๅ—

๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

ๆฌข่ฟŽ่ดก็Œฎไปฃ็ ๏ผŒๆไบค Issue ๆˆ– Pull Requestใ€‚่ฏท็กฎไฟ๏ผš

  1. ้ตๅพชไปฃ็ ่ง„่Œƒ
  2. ๆทปๅŠ ๅฟ…่ฆ็š„ๆต‹่ฏ•
  3. ๆ›ดๆ–ฐ็›ธๅ…ณๆ–‡ๆกฃ

่ฏฆ็ป†่ดก็ŒฎๆŒ‡ๅ—่ฏทๅ‚่€ƒ ่ดก็ŒฎๆŒ‡ๅ—

๐Ÿ“ ่ฎธๅฏ่ฏ

ๆœฌ้กน็›ฎ้‡‡็”จ MIT ่ฎธๅฏ่ฏ

๐Ÿ“ž ่”็ณปๆ–นๅผ

  • ้กน็›ฎ็ปดๆŠค่€…๏ผš[Mo]
  • ้‚ฎ็ฎฑ๏ผš[[email protected]]
  • ้กน็›ฎ้“พๆŽฅ๏ผš[https://github.com/xmopher/gateway.git]