Обзор разработки Java-сервера

Java

Делитесь техническими знаниями в области Java, .NET, Javascript, эффективности, разработки программного обеспечения, языков программирования и т. д.

эта статьяGitHub TechShareВ комплекте, без рекламы, просто для удовольствия.

Java-разработка на стороне сервера — это очень широкая область. Чтобы обобщить всю картину, даже несколько книг не могут ее описать. площадь.

содержание

Рамка

Spring Boot

Фреймворк Spring стал стандартом в области разработки Java-серверов, на его основе разработано множество сервисов, он интегрирует большинство компонентов, необходимых для серверной разработки, на его основе Spring Boot сделал слой легкой инкапсуляции и упрощения. управление зависимостями, оно удобнее в использовании.

Vert.x

Фреймворк Spring уже стал мейнстримом, но мы не можем игнорировать существование других отличных фреймворков.

Vert.xЭто набор инструментов для создания адаптивных приложений на базе JVM, поддерживает несколько языков, это не только набор инструментов, но и набор фреймворков, включая веб-фреймворки, gprc и клиенты Redis, написанные на Netty. Наиболее важной базовой концепцией является использование неблокирующей модели, управляемой событиями, поэтому она обладает высокой степенью масштабируемости. Он использует модель реактивного программирования, тема, которая будет рассмотрена позже.

Интернет

пятиуровневый протокол

При изучении компьютерных сетей обычно применяется компромиссный метод, то есть нейтрализуются преимущества OSI и TCP/IP, и принимается архитектура только с пятью уровнями протоколов, а именно: физический уровень, канальный уровень, сетевой уровень, транспортный уровень. уровень, прикладной уровень.Уровни, каждый уровень имеет свои термины, такие как: пропускная способность, маска подсети, VIP, DNS и т. д., которые также имеют решающее значение в процессе связи при нормальной работе. Чтобы хорошо программировать на стороне сервера, мы должны иметь четкое представление о некоторых основных концепциях сети.Рекомендуется прочитать "Компьютерные сети: нисходящий подход".

Рекомендуемое чтение:

HTTP-протокол

Для программирования на стороне сервера наиболее важной частью сети является протокол HTTP.От TCP, DNS и, наконец, до ответа браузера, мы должны знать, как работает весь процесс, а затем добавить CDN, обратный прокси-сервер и управление потоком. посередине.При ожидании сервисов это будет сложнее, но также из-за многоуровневой модели сети мы можем оптимизировать производительность ответа сервера в этом промежуточном процессе.

Что характерно для протокола HTTP, он переносится поверх протокола TCP, а TSL или SSL добавляются посередине, чтобы стать HTTPS. Как анализировать заголовок протокола и как отправлять тело ответа? После выяснения этого вы можете легко разработать простой HTTP-сервер. Протокол HTTP также постоянно совершенствуется, и теперь он достиг версии 2.0, что значительно улучшило производительность передачи.

HTTP использует передачу в виде открытого текста, поэтому он уязвим для атак «человек посередине».Информация о передаче может быть перехвачена на нескольких уровнях, таких как маршрутизаторы и прокси-серверы.Поэтому HTTP в конечном итоге выйдет из исторической стадии, а HTTPS неизбежно станет Однако HTTPS не является абсолютно безопасным из-за существования агентств, выдающих сертификаты. Из-за лазеек в системе безопасности многие веб-сайты используют небезопасные сертификаты SSL, поэтому многие приложения будут использовать собственные методы шифрования для повышения безопасности передачи информации.

Контроль перегрузки TCP

TCP использует различные стратегии управления перегрузкой, чтобы предотвратить перегрузку канала между отправителем и получателем. Он имеет много конкретных алгоритмов реализации. Конкретные детали реализации скрыты в ядре операционной системы. Используя различные алгоритмы, вы можете Получите наилучшую производительность в различных сценариях, таких как алгоритм перегрузки BBR (узкая полоса пропускания и время распространения туда и обратно), разработанный и выпущенный Google, который может более эффективно использовать сетевую среду, особенно при передаче по сети на сверхдальние расстояния. большее улучшение производительности, и он был перенесен на версию ядра Linux 4.9.

