предисловие
Недавно подготовлен к использованию основной бизнес-системы компанииJava
Реконструирую, пол года не писалJava
,JDK
Они были обновлены до 14. Учитывая стабильность и другие проблемы, в итоге был выбран именно он.JDK11
.
При выборе общей структуры, поскольку это совершенно новая система, нет исторической нагрузки, и в команде много больших коров, поэтому наши варианты выделены жирным шрифтом.
Конечным результатом является прямой шаттл, прямо к будущему тренду:Service Mesh
, поставить что прямоSpringCloud
,Dubbo
Такие распределенные рамки все убиты.
Тут дело не в обсужденииService Mesh
Что это такое, какие проблемы он может решить и почему я его выбрал, ведь я еще на стадии обучения, и я свяжусь с вами, когда пойму стабильность онлайна.
проблема
Теперь, когда направление задано, начинается фактическое взвешивание, но в начале проверяется, что «идеал очень пухлый, а реальность очень худая»;
Поскольку мы удалилиSpringCloud
иDubbo
В этом типе инфраструктуры регистрация, обнаружение, балансировка нагрузки и другие требования к службам сводятся к минимуму.Service Mesh
предоставлено в.
Но для разработки все еще есть надежда, что удаленные службы можно будет вызывать, вызывая локальные методы.SpringCloud
Такой фреймворк очень прост в реализации, а сам фреймворк имеет хорошую поддержку.
Вернемся к нашей сцене, требование на самом деле очень простое, просто нужно добитьсяSpringCloud
серединаFeign
Вызывается этот декларативный метод + аннотация.
@Autowired
private StoreClient client ;
Store store = client.update(1, store)
использоватьspring-cloud-openfeign
Этот пакет на самом деле может удовлетворить вышеуказанные требования, но он представит некоторые вещи, которые мы вообще не будем использовать.SpringCloud
связанные зависимости, из-за которых люди чувствуют себя «нечистыми»;Service Mesh
Наоборот, одна из главных целей — сделать такие фреймворки менее навязчивыми.
фактическиspring-cloud-openfeign
ядроFeign, сам он тоже доступен из коробки, так что попробуй посмотретьFeign
Поддерживаете ли вы такое использование.
Из официальной документации известно, что удаленный интерфейс может вызываться в виде определения интерфейса, но его можно использовать, не полагаясь на другие библиотеки по существу, поэтому он не имеет того жеSpring
Интеграция также разумна, но это также приводит к тому, что мы не можем использовать готовую библиотеку.
Естественно, мы не хотим писать код в красной рамке на рисунке выше и надеемся, что все интерфейсы можно будет использовать напрямую путем внедрения.
использовать
Таким образом, в сочетании с указанными выше требованиями, мы имеем эту библиотекуfeign-plus
Процесс его использования на самом деле является репликойspring-cloud-openfeign
:
@FeignPlusClient(name = "github", url = "${github.url}")
public interface Github {
@RequestLine("GET /repos/{owner}/{repo}/contributors")
List<GitHubRes> contributors(@Param("owner") String owner, @Param("repo") String repo);
}
существуетSpringBoot
Скан на входе:
@SpringBootApplication
@EnableFeignPlusClients(basePackages = "top.crossoverjie.feign.test")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
существуетSpring
Внедрить непосредственно в контекст, используя:
@Autowired
private Github github ;
List<GitHubRes> contributors = github.contributors("crossoverJie", "feign-plus");
logger.info("contributors={}", new Gson().toJson(contributors));
Поэтому, когда нам нужно вызывать некоторые внешние сторонние интерфейсы (такие как Alipay, внешний OpenAPI), мы можем определить такой интерфейс, чтобы блокировать детали всех HTTP-запросов.
Конечно, он также подходит для служебных звонков между компаниями, и мы писали ранееSpringCloud
илиDubbo
Когда аналогично; поставщик услуг предоставитьClient
package, потребитель может вызвать его напрямую, полагаясь на него. Другая балансировка нагрузки, отказоустойчивость и т.д.Service Mesh
Сделано для нас.
Для внутренних интерфейсов вы также можете добавить@RequestMapping("/path")
аннотация:
Он будет вставлен после URL-адреса при запросе/order
, поэтому в конфигурацииfeign.order.service.url
Когда нужно только заполнить доменное имя или IP поставщика услуг.
feign-plus
Он также поддерживает переключение определенных httpclients, по умолчаниюokhttp3
, который можно изменить с помощью следующей конфигурации.
# default(okhttp3)
feign.httpclient=http2Client
Конечно, есть и другие связанные конфигурации:
feign.plus.max-idle-connections = 520
feign.plus.connect-timeout = 11000
feign.plus.read-timeout = 12000
выполнить
Напоследок кратко расскажем о том, как это делается, по сути, этоspring-cloud-openfeign
сжатая версия.
Наиболее важным из которых являетсяtop.crossoverjie.feign.plus.factory.FeignPlusBeanFactory
своего рода.
Этот класс реализуетorg.springframework.beans.factory.FactoryBean
интерфейс и переписываетgetObject()
Метод возвращает объект.
Этот код кажется знакомым, это на самом деле
Feign
Официальныйdemo
.
Возвращаемый здесь объект на самом деле является прокси-объектом интерфейса, который мы определили, а сам объектFeign
, так что продолжайте в: нашhttp
Логика запроса кодирования и декодирования, инициирования запроса и т. д. также используется этимfeign
представляемый объект.
этоHardCodedTarget
являетсяFeign
Объект, используемый внутри для проксирования окончательного запроса.
Есть небольшой дискомфорт: такой самоопределяющийся бин и потом внедривший объект Idea не может его распознать, думая, что в текущем контексте бина нет, а вот spring-cloud-openfeign может его распознать.
так какFeign
Поддерживается несколько клиентов, поэтому клиенты здесь могут быть динамически указаны через файл конфигурации.
использоватьSpringBoot
который предоставил@ConditionalOnExpression
Аннотации могут динамически выбирать, что использовать на основе конфигурацииhttpclient
, то есть динамически выбирать, какие генерироватьBean
.
Суммировать
Логика этой библиотеки очень проста, по сути инкапсуляцияFeign
и обеспечиваетSpringBoot
Поддержка, друзья со схожими потребностями могут загрузить и использовать.
feign-plus
Исходный код:GitHub.com/crossover J я…
Ваши лайки и репост - лучшая поддержка для меня