Эта статья участвовала в учебном плане выходного дня, щелкните ссылку, чтобы просмотреть подробности:Наггетс.Талант/пост/696572…
Кода не так много, и статья может быть немного длинной. Друг спросил о механизме SPI в интервью с фабрикой, и я подумал о сцене SPI, которую я недавно написал о своем проекте.Статья кратко описывает процесс разработки механизма SPI.
выходной фон
Поскольку в недавних проектах ShardingSphere использовалась подбаза данных, подтаблица и шифрование данных, я решил за это время взглянуть на реализацию исходного кода. Зачем мне читать исходный код? Не смотрите на исходники, как улучшить силу, это так незамысловато~
Учитывая мою привычку читать статьи WeChat, мне не нравится слишком много кода, и логика немного неясна. Поэтому стиль будущих статей будет,Меньше кода, рисуй + ББ
Sharding-Jdbc SPI
Процесс просмотра исходного кода часто начинается с момента открытия пакета Jar. По стечению обстоятельств, я увидел, что под пакетом с исходным кодом есть пакет SPI, поэтому я немного щелкнул из любопытства, гм~ Код действительно знаком, и он по-прежнему похож на оригинальный рецепт.
После долгого просмотра я погрузился в глубокие размышления. Внутренний Сяо Цзюцзю: Кажется, я уже видел эту штуку раньше, но забыл, где она, что это такое?
Код все еще тот код, но он знает меня, я его больше не знаю
Интерфейс SPI этого блока — это интерфейс, зарезервированный для пользовательских шифраторов с помощью shrding-jdbc.
Видя это, я считаю, что столкнулся с проблемой, с которой столкнется большинство технических студентов, а именно:думаю, ты будешь, а реальная ситуация? неуверенный. Итак, изучите технику,Обязательно прочитайте его несколько раз, чтобы попытаться понять память.. Не стоит один раз прочитать и подумать, что технология такая простая, а потом каждые десять дней и полмесяца забывать о ней.
Продолжайте возвращаться и говорить о сегодняшнем главном герое: SPI. Сначала ответьте на вопрос, что такое механизм SPI
Полное название SPI — интерфейс поставщика услуг.это механизм обнаружения сервисов. Его можно использовать для реализации расширений фреймворка или замены компонентов для API, реализованных или расширенных третьими сторонами.
Суть механизма SPI состоит в том, чтобыПолное имя класса реализации интерфейса настраивается в файле, а файл конфигурации считывается загрузчиком службы, класс реализации в файле загружается,Таким образом, среда выполнения может динамически заменять класс реализации для интерфейса.
Чтение описаний и предисловий всегда скучно и пусто. Проще говоря, выMETA-INF/servicesОпределите файл ниже, а затем загрузите классы в вашем файле определения через специальный загрузчик классов при запуске, чтобы можно было расширить функции исходного фреймворка.
Все просто, некоторые читатели могут спросить: я не определяюMETA-INF/servicesБудет ли работать следующее? Я хочу определить это в другом месте
Нет капли,Пожалуйста, остановите эту опасную мысль, как люди определяют вас, как достичь. Это путь конфигурации, указанный JDK. Вы можете определить его по своему усмотрению. Как загрузчик классов узнает, куда его загрузить?
видеть этоPREFIXПосле постоянного более активный молодой человек не знает, как проснуться. Просто нарисуйте рисунок, чтобы описать механизм работы SPI.
Студенты с небольшой базой SPI должны снова начать чувствовать себя уверенно, увидев картинку Разве это не то, что я видел раньше? Да, технология еще та технология, можете дальше посмотреть, есть ли что-то, о чем вы не знаете
Почему СПИ
Чтобы понять предпосылку технологии, вы должны знать, какие болевые точки она решает, и автор JDK не будет добавлять какой-либо код для игры.
После введения механизма SPI,Интерфейс службы и реализация службы достигнут состояния разделения, можно реализоватьМеханизмы разделения и расширения программы. После того, как поставщик услуг (например, Springboot Starter) предоставляет интерфейс SPI, клиент (обычный проект Springboot) может зарегистрироваться локально,Зарегистрируйте класс реализации на сервере, легко подключаемый
Пример шифрования данных
Возьмем в качестве примера реальный проект, возьмем в качестве примера модуль шифрования данных sharding-jdbc, сам sharding-jdbc поддерживает методы шифрования AES и MD5. Но что, если клиент не хочет использовать два встроенных шифрования и предпочитает использовать алгоритм RSA? Должен ли sharding-jdbc выдавать версию каждый раз, когда добавляется алгоритм?
sharding-jdbc этого не сделает, сначала предоставьтеEncryptorЗашифруйте интерфейс и внедрите механизм SPI для достижения эффекта отделения интерфейса службы от реализации службы. Если клиент хочет использовать новый алгоритм шифрования, ему нужно толькоMETA-INF/servicesФайл полного имени интерфейса определяется в каталоге, а полное имя класса реализации шифрования записывается в файл, как показано ниже.
Через SPI алгоритм шифрования, предоставленный клиентом, может быть загружен в правило шифрования sharding-jdbc, чтобы во время работы над проектом можно было выбрать собственный алгоритм для шифрования и хранения данных.
На примере sharding-jdbc очень хорошо видно, что все упомянутые выше преимущества SPI отражены.
-
Клиент (его собственный проект) предоставляет пользовательскую реализацию интерфейса сервера (Sharding-JDBC), но он отделен от состояния сервера. Он будет загружен только тогда, когда клиент обеспечивает реализацию пользовательских интерфейсов, а остальные не связанные; клиент, добавление или удаление классов реализации на стороне клиента не повлияет на сторону сервера
-
Если клиенту не нужен алгоритм RSA и он хочет использовать встроенный алгоритм AES, класс реализации может быть удален в любое время с сильной масштабируемостью и подключаемой архитектурой.
Легко ли понять SPI на реальных примерах? Чтобы некоторые друзья не поняли пример sharding-jdbc, вот еще один реальный пример
Пример объектного хранилища
Если вы являетесь группой компаний, занимающихся разработкой общественной архитектуры (вы можете думать об этой группе как о более крупной группе с сотнями дочерних компаний 🙃️), руководитель поставил перед вами задачу по разработке,Требуется разработать службу хранения объектов, для использования командами в других направлениях бизнеса,Хранение объектов в единой группе
Хорошо, требования развития понятны, теперь пора подумать о том, как выполнить это требование (в основном я хочу произвести хорошее впечатление на лидеров, получить повышение и разбогатеть...). Первое, что нужно учитывать, это совместимость с несколькими наборами поставщиков объектных хранилищ, таких как Ali OSS, Tencent COS, Huawei Cloud OBS, самое простое трехсоединение, верно?
Он с радостью упаковал стартовый пакет, сообщил руководителю, что пакет готов, а затем разослал его каждой проектной группе для использования. Но в это время человек, отвечающий за одну из дочерних компаний, сказал вам, что раньше они использовали Qiniuyun Kodo.
Менталитет взорван, ты хочешь подогнать для него еще одного Цинююня? В случае адаптации этого другой старший брат сказал, что проект самостоятельно построенной HDFS должен быть скорректирован.
Поговорив об этом, все поймут, что появилась сцена SPI. как поставщик услуг,Когда вы не можете обеспечить абсолютное соблюдение норм, «делегирование полномочий» часто является более разумным выбором., соответствующим образом позволить клиенту настроить реализацию
В этот момент вернитесь и подумайте над первоначальным вопросом. Почему sharding-jdbc не реализует несколько наборов алгоритмов, а предоставляет интерфейс SPI?
Поскольку разработчики понимают, что независимо от того, сколько интерфейсов предоставляется,Всегда существуют индивидуальные потребности отдельных пользователей из-за различных факторов. Персонализация — вещь неотслеживаемая, какУ девушек такой же ум, они никогда не знают, о чем думают...(Ключевые моменты выделены черным и жирным шрифтом, а остальное зависит от вас, чтобы понять)
Практическое объяснение
Сказав это, это немного необоснованно без реальной битвы.Раздутое высокомерие, ответственность до конца! Просто реализуйте код для унифицированного сервиса хранения объектов, упомянутого выше.
Простейшее объектное хранилище требует только двух интерфейсов для реализации функций, а именнозагружать и скачивать
После определения интерфейсов загрузки и выгрузки нам необходимо рассмотреть,Как разрешить клиентским проектам выбирать базовый сервер хранилища объектов, и как загрузить определяемый клиентом компонент хранилища файлов на сервер через SPI
Мы можем определить контейнер хранилища объектов, хранить сервисы хранения объектов, которые можно использовать, а затемИспользуйте механизм SPI для загрузки пользовательских компонентов на стороне клиента в контейнер.. Сервис хранения объектов естественно нуждается в идентификаторе при размещении в контейнере, поэтому необходимо добавить интерфейс типа доступа к файловому интерфейсу
После определения интерфейса необходимо написать конкретный код. мыУслуги объектного хранения обеспечивают внешний фасад, все службы, которые обращаются к объектному хранилищу, должны иметь доступ к фасадному объекту для загрузки и скачивания файлов.
Следующий код будетХранилище сервисного компонента объекта в контейнере, и предоставить пользовательскую конфигурацию на основе клиента, чтобы выбрать соответствующую службу хранилища объектов
ключевые слова, используемые в кодеvarЭто аннотация ломбока, которая может автоматически определять тип объекта.
Поскольку это демонстрационный пример, хранилище объектов приобретения связано с конкретной загрузкой и выгрузкой.Если у небольшого партнера есть аналогичные требования,Различные виды поведения должны быть разделены, а классовые обязанности должны быть максимально простыми.
Общая логика этого кода несложная, поэтому я немного уверен, что вернусь назад и не буду запускать модульный тест, но проблема не должна быть большой. Объясните конкретную логику:
-
FileServiceFactoryВы можете понимать это как единый портал доступа для файловых служб к внешнему миру. Реализует интерфейс для инициализации spirng, который может выполнять логические операции кода во время инициализации bean-компонента. -
Когда bean-компонент инициализирован, передайте
ServiceLoaderЗагрузчик классов отвечает за загрузку интерфейса хранилища объектов, чтобы его можно было загрузить в клиент и сохранить вMETA-INF/servicesРеализация пользовательского хранилища объектов в -
После того, как пользовательское хранилище объектов получено, оно хранится в контейнере вместе с хранилищем объектов, которое поставляется с самим сервером, чтобы его можно было хранить в соответствии с
fileStoreTypeПолучить соответствующую услугу
В сочетании с реальным сценарием проекта простое приложение SPI завершено, и я чувствую, что лучше понимаю, чем пример сборки JDBC.
Вышеупомянутый бизнес предназначен только для небольших партнеров, которые не понимают SPI, чтобы лучше понять сценарии приложений.По сути, сервис объектного хранилища — исчерпывающий бизнес-сценарий., SPI не единственное решение. Конечно, нет ничего плохого в том, чтобы использовать SPI для удобства. Последнее слово,SPI — наиболее подходящий сценарий без единой бизнес-реализации, как упомянутый выше алгоритм шифрования
SPI
Статья по техническому анализу, будет лучше провести соответствующий анализ исходного кода. Давайте взглянемServiceLoaderЧто сделал нижний?
Создайте новый ServiceLoader с помощью метода загрузки ServiceLoader и создайте экземпляр его переменных-членов.
Приложение получает экземпляр объекта через интерфейс итератора, который сначала будет оцениваться здесь.providersЕсть ли экземпляр объекта в объекте
Если есть экземпляр, возвращаем его, если нет, выполняем шаг загрузки класса.Загрузка конкретного класса реализована следующим образом:
-
LazyIterator#hasNextServiceчитатьMETA-INF/servicesФайл конфигурации ниже, получите имена всех классов, которые могут быть созданы, и завершите синтаксический анализ файла конфигурации SPI. -
LazyIterator#nextServiceответственный за создание экземпляраhasNextService()Прочитайте класс реализации и сохраните созданный объект вprovidersкеш в коллекции
Не имеет значения, если вы не знаете некоторых из приведенных выше «сленгов», потому что это все
ServiceLoaderМетод выполнения нижнего уровня, следуйте следующей программе, чтобы понять код
Чтобы следовать исходному коду и сохранить логику вышеперечисленных объектов, написан простой пример SPI, который доказывает, что проблемы нет. Если вы хотите действительно понять, вам нужно взглянуть на исходный код, а другие части исходного кода подробно обсуждаться не будут.
Вывод
Выше было много сказано о преимуществах и сценариях применения механизма SPI, вот краткое изложение основного содержания.
-
Преимуществом механизма SPI является развязка. Разделите определение интерфейса и реализацию конкретного бизнеса вместо того, чтобы связывать его с бизнес-целью на одном конце. может быть реализованВключайте или заменяйте определенные компоненты во время выполнения в соответствии с реальными бизнес-сценариями.
-
Сценарий механизма SPI:Нет единой реализации стандартных бизнес-сценариев. Вообще говоря, сервер имеет стандартный интерфейс, но нет единой реализации, и бизнес-стороне необходимо предоставить его конкретную реализацию. Например, JDBC.
java.sql.DriverИнтерфейсы и пакеты реализации баз данных, предоставляемые различными поставщиками облачных услуг.
У всего есть преимущества и недостатки. Нам нужно смотреть на это с двух точек зрения, и мы не всегда можем сосредоточиться на одной. Поговорим о недостатках механизма SPI
-
Не могу загрузить по требованию. Хотя ServiceLoader выполняет отложенную загрузку, его можно получить только путем обхода. Если некоторые из классов реализации занимают много времени и вам не нужно их загружать, то это пустая трата ресурсов.
-
Способ получения класса реализации недостаточно гибкий, который можно получить только в виде итератора. По этим двум пунктам можно обратиться к реализации Dubbo SPI для оптимизации бизнеса
Статья поможет вам реорганизовать его с помощью изображений и текстов.Сценарии, преимущества и недостатки SPI, прочитав статью, я считаю, что у всех появилось более глубокое понимание механизма SPI
Разобравшись со сценариями и преимуществами SPI,Друзья, лучше зайдите на Отладку исходного кода, чтобы всем было понятнее реализация SPI.Только по-настоящему овладев точкой знания, можно не забыть ее вскоре после этого.
Вы также можете передать сцены в проекте, такие как шифрование, хранение объектов, упомянутые в тексте,Объединение логики проекта с аналогией для реализации замены кода, чтобы лучше изучить и расширить связанные дизайнерские идеи
Это не легко создать. Если вы видите статью здесь, если она полезна, вы можете нажать на нее, чтобы поддержать ее. Желаю удачи. Увидимся в следующий раз!