Поскольку многие алгоритмы, относящиеся к сетевому уровню, скрыты в ядре операционной системы, обычным пользователям компьютеров обычно не нужно разбираться в этих понятиях, но разработчики серверов, если они имеют определенное представление о них, могут найти решения с этого уровня для повышения пропускная способность системы.

Модель сетевого ввода/вывода

Общие модели ввода-вывода в основном включают BIO (блокирующий ввод-вывод), NIO (неблокирующий ввод-вывод), мультиплексирование ввода-вывода, ввод-вывод, управляемый событиями (сигналами), и AIO (асинхронный ввод-вывод). При чтении данных в качестве примера метод чтения сокета вызывается в традиционном BIO, и функция будет блокироваться до тех пор, пока данные не будут получены.Для NIO, если есть данные, он вернется, в противном случае он вернет 0, и блокировка не будет происходят, в то время как AIO идет дальше, мало того, что это неблокирующее ожидание готовности данных, так еще и процесс передачи данных из сетевой карты в память также асинхронный.

Комбинация NIO, AIO и мультиплексирования ввода-вывода может устранить узкие места потоков и обрабатывать массивные соединения.Например, nginx использует модель AIO, поэтому его производительность лучше, чем у http-сервера apache. В области Java Netty реализует асинхронную управляемую событиями структуру NIO на основе модели Reactor, которая использовалась во многих областях Интернета, начиная от больших данных, индустрии связи, игровой индустрии и заканчивая компонентами с открытым исходным кодом, такими как Redis. клиент и веб-фреймворк.Имеет свою фигуру.

база данных

Реляционная база данных

MySQL — самая популярная база данных с открытым исходным кодом, PostgreSQL — самая передовая база данных с открытым исходным кодом, SQL Server — корпоративная база данных, разработанная Microsoft, а база данных Oracle больше используется в крупных компаниях. С точки зрения разработки на стороне сервера, MySQL имеет самую высокую степень занятости на рынке, но также рекомендуется изучить PostgreSQL и так называемую «базу данных уровня предприятия», ведь MySQL иногда действительно кажется простым по функциям и недостаточным. на практике перед этими базами данных.

В реальной работе проектирование базы данных представляет собой процесс, требующий множества компромиссов. Иногда необходимо обеспечить избыточность данных, чтобы оптимизировать производительность запросов. В случае большого объема данных тип хранения каждого столбца должен быть тщательно отобраны. , чтобы избежать избыточности.

В случае очень большого объема данных в большинстве случаев требуется проектирование подбазы данных и подтаблицы.

  • ShardingSphere
    • В настоящее время основное промежуточное ПО для подбаз данных и подтаблиц в Java поддерживает архитектуру на стороне клиента и архитектуру прокси, а архитектура Sidecar все еще находится в стадии разработки.
  • Vitess
    • Vitess – это кластерная система базы данных MySQL с открытым исходным кодом, разработанная YouTube. Она использует архитектуру прокси-сервера централизованной базы данных. Этот кластер данных содержит сотни миллионов данных YouTube и запросов на доступ.

механизм хранения

Основное использование MySQL - это механизм хранения InnoDB, который использует внутреннюю структуру индекса дерева B +. Percona XtraDB — это расширенная версия механизма хранения InnoDB. Percona совместима с MySQL и утверждает, что имеет лучшую производительность и определенную долю рынка.

В дополнение к InnoDB и производным от него механизмам также можно выбрать RocksDB.Это механизм хранения LSM.В отличие от традиционного механизма хранения на основе дерева B+, база данных на основе механизма хранения LSM особенно подходит для сценариев с большим количеством операций записи и меньшим читает. Он используется для постоянного хранения данных типа "ключ-значение", поэтому имеет очень высокую производительность в хранилище KV. К сожалению, MySQL не может выбрать RocksDB в качестве механизма хранения. В настоящее время поддерживаются базы данных MariaDB и Percona.

