Der vorherige Blog -Beitrag hat ein Eureka+Ribbon+Hystrix -Framework erstellt. Obwohl es im Grunde genommen Anrufe zwischen Diensten erfüllen kann, sieht der Code wirklich hässlich aus. Der Client muss jedes Mal eine RastTemplate schreiben. Um die Anrufe schöner und lesbarer zu machen, lernen wir nun, Täuschung zu verwenden.
Feign umfasst Ribbon und Hytrix, das im tatsächlichen Kampf allmählich seine Bedeutung erlebt. Die sogenannte Einbeziehung ist nicht die physische Einbeziehung der JAR-Pakete von TEInen, einschließlich der JAR-Pakete von Ribbon und Hystrix, sondern die logische Aufnahme der Funktionen von TEIGN, einschließlich der Funktionen der anderen beiden. Kurz gesagt: T veig kann Dinge über Ribbon und Hytrix tun, aber um die Anmerkungen zu verwenden, die von Ribbon und Hytrix mitgebracht wurden, muss das entsprechende JAR -Paket eingeführt werden.
Fall 1:
Eureka Registrierungszentrum: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
Serviceanbieter: https://github.com/yejingtao/forblog/tree/master/demo-feige-freeservice
Service Caller: https://github.com/yejingtao/forblog/tree/master/demo-feige-freeconsumer
Der Dienstanbieter ist eine einfache Eurekaclient+Webanwendung, die die folgenden Methoden bereitstellt
@RestController @RequestMapping ("/Feign-Service") öffentliche Klasse HelloServiceContorller {private logger logger = loggerfactory.getLogger (this.getClass ()); private void sleep (String methodName) {int sleepdiNintime = new random (). NextInt (3000); logger.info ("helloService"+methodName+"sleepdiNintime:"+sleepdiNintime); probieren {thread.sleep (sleepdiNintime); } catch (interruptedException e) {e.printstacktrace (); }} @RequestMapping (value = "/serviceGet", method = requestMethod.get) public String HelloService (@RequestParam -String -Name) {Sleep ("get"); zurück "HelloServiceImpl Name:"+Name; } @RequestMapping (value = "/servicehead", method = requestMethod.head) public String HelloService (@Requestheader String Name, @Requestheader -String -Passwort) {Sleep ("Header"); zurück "HelloServicewehe Name:"+Name+"Passwort:"+Passwort; } @RequestMapping (value = "/servicePost", method = requestMethod.post) public String HelloService (@RequestBody userDemo userDemo) {sleep ("post"); userDemo.toString () zurückgeben; }} Die folgenden Anmerkungen, auf die geachtet werden müssen, können nicht weggelassen werden.
@RequestParam: Annotation, die angibt
@RequestBody: Annotation, die angibt, dass ein Methodparameter an den Körper der Webanforderung gebunden sein sollte.
@RequestHeader: Annotation, die angibt, dass der Methodeparameter an einen Webanforderungs -Header gebunden sein sollte.
Wenn die obigen Anmerkungen fehlen, obwohl der Dienst nach dem Ausführen keinen Fehler meldet, kann er die Eintragsparameter nicht erhalten.
Service Caller Project:
<Depopenty> <gruppe> org.springFramework.cloud </Groupid> <artifactid> Spring-Cloud-Starter-Fig </artifactid> </abhängig>
Täuschung ist nur hier abhängig, nicht das Band und Hystrix.
application.yml:
Server: Port: 9051 Spring: Anwendung: Name: Demo-Feuch-Freeconsumer Eureka: Client: serviceurl: DefaultZone: http: // peer1: 1111/eureka/, http: // peer2: 1112/eureka/feign: 500 # # # # # # # # # # # # # # #ribbon # # # # # #RiboBbon
Die Konfiguration von Hystrix hat mich lange ausgetragen. Die von mir verwendete Spring -Cloud ist die Dalston -Version SR1, die neuer ist als die Versionen anderer Materialien im Internet. Denn in der neuen Version wird die Unterstützung von FEIGN für Hytrix standardmäßig ausgeschaltet, sodass Sie durch die Konfiguration manuell einschalten müssen.
Anwendungsstarterprogramm
@SpringbootApplication @EnableEureKaclient @enableFeignclients Public Class DemoFeignApplication {public static void main (String [] args) {SpringApplication.run (DemofEignApplication.Class, Args); }} Beachten Sie, dass es hier einen weiteren Fall gibt. Ich verwende @SpringBootApplication+ @enableEureKaclient anstelle von @springCloudApplication, da letztere @EnableCircuitbreaker enthält, und @enableCircuitbreaker ist der Inhalt im HYTRIX -Paket. Mein Pom führt nicht Hytrix vor. So hat Spring Cloud in dieser Hinsicht noch Mängel. Sie werden keinen Fehler melden, indem Sie direkt mit @SpringCloudApplication kompilieren, aber er kann nicht gestartet werden. Natürlich ist der Protagonist hier immer noch die Annotation @EnableFeignclients.
Kernclientcode
@FeignClient (name = "Demo-FEIGN-Freeservice", Fallback = DemoFignfallback.class) Public Interface DemoFignservice {@RequestMapping (Value = "/Feign-service/service/service, method = requestMethod.get) String HelloService (@Requestparam (" name "); @RequestMapping (value = "/feign-service/servicehead", method = requestMethod.head) String helloService (@Requestheader ("Name") String-Name, @Requestheader ("Passwort") String-Passwort); @RequestMapping (value = "/feign-service/servicePost", method = requestMethod.post) String HelloService (@RequestBody userDemo userDemo); } Die @FeignClient -Annotation definiert, dass die Schnittstelle ein vorgetäuschter Client ist, der Name den in Eureka registrierten Dienstnamen angibt, und Fallback ist die Schnittstellenimplementierungsklasse, nachdem der Dienst heruntergestuft wurde.
@RequestMapping gibt die relativen URL- und HTTP -Anforderungsmethoden der Anforderung an, die dem Server einzeln entspricht. @Requestparam,
@RequestBody und @Requestheader -Anmerkungen haben mehr Wertattribute als Server. Sie können hier nicht weggelassen werden. Sie müssen den vorgetäuschenden Kunden explizit darüber informieren, wie er den Parametern entspricht.
Downgrade Service Code:
@Component Public Class DemoFeignFallback implementiert DemoFeignService {@Override public String HelloService (String -Name) {return "return" error "; } @Override public String HelloService (String -Name, String -Passwort) {return "Kopf -Fehler"; } @Override public String helloService (userDemo userDemo) {return "post error"; }} Ich stellte fest, dass ich hier die @RequestParam-, @RequestBody- und @Requestheader -Anmerkungen in den Eintragsparametern entfernt habe, da die wesentliche Bedeutung dieser Anmerkungen darin besteht, dass Vesign bei der Durchführung von Microservice -Anrufen mit HTTP -Anforderungen an HTTP -Anfragen weitergegeben wird.
Controller -Code:
@RestController Public Class DemoFignController {@autowired Private DemoFeNService DemoFEnservice; @RequestMapping (value = "/test", method = requestMethod.get) public String DemoServicetest () {StringBuffer sb = new StringBuffer (); SB.Append (DemoFeNService.helloService ("Yuanyuan")); sb.Append ("/n"); SB.Append (DemoFeNService.helloService ("yjt", "xixihaha")); sb.Append ("/n"); SB.Append (DemoFEnservice.helloService (neuer BenutzerDemo ("yejingtao", "123456")); return sb.tostring (); }}Lassen Sie uns den Effekt sehen:
Unser Service hat sich nicht angemeldet, alle drei Methoden waren normal, aber die Kopfanfrage erhielt den Rückgabewert nicht. Dies wird durch die Eigenschaften der HTTP -Anforderung der Kopfmethode bestimmt. Der Kopf gibt den Körperkörper der Reaktion nicht zurück und wird im Allgemeinen für Konnektivitätstests verwendet.
Schauen wir uns einen anderen Satz an:
Die Kopf- und Postanforderungsmethoden wurden für mehr als 2000 ms verarbeitet und der Dienst wird herabgestuft, und die Implementierung wird durch die Fallback -Verarbeitungsklasse ersetzt.
Falls eins, wir haben immer das Gefühl, dass zwischen dem Dienstanbieter und dem Dienstanrufer doppelter Code besteht. Kann es optimiert werden? Bitte siehe Fall 2.
Fall 2:
Eureka Registrierungszentrum: https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
Schnittstellen-API: https://github.com/yejingtao/forblog/tree/master/demo-feige-serviceapi
Serviceanbieter: https://github.com/yejingtao/forblog/tree/master/demo-feige-serviceImpl
Service Caller: https://github.com/yejingtao/forblog/tree/master/demo-feige-apicconsumer
Die größte Veränderung in Fall 2 besteht darin, Servicefunktionen getrennt in ein API -Projekt zu schreiben, und sowohl der Anrufer als auch der Anbieter Pom verlassen sich auf diese API.
API:
public interface 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 ("Passwort") String-Passwort); @RequestMapping (value = "/feign-service/servicePost", method = requestMethod.post) String HelloService (@RequestBody userDemo userDemo); } Dienstleister:
@RestController Public Class HelloServiceContorler implementiert HelloService {private logger logger = loggerfactory.getLogger (this.getClass ()); private void sleep (String methodName) {int sleepdiNintime = new random (). NextInt (3000); logger.info ("helloService"+methodName+"sleepdiNintime:"+sleepdiNintime); probieren {thread.sleep (sleepdiNintime); } catch (interruptedException e) {e.printstacktrace (); }} @Override public String HelloService (@RequestParam ("Name") String -Name) {schlaf ("get"); zurück "HelloServiceImpl Name:"+Name; } @Override public String HelloService (@Requestheader ("Name") String -Name, @Requestheader ("Passwort") String Passwort {Sleep ("Header"); zurück "HelloServicewehe Name:"+Name+"Passwort:"+Passwort; } @Override public String HelloService (@RequestBody userDemo userDemo) {schlaf ("post"); userDemo.toString () zurückgeben; }} Serviceanrufer:
@FeignClient (name = "Demo-FIGD-ServiceImpl", Fallback = FeignServiceFackback.class) Öffentliche Schnittstelle FeignService erweitert HelloService {}Andere Codes bleiben grundsätzlich unverändert und der Effekt ist der gleiche.
Die beiden Stile haben ihre eigenen Vor- und Nachteile: Freestyle ist freier und die neue Methode, die dem Server hinzugefügt wurde, hat keinen Einfluss auf den Client -Code. Der Nachteil ist, dass Servicemöglichkeiten nicht synchronisiert sind und Änderungen der Servicefunktionen zu Abnormalitäten führen. Die API -Format -Server -Client -Service -Funktionen werden synchronisiert, die Änderungen in der Schnittstelle erfordern jedoch eine Änderung des Code auf beiden Seiten, und Sie müssen sie beim Erstellen klar berücksichtigen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.