Как принять участие в топовом проекте с открытым исходным кодом

Java Dubbo
Как принять участие в топовом проекте с открытым исходным кодом

предисловие

В последнее время у меня много личных дел (переезд, смена работы, небольшой перерыв), поэтому я не успеваю следить за обновлениями блога, недавно получил письмо с напоминанием.

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

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

Участвуйте в открытом исходном коде

Теперь поговорим конкретно об участии в open source;

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

Однако в последние годы отечественные интернет-компании постепенно расширили свое влияние на международном уровне и значительно повысили уровень нашего развития.BATЕсть много отличных проектов с открытым исходным кодом под его руководством.

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

Конкретные шаги

Вот несколько шагов из моего личного опыта:

  • Обнаруженные проблемы или саморекомендацияfeature.
  • исходный код форка.
  • Локальная разработка, самотестирование.
  • положить началоpull request.
  • в ожидании сообществаCode Review.
  • Следите за комментариями сообщества, чтобы изменить код.
  • Утверждено, объединено вmasterфилиал, чтобы завершить этот вклад.

Ниже я объединим самое последнее участиеDubboпроцесс, чтобы обсудить подробно.

Нашли проблему или порекомендовали функцию

Первый шаг — выяснить, каково содержание вашего вклада. Обычно для решения проблемы или отправки новогоfeature; первый относительно легче.

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

Взяв этот раз в качестве примера, это проблема, которую я обнаружил во время использования, и я также отправил соответствующуюIssueи написал статью, документирующую и решающую проблему:какие? Запуск службы Dubbo занимает два часа!

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

После отправки в то же время сообщество может продолжить и быть отмеченнымinvalidТакже возможно, что этикетка считает, что это не проблема, или что осанка неправильная.

исходный код форка, локальная разработка

Когда будет определено, что эту проблему необходимо исправить, можно начинать разработку.

Первый шаг — скопировать исходный код в собственный репозиторий.

Затем вам нужно только клонировать исходный код в свой собственный репозиторий для локальной разработки.

Позвольте мне рассмотреть проблему, с которой я столкнулся в первую очередь.

Проще говоря, начатьDubboОбслуживание очень медленное, после позиционированияmainПоток блокируется при получении локального ip.

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

Проблема в том, что основной поток всегда будет блокироваться здесь.InetAddress.getLocalHost().getHostAddress(), но вам нужно знать, как долго он блокируется, прежде чем вы сможете судить, истекло ли время ожидания.

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

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

  • Объявляется пул потоков размера 1.
  • еще одно заявлениеvolatileФлаг используется для определения того, завершил ли основной поток задачу.
  • Объявите условие ожидания нового потока.
  • В конце концов, нужно только запустить эту ветку, чтобы судить об этом флаге.

Как проверить себя

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

Я думаю, что здесь стоит отметить несколько небольших хитростей.

Первый — это номер версии; поскольку тестирование выполняется локально, вам нужно использоватьmvn clean installПакет должен быть установлен локально, прежде чем его можно будет использовать в других проектах для тестирования.

Но поскольку версии кода, которые мы вытащили из официального, были выпущены в центральный репозиторий maven (будь то релиз или снапшот), эти версии пакетов jar уже должны существовать в нашем локальном репозитории.

Как только мы выполнимmvn clean installПри локальной установке измененного кода велика вероятность, что возникнет проблема (возможно, моя позиция неверна), из-за которой вновь созданный проект не сможет опираться на вновь добавленный код.

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

Однако при повторной отправке будьте осторожны, чтобы не отправить этот номер версии.

инициировать запрос на включение

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

Как только новая строка несовместима с исходным репозиторием,gitбудет думать, что эта модификация удалена и создана заново, что дастcode reviewдоставить огромные неприятности.

Точно так же, очевидно, количество строк, которые я изменил, невелико, ноgitПодтверждается, что вы отменили и начали заново, чтобы ревизия не знала, что вы изменили.

Самый простой способ - настроить себяgitДля глобальной конфигурации вы можете обратиться кздесь.

# 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true

# 提交时转换为LF,检出时不转换
git config --global core.autocrlf input

# 提交检出均不转换
git config --global core.autocrlf false

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

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

Хироши Ватанабэ.apache.org/en-US/docs/…

Code Review

prПосле запуска вы можете дождаться рассмотрения сообществом.

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

Например, как я в этот раз:

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

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

Аналогичный случай

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

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

Но на самом деле в основе лежитTCPПроцесс отправки сетевых пакетов,по своей сути асинхронный.

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

Как показано в красной рамке,Dubboназывал себяget()Метод используется для синхронного получения возвращаемого результата поставщика услуг.

Логика на самом деле довольно проста, похожа на мой план выше, но здесьisDone()Функция возвращает, было ли получено возвращаемое значение поставщика услуг.

Суммировать

На этот раз я резюмировал конкретные шаги для участия в open source, что на самом деле довольно просто; как сказал чиновник, даже поднятие вопроса или исправление опечатки считается участием, так что не думайте слишком много.

Наконец, также проводится краткий анализ процесса преобразования асинхронного в синхронный в процессе вызова Dubbo.Освоение этих операций также очень полезно для вашего ежедневного развития.

Ваши лайки и репост - лучшая поддержка для меня