NewSQL

Новая область NewSQL также использует RocksDB в качестве механизма хранения, а TiDB, как популярный продукт NewSQL, использует его для обеспечения постоянства данных.

Базы данных NoSQL

  • MongoDB
    • MongoDB находится между реляционными базами данных и нереляционными базами данных, не требует хранения данных с фиксированной схемой и может использоваться для хранения очень больших наборов данных.

База данных временных рядов

С углублением Интернета сценарии приложений становятся все более и более многочисленными.Сценарии, такие как состояние работы системы и сбор системного индекса, генерируют большой объем данных.Этот тип данных с привязкой ко времени характеризуется большим объемом записи и меньшим объемом чтения, а также огромное количество данных.Традиционная база данных больше не подходит для хранения такого рода данных, и родилась база данных временных рядов.

Основные базы данных временных рядов:

  • influxdb
  • Prometheus
  • graphite

столбчатая база данных

Традиционная реляционная база данных использует хранилище на основе строк, а поле больших данных в основном использует хранилище на основе столбцов.Основное преимущество хранилища на основе столбцов заключается в том, что его можно извлекать по запросу, и оно имеет больше преимуществ в параллельной обработке и сжатии данных. . Реляционные базы данных подходят для OLTP, а столбцовые базы данных больше подходят для OLAP. Чтобы столбцовые базы данных лучше поддерживали OLTP, существуют отличные продукты с открытым исходным кодом, такие как kudu и Druid. OLTP также был специально оптимизирован.

Наиболее популярные столбцовые базы данных:

  • HBase
  • Cassandra
  • kudu
  • Druid

Встроенная база данных

Традиционные реляционные базы данных могут поддерживать приложения корпоративного уровня, но во многих сценариях нам может понадобиться только небольшое приложение. В настоящее время использование встроенной базы данных является удобным выбором. Кроме того, встроенные базы данных очень подходят для выполнения модульных тестов.

Популярными встроенными базами данных на Java являются:

  • h2base
  • moby

промежуточное ПО

Web Server

  • Nginx
    • Nginx использует модель AIO для достижения высокого параллелизма, а у Apache есть эксклюзивный поток для каждого запроса.
    • Модель AIO подходит для сервисов с интенсивным вводом-выводом, а многопроцессорная или многопоточная обработка подходит для сервисов с интенсивным использованием ЦП.Поскольку большинство веб-сервисов требуют интенсивного ввода-вывода, доля рынка nginx постепенно превзошла Apache. Благодаря этой функции Nginx также очень подходит в качестве обратного прокси-сервера, и балансировка нагрузки с помощью этого механизма также является очень популярным решением.
  • Традиционные веб-серверы Java, такие как tomcat, jetty, weblogic и т. д.
    • С ростом популярности технологии контейнеризации этот тип серверов с каждым днем ​​сокращается, и его доля на рынке постепенно снижается.Tomcat обычно встраивается в программу во время контейнерного развертывания.Этот прогресс позволяет разработчикам уделять больше внимания самому бизнес-коду, не обращая внимания на такие детали сервера можно охарактеризовать как облегчение для разработчиков.
  • OpenResty
    • Отличные продукты с открытым исходным кодом часто имеют множество отличных производных, таких как Percona для MySQL, OpenResty для Nginx и Kong для OpenResty.
    • Nginx имеет большую долю рынка, но во многих сценариях он используется в качестве обратного прокси-сервера.Цель дизайна OpenResty — позволить веб-сервисам работать непосредственно внутри сервисов Nginx.
    • OpenResty также является веб-платформой на основе LuaJIT. Разработчики могут легко использовать Lua для вызова модулей Nignx с высокой масштабируемостью. Например, типичную архитектуру Nginx + Tomcat + MySQL можно заменить на Nginx + Lua + Redis + Tomcat + MySQL. архитектура.
    • Kong также технически является веб-сервером, но обычно используется в качестве шлюза API, который будет подробно описан ниже.

