Mujundon dinamik marshrutlashni amalga oshirish

Mujundon dinamik marshrutlashni amalga oshirish

Loyihaning foni va Spring Cloud Gateway tanlash sabablari

Ushbu loyiha tez o'zgaruvchan biznes talablariga tezda javob berish va xizmatlar o'rtasida aralashuvsiz alohida kengayish imkoniyatini ta'minlash uchun Mikrosavdo Arxitekturasi (MSA) to'liq qabul qilindi. Ayniqsa, domen bo'yicha mutaxassislikka ega ko'plab ishlab chiquvchilar ishtirok etgan 'Ko'p sotuvchilar (Multi-vendor) hamkorlik tuzilmasi' orqali paralel rivojlanish amalga oshirildi. Biroq, arxitektura nuqtai nazaridan xizmat chegaralari parchalab yozilmoqda va boshqaruv nuqtalari keskin oshishi kabi muammo yuzaga keldi.

Muvaffaqiyatli loyiha amalga oshirish uchun hal qilinishi zarur bo'lgan asosiy muammolar quyidagi kabi bo'ldi.

  • Ko'p ishlab chiquvchilar muhitida boshqaruv murakkabligini hal etish: Yuzlab xizmatlar mustaqil ravishda tarqatilish va qaytarilib olish jarayonida har bir xizmatning tugash joylarini birma-bir sinxronlashtirish mumkin emas. Tarmoq joyini abstraktsiyalash va talablarni bog'lash uchun markaziy yo'naltirish tizimi zarur edi.

  • Xavfsizlik funksiyalarini markazlashtirish orqali ishlab chiqarish samaradorligini maksimal darajada oshirish: Tasdiqlash (Authentication) va ruxsat berish (Authorization) har bir xizmatda alohida amalga oshirilishi takroriy rivojlanishdir va tizimning umumiy xavfsizlik zaifliklarini keltirib chiqaradi. Buni Gateway orqali integratsiyalangan holda amalga oshirish va umuman xizmatlarning xavfsizlik darajasini yuqoriga sinxronlashtirish zarur edi.

  • Yopiq tarmoqli infratuzilmalar doirasida barqaror tashqi o'rnatish: Ushbu tizim maxfiylikni saqlab qolish uchun ichki yopiq tarmoqda qurilgan bo'lsa-da, tashqi o'rnatish nuqtalari albatta zarur edi. Ichki xizmatlarni to'g'ridan-to'g'ri oshkor qilmasdan aloqa o'rnatish va ichki topologiyani yashirish uchun 'Xavfsiz darvoz (Secure Gate)' muhim rol o'ynadi.

  • Funksiyalarni o'zgartirish va qo'shish uchun moslashuvchanlikni ta'minlash: Tez o'zgaruvchan talablar va o'rnatish me'yorlariga javob berish uchun, infratuzilma sozlamalariga bog'liq bo'lgan apparat qurilmalari o'rnini biznes mantiqini kod orqali boshqarish imkonini beruvchi moslashuvchan darvoza talab etildi.

Bunday talablarni umumiy ravishda qondirish uchun biz Spring Cloud Gateway (SCG) ni tanladik. SCG JVM ekotizimiga mukammal integratsiyalanadi hamda, Netty asosidagi asinxron no-blokirovka (Non-blocking) arxitekturasi orqali oz resurslar bilan katta hajmdagi bir vaqtning o'zida ulanishlarni ishonchli tarzda boshqaradi.

Eng muhimi, Java kodida filtrlash mantiqini erkin moslashtirish imkoniyati hal qiluvchi ahamiyatga ega edi. Shu bilan birga, u uchun shunchaki trafikni o'tkazib berishdan tashqari, ko'p ishlab chiquvchilar o'rtasidagi murakkab ruxsatnoma boshqaruvi va yopiq tarmoqga mos xavfsizlik filtratsiyasi, dinamik marshrutlashni ilova darajasida tezda amalga oshirish imkonini berdi.

