Взял бустер Feign

Spring Boot Spring Cloud
Взял бустер Feign

предисловие

Недавно подготовлен к использованию основной бизнес-системы компании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Когда аналогично; поставщик услуг предоставитьClientpackage, потребитель может вызвать его напрямую, полагаясь на него. Другая балансировка нагрузки, отказоустойчивость и т.д.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 я…

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