Распределенный кеш

  • Redis
    • Как высокопроизводительная база данных в памяти, Redis в настоящее время широко используется.Он поддерживает множество структур данных.Только при использовании разных структур данных в соответствии с разными сценариями его можно использовать наиболее эффективно.

КВ хранения

  • Pika
    • Производительность Redis очень высока, но есть проблема сохранности данных при использовании его в качестве базы данных.Появилась Pika для решения этой проблемы.Внизу он основан на RocksDB, и некоторые его исходные коды были изменены.Там Сохранение данных KV Очень высокая производительность, с небольшим падением производительности по сравнению с Redis на основе памяти, и он также совместим с большинством протоколов Redis, почти так же, как использование Redis, и его легко начать.
  • Tair
    • Подобно Pika, Tair поддерживает несколько движков хранения внизу, включая mdb, rdb и ldb, из которых ldb основан на leveldb (google с открытым исходным кодом, на его основе оптимизирована rockdb), он может сочетать хранение в памяти и постоянство, и имеет высокую доступность Распределенная архитектура, текущая версия с открытым исходным кодом больше не поддерживается, а Alibaba Cloud предоставляет услуги хранения Tair на уровне предприятия.
  • SSDB
    • SSDB также является базой данных KV, совместимой с Redis. В настоящее время частота обновления низкая. Для сравнения, Pika все еще обновляется, и некоторые компании одобрили ее.

очередь сообщений

Очереди сообщений используются во многих сценариях, таких как сокращение пиковых нагрузок на запросы, развязка межсистемной связи, публикация и подписка и т. д. Эти проблемы можно не только решить, но и архитектура, управляемая сообщениями, может повысить масштабируемость системы, например, добавить абонента, т.е. новые функции могут быть реализованы без какого-либо вмешательства в текущую систему.

Обычно используемые продукты очереди сообщений — это kafka, rabbitmq и т. д., каждый из которых имеет свои преимущества и недостатки.В области больших данных у kafka есть абсолютное преимущество, и общая доля рынка также высока, и rabbitmq также широко используется из-за его зрелых продуктов.

В процессе использования очередей сообщений вам необходимо иметь дело с рядом деталей, таких как: определение обработчиков сообщений, как отправлять сообщения, как публиковать события, как сериализовать сообщения, как записывать записи сообщений, разрабатывать маршрутизацию сообщений и т.д. сбои обработки сообщений и повторных попыток Механизмы, идентификаторы сообщений и т. д. не могут быть полностью сосредоточены на разработке бизнес-кода во время конкретного процесса кодирования. Поэтому некоторые продукты ESB на рынке обрабатывают эти детали внутри компании и предоставляют более лаконичный API с более высокого уровня абстракции. , В процессе разработки мы можем больше сосредоточиться на самой бизнес-логике.Когда наша система сталкивается с этими проблемами, мы могли бы также выбрать продукт ESB для повышения эффективности исследований и разработок.

Запланированное

Простые запланированные задачи можно настроить с помощью linux cron, а сложные сценарии также могут использовать структуру распределенного планирования задач.Существует множество дополнительных методов реализации, вот лишь некоторые из них.

  • Quartz
    • Старая система планирования задач, на ее основе расширены многие фреймворки распределенного планирования задач.
  • Spring Scheduler
    • Его очень удобно использовать для простого планирования задач, но следует отметить, что, поскольку большинство текущих систем используют распределенное развертывание, лучше всего использовать его для планирования задач в отдельной службе, чтобы избежать сопряжения с другими системами.
  • Домашняя распределенная система планирования задач
    • В настоящее время более популярными являются Elastic-Job и XXL-JOB.Elastic-Job использует децентрализованную архитектуру и полагается на zookeeper для хранения данных планирования задач.XXL-JOB использует централизованную архитектуру планирования, а планирование использует RPC.
    • PowerJob — это новая система планирования задач с открытым исходным кодом, более мощная по функциям и поддерживающая сегментирование MapReduce, что заслуживает внимания.