Muzhungsiz dinamik yo'nalishni amalga oshirish

Dastlabki qurilish bosqichida Spring Cloud Gateway (keyingi SCG) tomonidan taqdim etilgan eng standart usul bo'lgan statik yo'nalish (Static Routing) qabul qilindi. Quyidagi kabi application.yml konfiguratsiya faylida yo'nalish qoidalarini bevosita ko'rsatish usuli.

spring:
   cloud:
       gateway:
           server:
               webflux:
                   routes:
                      - id: shared
                         predicates:
                             - Path=${server.servlet.context-path}/shared/**
                         uri: <http://foo-bar.com/api/shared>
                         filters:
                             - RewritePath=${server.servlet.context-path}/, /api/
                             - AddRequestHeader=xgate-id, gate1234
                         metadata:
                             response-timeout: 1800000 #30분
                             connect-timeout: 3000 #30초

Ushbu usul strukturasi intuitiv bo'lib, amalga oshirishda tezligi borligi afzalliklari, ammo ko'p ishlab chiqaruvchilar ishtirok etadigan va operatsion talablar tez-tez o'zgaradigan muhitda o'limli kamchiliklar ko'rsatdi. Faqat bitta yo'l qo'shilishi yoki timeout qiymatini o'zgartirishi uchun har doim konfiguratsiya faylini o'zgartirish va butun gateway xizmatini qayta yig'ish va tarqatish jarayonidan o'tish kerak edi.

Xususan, xizmat operatorlari darhol yo'nalishni nazorat qila olmaydilar, har safar dasturchiga o'zgartirish so'rovini uzatish va tarqatish jadvaliga muvofiq ko'rsatma kutish jarayoni biznesning chaqqonligini to'sqinlik qiluvchi katta ortiqcha yukga aylangan.

Bunday operatsion cheklovlarni yengish maqsadida, yo'nalish metama'lumotlarini ma'lumotlar bazasida boshqarish va uni gateway dvigateliga real vaqt rejimida sinxronlashtirishga qaror qilindi.'Dinamik yo'nalish' usuliga o'tish. Birinchi navbatda, mavjud YAML faylida tarqalgan yo'nalish ma'lumotlarini munosabatlar modeliga normallashtirish uchun GatewayRoute domenini quyidagi kabi loyihalashtirdik.

public class GatewayRoute {
    private String id;
    private String routeName;
    private String pathPattern;
    private String rewriteFrom;
    private String rewriteTo;
    private String uri;
    private long responseTimeout;
    private long connectTimeout;
    private boolean active;
    private List<ApiPermission> apiPermissions;
    private boolean useQueue;
    private int maxQueueSize;
    private int maxConcurrent;
    private List<KeyValue> requestHeaders;
}

public class ApiPermission {
    private String path;
    private List<String> permittedServices;
}

Ushbu domen modeli statik usulda ko'rib chiqilgan barcha yo'nalish ma'lumotlari bilan bir qatorda, kelgusida tavsif etiladigan [integratsiyalangan autentifikatsiya va ruxsat berish filtri] va [navbatni boshqarish] uchun metama'lumotlarni ham birlashtirib boshqarish imkonini berdi.

Shuningdek, dinamik saqlangan ma'lumotlarni haqiqiy yo'nalishga tadbiq etish uchun texnik asos SCG ning ichki mexanizmlaridan foydalanishdir. SCG dasturlash vaqtida RouteDefinitionLocator interfeysining implementatsiyalarini avtomatik ravishda aniqlab, yo'nalishlar ro'yxatini yuklaydi.

Biz buning uchun maxsus GatewayRouteConfig klassini yaratdik va DB dan yo'nalish ma'lumotlarini so'rab, SCG ning tushunishi mumkin bo'lgan RouteDefinition shakliga aylantirish logikasini amalga oshirdik. Shu orqali operatorlar boshqaruv UI-dan sozlamalarni o'zgartirish orqali, gatewayni qayta ishga tushirishsiz real vaqt rejimida yo'nalish qoidalarini qo'llay oladigan muhitni yaratilgan.

@Configuration
public class GatewayRouteConfig {

        @Bean
        public RouteDefinitionLocator dbRouteDefinitionLocator() {
        return () -> policySeek.findAllGatewayRoutes()
        .filter(GatewayRoute::isActive)
        .doOnNext(route -> {
                queueManager.updateRouteConfig(
                   route.getId();
                   route.getMaxQueueSize(),
                   route.getMaxConcurrent()
                );
           }
        .map(this::convertToRouteDefinition);
        }

        private RouteDefinition convertToRouteDefinition(GatewayRoute route){
        RouteDefinition definition = new RouteDefinition();
        definition.setId(route.getId());
        definition.setUri(route.getUri());
        String fullPath = normalizedContexPath() + route.getPathPattern();
        definition.setPredicates(List.of(new PredicateDefinition("Path=": + fullPath)));

        List<FilterDefinition> filters = new ArrayList<>();
        if (route.isUseQueue()){
                filters.add(new FilterDefinition("Queue"));
        }
        filters.add(new FilterDefinition("RewritePath=" + normalizeContextPath() + route.getRewriteFrom() + "," + route.getRewriteTo()));
        route.getRequestHeaders().forEach(keyValue -> filters.add((new FilterDefinition("AddRequestHeader=" + keyValue.getKey() + "," + keyValue.getValue())));
        definition.setFilters(filters);
     
        definition.getMetadata().put("response-timeout", route.getResponseTimeout());
        definition.getMetadata().put("connect-timeout", route.getConnectTimeout());
        }
}

Xullas

Bugungi kunga qadar Spring Cloud Gateway dan foydalangan holda, mavjud statik YAML konfiguratsiya usulidan chiqib, ma'lumotlar bazasiga asoslangan Muzhungsiz dinamik yo'nalish arxitekturasini qurish jarayonini ko'rib chiqdik. Infrastrukturani biznes ma'lumotlar sohasiga ko'tarish bu rivojlantirish ishlari praktika jihatidan quyidagi aniq afzalliklarni olib keldi.

  • Amaliyot va tarqatishni to'liq ajratish:Birgina API yo'lini qo'shish yoki vaqt o'tish ko'rsatkichlarini sozlash uchun butun tizimni qayta tuzish va tarqatishdagi noeffektivlik yo'qoldi. Endi ish jarayonida xizmat ko'rsatish to'xtamasdan real vaqtda marshrutlash qoidalarini qo'llash mumkin.

  • Ko'p vendor muhitida aloqa xarajatlarini kamaytirish:Turli ishlab chiqaruvchilarning mikroservislari har xil vaqtlarda tarqatilgan yoki end-pointlarni o'zgartirgan bo'lsa ham, gateway darajasida ma'lumotlarni o'zgartirish orqali tezkor javob berish mumkin bo'lgan to'siq joyi yaratilgan.

  • Moslashuvchan arxitektura kengaytirilishi:Marshrutlash metama'lumotlarini normallashtirilgan domen modeli orqali boshqarish bilan, oddiy trafik yo'naltirishdan tashqari xavfsizlik va trafik nazoratini organik ravishda birlashtirish uchun mustahkam asos tadbiq etildi.

Lekin dinamik marshrutlash muhitini barqaror o'rnatish katta tuvalni yoyishdan boshqa narsa emas. Asosiy amaliy muammo bu tarqatilgan infratuzilma yoqasida qanday qilib xavfsizlik standartlarini saqlash va quvvatlanayotgan katta miqdordagi trafikni xavfsiz nazorat qilishda davom etmoqda. Keyingi qismda, bu qismda tayyorlangan dinamik marshrutlash infratuzilmasi asosida ishlayotgan asosiy biznes xavfsizligi va nazorat arxitekturasi haqida so'z yuritiladi.

Hustle Paul

Site footer