Предыдущий пост в блоге построил фреймворк Eureka+лента+Hystrix. Хотя он может в основном соответствовать вызовам между сервисами, код выглядит действительно уродливым. Клиент должен писать Resttemplate каждый раз. Чтобы сделать звонки более красивыми и читаемыми, мы теперь учимся использовать Faign.
Feign включает в себя ленту и Hystrix, которая постепенно испытывает свое значение в фактическом бою. Так называемое включение-это не физическое включение пакетов банок Feign, включая пакеты ленточных и банок Hystrix, а логическое включение функций Фейна, включая функции двух других. Короче говоря: Feign может делать что -то в отношении ленты и Hystrix, но для использования аннотаций, представленных лентой и Hystrix, должен быть введен соответствующий пакет JAR.
Случай 1:
Регистрационный центр Eureka: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
Поставщик услуг: https://github.com/yejingtao/forblog/tree/master/demo-feign-freeservice
Абонент службы: https://github.com/yejingtao/forblog/tree/master/demo-feign-freeconsumer
Поставщик услуг - это простое веб -приложение Eurekaclient+, предоставляющее следующие методы
@RestController @Requestmapping ("/feign-service") открытый класс helloServiceContorller {private logger logger = loggerFactory.getLogger (this.getClass ()); private void Sleep (String Methodname) {int sleepMintime = new Random (). NextInt (3000); logger.info ("helloService"+methodname+"sleepmintime:"+sleepmintime); try {thread.sleep (sleepmintime); } catch (прерванное искусство e) {e.printstacktrace (); }} @Requestmapping (value = "/serviceGet", method = requestMethod.get) public String helloService (@RequestParam String name) {sleep ("get"); вернуть "helloServiceimpl name:"+name; } @RequestMapping (value = "/serviceHead", method = requestMethod.head) public String helloService (@Requestheader строка, @Requestheader String Password) {sleep ("Header"); вернуть "helloServicehead name:"+name+"пароль:"+пароль; } @RequestMapping (value = "/servicePost", method = requestMethod.post) public String HelloService (@Requestbody userDemo userDemo) {sleep ("post"); return userdemo.tostring (); }} Следующие аннотации, на которые необходимо обратить внимание, не могут быть опущены.
@RequestParam: аннотация, которая указывает на то, что параметр метода должен быть связан с параметром веб -запроса
@Requestbody: аннотация, указывающая на методпараметр должен быть связан с корпусом веб -запроса.
@Requestheader: аннотация, которая указывает на то, что параметр метода должен быть связан с заголовком веб -запроса.
Если вышеупомянутые аннотации отсутствуют, хотя служба не будет сообщать об ошибке после ее запуска, она не может получить параметры записи.
Проект Service Caller:
<depervice> <groupid> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-Feign </artifactid> </deperency>
Файн здесь только зависит, а не лента и Hystrix.
Application.yml:
server: port: 9051 spring: application: name: demo-feign-freeconsumer eureka: client: serviceUrl: defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/ feign: hystrix: enabled: true #Ribbon Timeout Setting#ribbon: # ConnectTimeout: 500 # ReadTimeout: 3000
Конфигурация Hystrix долго обманула меня. В Spring Cloud, которое я использовал, является Dalston Version SR1, которая является новой, чем версии других материалов в Интернете. Поскольку в новой версии поддержка Feign для Hystrix отключается по умолчанию, поэтому вам приходится вручную включить Feign.hystrix.enabled = true через конфигурацию, чтобы понижать услуги и другие функции будут эффективными.
Стартерная программа приложения
@Springbootapplication @enableeurekaclient @enablefeignclients открытый класс demofeignapplication {public static void main (string [] args) {SpringApplication.run (demofeignapplication.class, args); }} Обратите внимание, что здесь есть еще одна ловушка. Я использую @SpringbootApplication+ @enableteurekaclient вместо @springcloudapplication, потому что последний содержит @enablecircuitbreaker, а @enablecircuitbreaker - это содержимое в пакете Hystrix. Мой POM не вводит Hystrix. Таким образом, Spring Cloud все еще имеет недостатки в этом отношении. Вы не будете сообщать об ошибке, напрямую компилируя с @SpringCloudApplication, но ее нельзя начать. Конечно, главным героем здесь все еще является аннотацией @enablefeignclients.
Основной клиент -код
@Feignclient (name = "demo-feign-freeservice", bandback = demofeignfallback.class) открытый интерфейс demofeignservice {@requestmapping (value = "/feign-service/serviceget, method = requestmethod.get) string helloservice (@requestparam (" name ") String name); @Requestmapping (value = "/feign-service/serviceHead", method = requestMethod.head) String helloService (@Requestheader ("name") String name, @RequestHeader ("пароль") String Password); @Requestmapping (value = "/feign-service/servicePost", method = requestMethod.post) String helloService (@Requestbody userDemo userDemo); } Аннотация @feignClient определяет, что интерфейс является клиентом Fail, имя указывает имя службы, зарегистрированное на Eureka, а Sharkback является классом реализации интерфейса после того, как служба будет понижена.
@Requestmapping Указывает относительные методы URL и HTTP -запроса, который соответствует серверу один за другим. @RequestParam,
@Requestbody и @requestheader Annotations имеют больше атрибутов значения, чем серверы. Они не могут быть опущены здесь. Им нужно явно сообщить клиенту Failign, как соответствовать параметрам.
Погрузить код услуги понижения:
@Component public class demofeignfallback реализует demofeignservice {@override public String helloService (String name) {return "Get urer"; } @Override public String helloService (String name, String password) {return "urder error"; } @Override public String helloService (userDemo userDemo) {return "post error"; }} Я обнаружил, что намеренно удалял аннотации @RequestParam, @Requestbody и @requestheader в параметрах входа здесь, потому что существенное значение этих аннотаций заключается в том, что приводящий поводчик использует для передачи параметров в HTTP при выполнении микросервиса, но понижение услуг не будет выполнять запросы HTTP вообще, поэтому он может быть замыслен здесь.
Код контроллера:
@Restcontroller public class demofeigncontroller {@autowired private demofeignService demofeignService; @Requestmapping (value = "/test", method = requestMethod.get) public String demoServicetest () {StringBuffer sb = new StringBuffer (); SB.Append (demofeignService.HelloService ("yuanyuan")); sb.append ("/n"); SB.Append (demofeignService.HelloService ("yjt", "xixihaha")); sb.append ("/n"); SB.Append (demofeignService.HelloService (новый userDemo ("yejingtao", "123456"))); вернуть sb.toString (); }}Посмотрим на эффект:
Наш сервис не ушел, все три метода были нормальными, но запрос головы не получил возвращаемого значения. Это определяется характеристиками метода головы HTTP -запрос. Голова не возвращает тело тела ответа и обычно используется для тестирования подключения.
Давайте посмотрим на другой набор:
Методы запроса головы и почты были обработаны на более чем 2000 мс, а услуга понижается, и реализация заменяется классом обработки резервных перерывов.
В случае, если у нас всегда есть ощущение, что существует дублированный код между поставщиком услуг и абонентом по обслуживанию. Можно ли быть оптимизированным? См. Случай 2.
Случай 2:
Регистрационный центр Eureka: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
Интерфейс API: https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceapi
Поставщик услуг: https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceimpl
Абонент службы: https://github.com/yejingtao/forblog/tree/master/demo-feign-apicconsumer
Самым большим изменением в случае 2 является написание возможностей обслуживания отдельно в проект API, а вызывающий абонент и поставщик полагаются на этот API.
API:
публичный интерфейс helloService {@RequestMapping (value = "/feign-service/serviceget", method = requestMethod.get) string helloService (@RequestParam ("name") String name); @Requestmapping (value = "/feign-service/serviceHead", method = requestMethod.head) String helloService (@Requestheader ("name") String name, @RequestHeader ("пароль") String Password); @Requestmapping (value = "/feign-service/servicePost", method = requestMethod.post) String helloService (@Requestbody userDemo userDemo); } Поставщик услуг:
@Restcontroller public class helloservicecontorler реализует helloservice {private logger logger = loggerfactory.getlogger (this.getClass ()); private void Sleep (String Methodname) {int sleepMintime = new Random (). NextInt (3000); logger.info ("helloService"+methodname+"sleepmintime:"+sleepmintime); try {thread.sleep (sleepmintime); } catch (прерванное искусство e) {e.printstacktrace (); }} @Override public String helloService (@RequestParam ("name") String name) {sleep ("get"); вернуть "helloServiceimpl name:"+name; } @Override public String helloService (@RequestHeader ("name") String name, @RequestHeader ("пароль") String Password) {sleep ("Header"); вернуть "helloServicehead name:"+name+"пароль:"+пароль; } @Override public String helloService (@Requestbody userDemo userDemo) {sleep ("post"); return userdemo.tostring (); }} Служба вызывающего абонента:
@Feignclient (name = "demo-feign-serviceimpl", bandback = feignservicefallback.class) Общедоступный интерфейс FeignService Extens HelloService {}Другие коды остаются в основном неизменными, и эффект такой же.
Два стиля имеют свои собственные преимущества и недостатки: фристайл более бесплатный, а новый метод, добавленный на сервер, не повлияет на код клиента. Недостатком является то, что возможности обслуживания не синхронизированы, и изменения в возможностях обслуживания вызовут отклонений; Возможности обслуживания клиента Format Format Format синхронизируются, но изменения в интерфейсе требуют изменения кода с обеих сторон, и вы должны четко рассмотреть его при их построении.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.