RPC

Когда дело доходит до RPC, мы должны упомянуть веб-службу Riguro West Mountain, которая использует XML в качестве формата сообщения и инкапсулирует его с помощью протокола SOAP.Из-за своей сложности и высокой производительности он постепенно заменяется службой REST. в формате JSON.Внизу REST прост и использует более эффективный метод сериализации, поэтому многие системы в настоящее время широко используют HTTP для удаленных вызовов процедур.

В сценариях с особенно высокими требованиями к производительности или с учетом общей архитектуры люди будут выбирать специальные продукты RPC.Такие системы, как правило, имеют более эффективные протоколы связи и форматы передачи данных, такие как dubbo, grpc и thrift, среди которых grpc имеет лучшую производительность. .

Принцип RPC-фреймворка на самом деле аналогичен HTTP-вызовам, за исключением того, что он принимает более оптимизированный заголовок протокола и метод сериализации данных, а также имеет специальную инкапсуляцию при обнаружении регистрации службы и балансировке нагрузки. В Spring Cloud использование OpenFeign для межсервисных вызовов является очень удобным выбором. Он использует HTTP. Когда производительность не может быть удовлетворена, вы можете рассмотреть возможность замены метода сериализации или выбрать grpc для связи.

Промежуточное ПО базы данных

База данных сама по себе является огромным продуктом.Помимо вышеупомянутого промежуточного программного обеспечения, такого как ShardingSphere и Vitess, существует также класс промежуточного программного обеспечения, специализирующегося на обработке данных.

  • otter
    • Распределенная система синхронизации баз данных, поддерживает MySQL, Oracle.
  • canal
    • Инкрементный анализ журнала на основе базы данных MySQL, обеспечивающий подписку и потребление инкрементных данных.
  • DataX-Web
    • Распределенный инструмент синхронизации данных, который можно использовать для упрощения работы ETL.
  • gh-ost
    • При изменении схемы структуры таблицы данных таблица может быть заблокирована.Если объем данных особенно велик, эта проблема сильно повлияет на онлайн-публикации.Вы можете вручную создать новую таблицу, перенести данные, а затем изменить имя таблицы. Этот метод подвержен ошибкам и отнимает много времени. Онлайн-инструмент миграции схемы MySQL с открытым исходным кодом Github является хорошим выбором для программного выполнения этого типа операции.

лог-система

  • ELK
    • Лог-система в основном использует технологический стек ELK, который содержит три подсистемы, поэтому для расширения новой функции есть много способов врубиться, например, для мониторинга и оповещения можно использовать logstash для записи метрик в Prometheus, или вы можете использовать плагин kibana.sentinel или плагин ElastAlert.
    • logstash поддерживает сбор данных из многих пайплайнов, включая kafka, и в случае особенно больших объемов журналов журналы можно сначала отправить в kafka.
  • Sentry
    • Журналы используются для устранения ошибок в большом количестве сценариев.Помимо ELK, существуют системы, ориентированные на отчеты об ошибках приложений, такие как Sentry.

Центр конфигурации

Поскольку все больше и больше систем развертывается на основе докера, центр конфигурации может не только упростить управление конфигурацией системы, но и упростить процесс выпуска системы.В настоящее время более популярным центром конфигурации с открытым исходным кодом является Apollo. Кроме того, унифицированное управление конфигурацией также может быть достигнуто с помощью таких инструментов, как zookeeper и Consul.

Nacos — это система с открытым исходным кодом Alibaba, которая объединяет центр конфигурации и центр регистрации, ее также удобнее использовать в качестве центра конфигурации, а развертывание на стороне сервера намного проще, чем Apollo.

Микросервисы

Из-за того, что одно приложение влияет на все тело, многие крупномасштабные приложения будут сознательно разделены на несколько подсистем во время разработки.Этот метод широко применялся до того, как была предложена концепция микросервисов, в то время как концепция микросервисов Далее предлагается новый метод разработки системы, чтобы систему можно было легко разделить на более мелкие гранулярности, то есть микросервисы, тогда в случае увеличения количества сервисов управление сервисом, предохранительный даунгрейд, связь Также всплыли трассировка и другие проблемы, и появилась платформа Spring Cloud для решения этих проблем.

Регистрация и обнаружение службы

Основными компонентами регистрации и обнаружения служб являются: Eureka, Consul, Nacos и т. д. Они используют разные правила распределенной согласованности CAP или поддерживают их, но независимо от того, какой из них используется, все еще существует проблема отключения службы, например, в процессе скользящего обновления, реестр не смог вовремя удалить службу, в результате чего вызывающая сторона все еще вызывает остановленную службу. Прежде всего, мы можем сократить цикл обновления, настроив конфигурацию. При необходимости нам нужно изменить ее исходный код, используйте длительное соединение, пока соединение установлено. Прерывание заключается в удалении службы из реестра, и конкретные детали должны быть написаны в статье для объяснения.

По возможности старайтесь использовать механизм сообщений для взаимодействия между службами. Это лучший выбор. Помимо лучшей развязки, чередующиеся обновления также могут лучше поддерживать бесперебойную работу системы.

Слияние и понижение версии

Слишком много вызовов между службами, что в определенной степени увеличивает связанность системы. Когда другие микрослужбы дают сбой или медленно реагируют, это влияет на всю систему. При необходимости рассматриваемая служба должна быть объединена или понижена.

  • Hystrix
    • Компонент прерывателя цепи, интегрированный по умолчанию в среду Spring Cloud.
  • Sentinel
    • Компонент автоматического выключателя, интегрированный в Spring Cloud Alibaba, предоставляет внешнюю консоль, которая может регулировать конфигурацию понижения версии автоматического выключателя системы в режиме реального времени, что в этой части сильнее, чем у Hystrix.

Отслеживание ссылок / APM

Службы вызывают друг друга, что значительно усложняет отладку одного приложения. В настоящее время использование инструмента отслеживания ссылок может упростить отладку и более интуитивно контролировать производительность приложения.

Основные компоненты отслеживания ссылок:

  • zipkin
  • pinpoint
  • SkyWalking
  • jaeger

Шлюз API

В системе Spring Cloud обычно используются шлюзы Zuul спереди и Gateway сзади.Эта категория тесно интегрирована со Spring Cloud и проста в использовании.Однако, поскольку все они написаны на Java, они все же уступают некоторым специализированным шлюзовые продукты во многих сценариях.

  • Kong
    • Kong — это продукт шлюза с открытым исходным кодом, созданный на основе OpenResty, который обладает отличной производительностью и богатым набором подключаемых модулей для удовлетворения многих требований к расширяемости.
  • Traefik
    • Traefik — это шлюз, написанный на языке Go. метрики трафика, которые можно подключить к Prometheus. Его корпоративная версия включает в себя такие функции, как текущее ограничение и высокая доступность, а версия с открытым исходным кодом отсутствует в этой части.

сервисная сетка

От эволюции монолитных приложений до микрослужб мы обнаружим, что управление службами, разрыв цепи и отслеживание являются почти неотъемлемыми частями.Даже при использовании среды Spring Cloud нам необходимо обращать внимание на большое количество технических деталей микрослужбы.Чтобы Сфокусировавшись на том, чтобы сделать эти технологии похожими на инфраструктуру, появились сервисные сетки.

Что такое сервисная сетка?

Сервисная сетка похожа на TCP/IP между микросервисами, отвечает за сетевые вызовы, ограничение тока, автоматические выключатели и мониторинг между сервисами. При написании приложений вам, как правило, не нужно заботиться об уровне TCP/IP (например, RESTful-приложения через протокол HTTP), а при использовании Service Mesh также не нужно заботиться о тех вещах между службами, которые изначально были реализованы с помощью сервисных фреймворков. такие как Spring Cloud, Netflix OSS и другое промежуточное ПО теперь можно передать в Service Mesh.

Текущие основные сервисные сетки:

  • Istio
  • Linkerd

Общие компоненты с открытым исходным кодом

Сказанное выше здесь повторяться не будет.

доступ к данным

  • MyBatis Plus
  • Mapper
  • jOOQ
  • JPA
  • dynamic-datasource-spring-boot-starter
  • sharding-jdbc

Компоненты инструмента

  • guava
  • commons-lang3
  • hutool

тайник

  • redission
  • jetcache
  • caffeine

Модификация байт-кода

  • asm
  • javassist
  • cglib

http-клиент

  • okhttp
  • Aache HttpClient
  • retrofit
  • openfeign

реактивное программирование

  • RxJava
  • reactor-core

Сериализация

  • protobuf
  • protostuff
  • hessian

Распределенная транзакция

  • seata

фреймворк, управляемый событиями

  • AxonFramework

двигатель правил

  • drools

контрольная работа

  • junit
  • mockito
  • Spock

идеи программирования

Идея программирования - это абстрактная концепция. Чтобы визуализировать ее, мы должны увидеть ее сущность через явления. Отличные идеи программирования - это организация различных превосходных идей. Эти идеи могут быть уточнены во множество принципов. Принципы составляют одну из идей программирования. Важная часть , и общее руководство, которому могут следовать все стили программирования. На основе принципов некоторые проблемы, многократно решаемые в процессе кодирования, обобщаются в паттерны.Эти два являются основными составляющими идей.Кроме того,существуют разные парадигмы и методологии программирования.Кратко расскажу о принципах проектирования здесь.

в общем

Многие принципы применимы не только к программированию, но и к другим областям, и я думаю, именно поэтому Стив Джобс выступал за то, чтобы каждый научился программировать, потому что это позволяет лучше мыслить.

  • будь проще
    • Keep It Simple, Stupid (KISS)
      • Один из самых важных принципов заключается в том, что надежность исходит из простоты Только сохраняя простоту системы и простоты кода можно создать более качественное программное обеспечение.
    • Тебе это не понадобится (ЯГНИ)
      • Не добавляйте сложности, если в этом нет необходимости, и избегайте чрезмерной инженерии.
    • Разделение проблем (SoC) — разделение проблем
      • Объединяет части, связанные с целью, вместе и идентифицирует их как проблемы. Это важный принцип для снижения сложности, и шаблон MVC или MVP является применением этого принципа, рассматривая модель, представление и контроллер как отдельные задачи, что делает каждую из них более эффективной для понимания и повторного использования.
      • В процессе кодирования эта идея тоже может быть применена, например, мы сначала обращаем внимание на то, доступно ли приложение, а затем обращаем внимание на эффективность работы при его корректной работе, что гораздо проще, чем выполнять эти две задачи в одном месте. в то же время.
  • не повторяй
    • Не повторяйся (СУХОЙ)
      • Самый простой и понятный принцип, каждому программисту должно быть стыдно копировать и вставлять код по своему желанию.
    • Соглашение по конфигурации (CoC) - Принцип соглашения по конфигурации
      • Использование согласованных методов конфигурации и информации в качестве правил по умолчанию сокращает количество решений, принимаемых разработчиком, сокращает объем кода и обеспечивает преимущества простоты без потери гибкости.
      • Одна из проблем, которую решает инфраструктура Spring Boot, заключается в упрощении конфигурации проекта, в котором широко применяются принципы CoC.
  • Принципы S.O.L.I.D.
    • Принцип единой ответственности (SRP) - Принцип единой ответственности
      • Класс, который делает только одну вещь и делает это хорошо, имеет только одну причину для ее изменения.
      • Очень простой принцип, но многие программисты часто нарушают этот принцип в своей работе.Например, сервисный класс вводит множество дао-объектов для предоставления множества несвязанных сервисов.
    • Открытый/Закрытый Принцип (OCP) – Открытый/Закрытый Принцип
      • Модули расширяемы, но не модифицируемы. То есть он открыт для расширения и закрыт для модификации.
      • Шаблоны агента, стратегии и наблюдателя в шаблонах проектирования хорошо реализуют этот принцип.
      • Когда мы определяем API, который принимает функции в качестве параметров, это фактически вариант шаблона стратегии, который также воплощает этот принцип.
    • Принцип замещения Лисков (LSP) - принцип замещения Лисков
      • Подклассы должны заменяться их базовыми классами.
      • Этот принцип можно использовать в качестве эталона для нашего дизайна отношений наследования классов.
    • Принцип разделения интерфейса (ISP) — Принцип разделения интерфейса
      • Лучше разделить интерфейс и использовать несколько специализированных интерфейсов, чем использовать один общий интерфейс.
      • Интерфейсы могут быть мультинаследованы, так зачем определять их в общем интерфейсе из-за лени?
    • Принцип инверсии зависимостей (DIP) - Принцип инверсии зависимостей
      • Модули высокого уровня должны зависеть не от реализации модулей низкого уровня, а от абстракций высокого уровня.
      • IoC — это конкретная реализация DIP, которая глубоко встроена в язык программирования.Среда Spring сначала использовалась только как контейнер IoC, а затем продолжила расширять множество практических функций и, наконец, стала средой разработки.
      • Связанные принципы: Принцип Голливуда — принцип Голливуда (все компоненты пассивны, за инициализацию и вызов всех компонентов отвечает контейнер).
  • Высокая сплоченность, низкая связанность
    • Закон Деметры – Закон Деметры
      • Также известный как «принцип наименьшего знания», чем меньше класс знает о других классах, тем лучше, и чем больше он знает, тем выше степень связанности.
      • И фасадный паттерн, и посреднический паттерн являются примерами применения Закона Деметры.
      • Этот принцип подчеркивает низкую связанность.
    • Общий принцип закрытия (CCP) — Общий принцип закрытия
      • Если код в приложении должен быть изменен, мы хотим, чтобы все изменения происходили в одном пакете (модификация отключена), а не распределялись по многим пакетам.
      • В микросервисной архитектуре, если при изменении функции необходимо изменить несколько сервисов, это, вероятно, нарушит принцип CCP и ненадлежащим образом разделит сервисы.
      • Этот принцип подчеркивает высокую сплоченность.
    • Общий принцип повторного использования (CRP) — общий принцип повторного использования
      • Все классы пакета повторно используются вместе, классы, которые не используются повторно вместе, не должны группироваться вместе. Зависеть от пакета означает зависеть от всего, что содержится в этом пакете.
      • CCP приносит пользу мейнтейнерам системы, CCP делает пакет настолько большим, насколько это возможно (принцип CCP добавляет функционально связанные классы), а CRP делает пакет как можно меньше (принцип CRP исключает неиспользуемые классы). Их отправные точки различны, но они не конфликтуют друг с другом.
      • Этот принцип также подчеркивает высокую сплоченность.

Эпилог

Как упоминалось в начале, область серверной разработки чрезвычайно велика, и есть много направлений, которые не были упомянуты в этой статье, например, безопасность, DevOps и так далее. Эволюция технологий ускорила расширение этой области, и в будущем будет много изменений.Может быть, Service Mesh станет мейнстримом, а может быть, NewSql станет стандартом для разработки.История развития любой технологии становится длиннее, и его общее время обучения будет соответственно увеличиваться, но это не означает, что его применение также усложнится. Мы не можем игнорировать фактор облачных вычислений. Предоставление облачных услуг скрывает многие детали для разработчиков. В эту эпоху вы делаете не нужно знать каждый элемент Принцип технологии может также разрабатывать продукты, которые служат миллионам пользователей.

Во что превратится будущее, вы можете с нетерпением ждать этого, но не просто с нетерпением ждать этого, потому что будущее уже наступило, но оно не было распределено равномерно.