Vorwort
Wenn wir die @DiscoveryClient -Annotation verwenden, haben wir die folgende Frage: Warum führt sie den Betrieb der Registrierung eines Dienstes durch? Sollte es nicht als Service Discovery verwendet werden? Erforschen wir den Quellcode ausführlich.
1. Die Lebenszyklus -Schnittstelle von SpringFramework
Um dieses Problem zu verstehen, müssen wir diese wichtige Schnittstelle verstehen:
/ * * Copyright 2002-2015 Der ursprüngliche Autor oder die Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachberechtigungen und * Einschränkungen im Rahmen der Lizenz. */Paket org.springframework.context;/*** Eine gemeinsame Schnittstelle definiert Methoden für Start/Stop -Lifecycle -Steuerung. * Der typische Anwendungsfall dafür besteht darin, die asynchrone Verarbeitung zu kontrollieren. * <B> Hinweis: Diese Schnittstelle bedeutet keine spezifische Auto-Startup-Semantik. * Erwägen Sie, {@link smartlifecycle} für diesen Zweck zu implementieren. </B> * * <p> kann von beiden Komponenten (typischerweise eine in einem * Federkontext definierte Federbean definiert) und Container (typischerweise eine Feder {@link ApplicationContext} * selbst) implementiert werden. Container geben Start-/Stoppsignale an alle Komponenten aus, die * in jedem Container angewendet werden, z. B. für ein Stopp/Neustart -Szenario zur Laufzeit. * * <p> kann für direkte Aufrufe oder für Verwaltungsoperationen über JMX verwendet werden. * Im letzteren Fall wird der {@link org.springFramework.jmx.export.mbeanexporter} * typischerweise mit einem * {@link org.springframework.jmx.export.Stembler.InterfaceBasedMBeanInfoBoBoBoBoBoBoMbloble}, * -Ronktivität der Sichtbarkeit der Aktivitätskontrolled-Komponents the Librycly, *, typischerweise definiert. * * <p> Beachten Sie, dass die Lebenszyklus-Schnittstelle nur auf <B> Singleton auf der obersten Ebene unterstützt wird. Bei jeder anderen Komponente bleibt die Lebenszyklusschnittstelle unentdeckt * und somit ignoriert. Beachten Sie außerdem, dass die erweiterte {@link smartlifecycle} -Schinschnittstelle * die Integration in die Start- und Herunterfahren des Anwendungskontexts bietet. * * @Author Juergen Hoeller * @Since 2.0 * @see SmartLifecycle * @see configurableApplicationContext * @see org.springFramework.jms.Listener.abstractMessagelistenercontainer * @see org.SpringFraMe.Scheduling. /*** Starten Sie diese Komponente. * <p> sollte keine Ausnahme auswerfen, wenn die Komponente bereits ausgeführt wird. * <p> Im Fall eines Containers wird das Startsignal an alle angewendeten Komponenten ausgegeben. * @see smartlifecycle#isautostartup () */ void start (); /** * Stoppen Sie diese Komponente typischerweise synchron, so dass die Komponente bei der Rückkehr dieser Methode vollständig gestoppt wird. Erwägen Sie, {@link smartlifecycle} * und seine {@code stop (runnable)} Variante zu implementieren, wenn asynchrones Stoppverhalten erforderlich ist. * <P> Beachten Sie, dass diese Stoppbenachrichtigung nicht garantiert vor der Zerstörung kommt: Bei * Regelmäßiger Abschalten erhält {@code -Lebenszyklus} Beans zuerst eine Stoppbenachrichtigung, bevor * die allgemeinen Zerstörungsaufrufe verbreitet werden; Bei heißer Aktualisierung während des Lebens eines Kontextes oder bei abgebrochenen Aktualisierungsversuchen werden jedoch nur Zerstörungsmethoden aufgerufen. * <p> sollte keine Ausnahme auswerfen, wenn die Komponente noch nicht gestartet wird. * <p> Bei einem Container wird das Stoppsignal an alle angewendeten Komponenten ausgegeben. * @see smartlifecycle#stop (runnable) * @see org.springframework.bean.factory.DisposableBean#destroy () */ void stop (); /*** Überprüfen Sie, ob diese Komponente derzeit ausgeführt wird. * <p> Im Fall eines Containers wird dies nur dann zurückgegeben, wenn <i> alle </i> * -Komponenten, die anwenden, derzeit ausgeführt werden. * @return, ob die Komponente derzeit ausgeführt wird */ boolean isrunning ();}Diese Schnittstelle definiert die Start-/Stop -Lifecycle -Kontrollmethode. Wenn der Feder -IOC -Behälter startet oder gestoppt, wird ein Start- oder Stoppsignal an jede Komponente gesendet, sodass wir in der entsprechenden Methode das tun können, was wir wollen. Wir können durch das Klassendiagramm finden, dass wir üblicherweise ClassPathXMLApplicationContext -Klasse verwenden, um diese Schnittstelle zu implementieren
Lassen Sie uns den Fall kurz demonstrieren und die Klasse Mylifecycle erstellen:
Paket org.hzgj.spring.study.context; import org.springframework.context.smartLifecycle; öffentliche Klasse MyLifecycle implementiert SmartLifeCycle {@Override public void start () {System.println ("myLifecycl start ..."); } @Override public void stop () {System.out.println ("Mylifecycle Stop ....."); } @Override public boolean isrunning () {return false; } @Override public boolean isautostartup () {return true; } @Override public void stop (runnable callback) {} @Override public int getphase () {System.out.println ("Phase"); Rückkehr 10; }}Hier erben wir Smartlifecycle. Die Schnittstelle erbt Lebenszyklus. Die Isrunning -Methode wird verwendet, um festzustellen, ob sich die aktuelle Komponente im laufenden Zustand befindet. Beachten Sie, dass es nur ausgeführt werden kann, wenn der Rückgabewert Isrunning falsch ist.
Wir konfigurieren MylifeCycle in der Feder -Konfigurationsdatei und rennen über classPathxMlApplicationContext, um die folgenden Ergebnisse zu erhalten:
Darüber hinaus besteht die GetPhase -Methode hier darin, den Stufwert zu definieren (es kann als Priorität verstanden werden. Je kleiner der Wert ist, desto mehr wird der entsprechende Lebenszyklus zuerst ausgeführt).
2. Forschung für DiscoveryClient -Quellcode
@Enablediscoveyclient
/ * * Copyright 2013-2015 Der ursprüngliche Autor oder Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachregierungsberechtigungen und * Einschränkungen im Rahmen der Lizenz. */Paket org.springframework.cloud.client.discovery; import Java.lang.annotation java.lang.annotation.target; import org.springframework.context.annotation.import;/*** Annotation, um eine DiscoveryClient -Implementierung zu ermöglichen. * @Author Spencer Gibb * /@target (elementtype.type) @retention (retentionPolicy.runtime)@documented@erbte@import (enablediscoveryClientImportSelector.class) public @Interface EnablediscoveryClient { /** * Wenn wahr, registriert das Serviceregistry den lokalen Server automatisch den lokalen Server automatisch registriert. */ boolean autoregister () Standard true;} Bitte beachten Sie, dass @Import(EnableDiscoveryClientImportSelector.class) wir auf diese Klasse verweisen können:
/ * * Copyright 2013-2015 Der ursprüngliche Autor oder Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachberechtigungen und * Einschränkungen im Rahmen der Lizenz. */Paket org.springframework.cloud.client.discovery; import org.springframework.boot.bind.RelaxedPropertyresolver; Import org.springframework.cloud.Commons.util.SpringFactoryImportsselector; org.springFramework.core.annotation.annotationAttributes; import org.springFramework.core.Annotation.Order; import org.springframework.core.env.ConefigableNenvironment; importieren org.springFramework.core.env.environment; org.springframework.core.env.MapPropertySource;import org.springframework.core.type.AnnotationMetadata;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedHashMap;import java.util.List;/** * @author Spencer Gibb */ @Order (ordered.lowest_precedence - 100) öffentliche Klasse EnabledisCoveryClientImportSelector erweitert SpringFactoryImportSelector <enablediscoveryClient> {@Override public String [] SelectImports (AnnotationMetadata metadata) {] imports = Super. Selectimports (metadadata); AnnotationAttributes Attribute = AnnotationAttributes.Frommap (metadata.getAnnotationAttributes (getAnnotationClass (). GetName (), true)); boolean autoregister = attribute.getboolean ("autoregister"); if (autoregister) {list <string> importslist = new ArrayList <> (arrays.aslist (imports)); ImportsList.add ("org.springframework.cloud.client.serviceregistry.AutoServiceregistrationConfiguration"); Imports = ImportSlist.toArray (neue String [0]); } else {Environment env = Getenvironment (); if (configurableDevironment.class.issinstance (env)) {configurableDeVironment configenV = (configurableDeVironment) env; LinkedHashMap <String, Objekt> map = new linkedHasMap <> (); map.put ("spring.cloud.service-registry.auto-Registration.enabled", false); MapPropertySource PropertySource = new mapPropertySource ("SpringCloudDiscoveryClient", Karte); configenv.getPropertySources (). Addlast (PropertySource); }} return Importe; } @Override protected boolean isenabled () {neu entspanntePropertyresolver zurückgeben (Getenvironment ()). } @Override protected boolean hasDefaultFactory () {return true; }} Die Methode zur Umschreibung dieser Klasse stammt aus der Schnittstellenimportselector. Wir können die Klasse gemäß dem Code unter if(autoRegister) verfolgen: org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration . Schauen wir uns das Strukturdiagramm an:
Wir können wissen, dass diese Klasse die Lebenszyklusschnittstelle implementiert. Schauen wir uns also die Startmethode an, die sich in ihrer Elternklasse abstractDiscoverylifecycle befindet:
/ * * Copyright 2013-2015 Der ursprüngliche Autor oder Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachberechtigungen und * Einschränkungen im Rahmen der Lizenz. */Paket org.springframework.cloud.client.discovery; import Java.util.concurrent.atomic.atomicboolean; Import Java.util.Concurrent org.apache.commons.logging.logfactory; import org.springframework.beans.beansexception; import org.springframework.boot.context.embedded.embeddeddedServletContaininitializedEvent; org.springframework.cloud.client.serviceregistry.serviceregistry; import org.springframework.context.applicationContext; import org.springFramework.context.ApplicationContextaware; Importe org.springFramework.ApplicationSext.ApplicationListenerListenerListenerListenerListener -Veristener -Veristener -Veristener -Veristener -Veröffentlichungsergebläser. org.springframework.core.env.Environment;/*** Lebenszyklusmethoden, die für verschiedene DiscoveryClient -Implementierungen nützlich und gemeinsam sein können. * * @deprecated use {@link org.springframework.cloud.client.serviceregistry.abstractAutoServiceregistration} Stattdessen. Diese Klasse wird im nächsten Release -Zug entfernt. * * @Author Spencer Gibb */ @deprimierte publische Abstract -Klasse AbstractDiscoveryLifeCycle implementiert DiscoveryLifecycle, applicationContextaware, applicationListener <eingebettetesservletContaineritializedEvent> {private statische endgültige Logger = logfactorory. private boolean autostartup = true; Private Atomicboolean Running = New Atomicboolean (Falsch); private int order = 0; private applicationContext -Kontext; privates Umfeld; privater Atomicinder -Port = neuer Atomicinteger (0); Protected ApplicationContext getContext () {return context; } @Override public void setApplicationContext (ApplicationContext applicationContext) löst beansexception {this.context = ApplicationContext; this.environment = this.context.getenvironment (); } @Deprecated Protected Environment Getenvironment () {Rückkehrumgebung; } @Deprecated Protected AtomicInteger getPort () {return port; } @Override public boolean isautostartup () {return this.autostartup; } @Override public void stop (runnable callback) {try {stop (); } catch (Ausnahme E) {logger.Error ("Es ist ein Problem, das versucht hat, den Entdeckungslebenszyklus zu stoppen", e); } callback.run (); } @Override public void start () {if (! Isenabled ()) {if (logger.isdebugenabled ()) {logger.debug ("Discovery Lifecycle deaktiviert. Nicht starten"); } zurückkehren; } // Setzen Sie den Port nur, wenn der NonsecurePort 0 und dies.Port! = 0 if (this.port.get ()! } // Initialisieren Sie nur, ob NonseSecurePort größer als 0 ist, und es wird nicht bereits ausgeführt // aufgrund von ContainerPortInitializer unten if (! this.Running.get () && getConfiguredport ()> 0) {register (); if (sollte RegisterManagement ()) {RegisterManagement (); } this.context.publishEvent (neue InstanceregisteredEvent <> (this, getConfiguration ())); this.running.comPareandset (falsch, wahr); }} @Deprecated Protected Abstract Int getConfiguredPort (); @Deprecated Protected Abstract void setConfiguredport (int Port); / ** * @return Wenn der Verwaltungsdienst bei der {@link serviceregistry} */ geschriebener Boolean silgerManagement () {return GetManagementPort ()! } / ** * @return Das Objekt, mit dem die Registrierung konfiguriert wurde * / @Deprecated Protected abstraktes Objekt getConfiguration (); / ** * Registrieren Sie den lokalen Dienst mit dem DiscoveryClient */ Protected Abstract Void Register (); / ** * Registrieren Sie den lokalen Verwaltungsdienst mit dem DiscoveryClient */ Protected void RegisterManagement () {}/ ** * Registrieren Sie den lokalen Dienst mit dem DiscoveryClient */ Protected Abstract void Deregister (); / ** * Registrieren Sie den lokalen Verwaltungsdienst mit dem DiscoveryClient */ Protected void DeregisterManagement () {}/ ** * @return true, wenn der {@link DiscoveryLifecycle} aktiviert ist */ geschützte abstrakte boolean isenabled (); / ** * @return the ServiceID des Verwaltungsdienstes */ @deprecated Protected String getManagementServiceid () {// Todo: Konfigurierbares Management -Suffix return this.context.getId () + ": Management"; } / ** * @return Der Dienstname des Verwaltungsdienstes * / @Deprecated Protected String getManagementServiceName () {// Todo: Konfigurierbares Management -Suffix return getAppname () + ": Management"; } / ** * @return den Management Server -Port * / @deprecated Protected Integer getManagementPort () {return ManagementServerPortils.getport (this.context); } / ** * @return den App -Namen, derzeit die Eigenschaft spring.application.name * / @Deprecated Protected String getAppname () {return This } @Override public void stop () {if (this.running.comPareAnDSet (true, false) && isenabled ()) {Deregister (); if (sollte RegisterManagement ()) {DeregisterManagement (); }}} @Predestroy public void destroy () {stop (); } @Override public boolean isrunning () {return this.running.get (); } Protected AtomicBoolean getRunning () {Return Running; } @Override public int getorder () {return this.order; } @Override public int getPhase () {return 0; } @Override @deprecated public void OnapplicationEvent (EmbeddedServletContainInitializedEvent Ereignis) {// todo: Nehmen Sie SSL an // Registrieren Sie den Management -Port nicht als Port, wenn (! "Management" .Equals (Event.GetApplicationContext (). Event.GetembeddedServletContainer (). getPort ()); this.start (); }}}Beachten Sie, dass in der Startmethode ein Stück dieses Codes enthält:
if (! this.running.get () && getConfiguredport ()> 0) {register (); if (sollte RegisterManagement ()) {RegisterManagement (); } this.context.publishEvent (neue InstanceregisteredEvent <> (this, getConfiguration ())); this.running.comPareandset (falsch, wahr); } Bitte beachten Sie register() -Methode eine abstrakte Methode in dieser Klasse ist. Schauen wir uns also auf den Code in der AbstractAutoServiceRegistration -Kurs zurück, und ich werde hier nur die wichtigsten Teile veröffentlichen:
// ..... geschützte AbstractAutoServiceregistration (Serviceregistry <R> Serviceregistry, AutoServiceregistrationProperties Eigenschaften) {this.serviceregistry = serviceregistry; this.Properties = Eigenschaften; } //....../** * Registrieren Sie den lokalen Dienst mit der {@link serviceregistry} */@Override Protected void Register () {this.serviceregistry.register (getRegistration ()); }Wir können feststellen, dass ein Serviceregistry -Typ im Konstruktor übergeben wird, einer Schnittstelle, die SpringCloud für die Registrierung von Service bietet. Hier implementiert die Eurekaserviceregistry diese Schnittstelle:
/ * * Copyright 2013-2016 Der ursprüngliche Autor oder Autoren. * * Lizenziert unter der Apache -Lizenz, Version 2.0 (die "Lizenz"); * Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. * Sie können eine Kopie der Lizenz unter * * http://www.apache.org/licenses/license-2.0 * * * *, sofern nach geltendem Recht oder schriftlich gefordert oder schriftlich gefordert wird, Software *, die im Rahmen der Lizenz verteilt ist, auf "As "basis * ohne Gewährleistungen oder Bedingungen jeglicher Art verteilt oder implementiert. * Siehe die Lizenz für die spezifischen Sprachberechtigungen und * Einschränkungen im Rahmen der Lizenz. * */Paket org.springframework.cloud.netflix.eureka.serviceregistry; Import Java.util.hashMap; import org.apache.commons.logging.log; com.netflix.appinfo.instanceInfo;/** * @author spencer gibb */public class eurekaserviceregistry implements serviceregistry @Override public void Register (Eurekaregistration Reg) {vielleichtinitializeclient (Reg); if (log.issinfoenabled ()) {log.info ("Anwendung registrieren" + reg.getInstanceConfig (). getAppname () + "mit Eureka mit Status" + reg.getInstanceConfig (). getInitialStatus ()); } reg.getapplicationInfomanager () .setInstancestatus (Reg.getInstanceConfig (). getInitialStatus ()); if (reg.gethealthCheckhandler ()! }} private void martinInitializeclient (Eurekaregistration Reg) {// Initialisierung möglicher Scoped -Proxies Reg.getapplicationInfomanager (). GetInfo (); reg.geteureKaclient (). getApplications (); } @Override public void Deregister (Eurekaregistration Reg) {if (reg.getApplicationInfomanager (). GetInfo ()! } reg.getApplicationInfomanager (). setInstancestatus (InstanceInfo.inStancestatus.down); // Die Abschaltung des Eureka -Clients sollte mit eurekaregistration auftreten. // TODO: Wie um richtig mit Löschen umzugehen? if ("cancel_override" .EqualSignoreCase (Status)) {Registrierung.GeteureKaclient (). CancelOverridestatus (Info); zurückkehren; } // todo: How to umzugehen mit Statusstypen über Erkennungssysteme hinweg? InstanceInfo.inStancestatus newstatus = InstanceInfo.inStancestatus.toenum (Status); Registrierung.GeteureKaclient (). setStatus (NewStatus, Info); } @Override öffentliches Objekt getStatus (Eurekaregistration Registrierung) {HashMap <String, Object> status = new HashMap <> (); InstanceInfo info = Registrierung.GetApplicationInfomanager (). GetInfo (); status.put ("status", info.getStatus (). toString ()); status.put ("overdiDdenStatus", info.getOverriddenStatus (). toString ()); Rückgabestatus; } public void close () {}}So können wir die folgenden Punkte zusammenfassen:
1. Verwenden von @DiscoveryClient zur Registrierung der Dienst verwendet den Lebenszyklusmechanismus, und register() -Methode der Serviceregistry wird ausgeführt, wenn der Container gestartet wird.
2. Die Verwendung von @DiscoveryClient ist flexibler als @enableeureKaClient und @EnableEureKaserver, da es die Implementierung der Serviceregistrierung blockiert und wir sogar das Registrierungszentrum anpassen können.
3. Dies sucht auch automatisch nach der Implementierung der DiscoveryClient -Schnittstelle für die Serviceerkennung.
3.. DiscoveryClient Practical Redis Registration Center
Im Folgenden implementieren wir eine auf Redis als Registrierungszentrum basierende Anforderung, um DiscoveryClient zu verstehen. Lassen Sie uns übrigens die wichtigen Schnittstellen von SpringCloud verstehen: Serviceregistry, ServiceInstance. Vorher werden wir Unterstützung für Redis hinzufügen:
Compile Group: 'org.springframework.boot', Name: 'Spring-Boot-Starter-Data-Redis' '
1. Implementieren Sie die Registrierungsschnittstelle
Paket com.hzgj.ryrk.member; import org.springframework.bean.factory.Annotation java.net.uri; import java.util.enumeration; import Java.util.map; @ComponentPublic -Klasse Redisregistration implementiert die Registrierung {@Value ("$ {server.port}") Private Ganzzahlport; @Value ("$ {spring.application.name}") private String applicationName; privater String -Host; public void Sethost (String Host) {this.host = host; } public void setport (Ganzzahlport) {this.port = port; } public void setApplicationName (String applicationName) {this.applicationName = ApplicationName; } @Override public String getServicId () {return applicationName + ":" + Gethost () + ":" + getPort (); } @Override public String gethost () {try {if (host == null) return getLocalHostlanAddress (). Gethostaddress (); sonst return host; } catch (Ausnahme e) {e.printstacktrace (); } return null; } @Override public int getPort () {return port; } @Override public boolean issecure () {return false; } @Override public uri getUri () {return null; } @Override public map <String, String> getMetAdata () {return null; } public String getServiceName () {return this.applicationName; } public inetAddress getLocalHostlanAddress () löst Ausnahme aus {try {inetaddress candidateaddress = null; // Alle Netzwerkschnittstellen für (Enumeration ifaces = networkInterface.getNetworkInterfaces (); ifaces.hasmoreElements ();) {networkinterface iface = (networkInterface) ifaces.nextElement () durchqueren. // Durchqueren Sie den IP unter allen Schnittstellen für (Aufzählung inetaddrs = iface.getInetaddresses (); inetadDrs.hasmoreElements ();) {inetaddress inetaddr = (inetadDress) inetaddrs.NextElement (); if (! inetaddr.isloopbackaddress ()) {// Loopback-Typadresse ausschließen if (inetaddr.issiTelocalAddress ()) {// Wenn es sich um eine ortslokale Adresse handelt, wird es inetaddr zurückgegeben; } else if (candidateAddress == null) {// Die Adresse des Site-Lokal-Typs wurde nicht gefunden. Erfassen Sie zuerst die Kandidatenadresse Candidateaddress = inetaddr; }}}}} if (candidateaddress! = null) {return candidateaddress; } // Wenn keine Nicht-Loopback-Adresse gefunden wird, können Sie nur die am meisten ausgewählte Lösung verwenden. Inetaddress jdksuppliedaddress = inetaddress.getLocalHost (); return jdksuppliedAddress; } catch (Ausnahme e) {e.printstacktrace (); } return null; }}Diese Schnittstelle erbt Serviceinformanz, sodass die Hauptfunktion dieser Schnittstelle darin besteht, die Spezifikationen einer Serviceinstanz zu definieren, z.
2. Implementieren Sie die Schnittstelle der Serviceregistry
Paket com.hzgj.ryrk.Member; import org.springframework.bean.factory.Annotation.autowired; Serviceregistry <Disregistration> {@autowired private stringRedistemplate redistemplate; @Override public void Register (RedisRegistration Registrierung) {String serviceId = Registration.getServiceid (); redistemplate.opsforlist (). links (serviceId, Registrierung.Gethost () + ":" + Registration.getPort ()); } @Override public void Deregister (Redisregistrierung Registrierung) {redistemplate.opsforlist (). REMET (Registrierung.GetServicId (), 1, Registrierung.Gethost () + ":" + Registration.Getport ()); } @Override public void close () {//redistemplate.d system.out.println ("geschlossen ..."); } @Override public void setStatus (Redisregistrierungsregistrierung, String -Status) {} @Override public <T> t getStatus (Redisregistration Registrierung) {return null; }}Die Hauptfunktion dieser Schnittstelle besteht darin, zu definieren, wie registriert, der Dienst, den Service -Status usw. registriert, storniert, festgelegt und abgeholt werden soll.
3.. Inherit AbstractAutoServiceregistration abstrakte Klasse
Paket com.hzgj.ryrk.member; import org.springframework.beans.factory.Annotation.autowired; org.springframework.cloud.client.serviceregistry.serviceregistry; öffentliche Klasse RedisautoServiceregistration erweitert die AbstractAutoServiceRegistration <Recisregistration> {@autowired private Redisregistrierung zur Redisregistrierung; geschützte RedisautoServiceregistration (Serviceregistry <Disregistration> Serviceregistry, AutoServiceregistrationsproperties Eigenschaften) {Super (Serviceregistry, Eigenschaften); // serviceregistry.register (getRegistration ()); } @Override protected int getConfiguredport () {return reduregistration.getPort (); } @Override Protected void setConfiguredport (int port) {} @Override Protected Object getConfiguration () {return null; } @Override protected boolean isenabled () {return true; } @Override Protected RedisRegistration getRegistration () {return Redisregistration; } @Override Protected RedisRegistration getManagementRegistration () {return null; }}4. Definieren Sie die Implementierungsklasse von DiscoveryClient RedisdiscoveryClient
Paket com.hzgj.ryrk.member; import org.apache.commons.lang.Stringutils; import org.springframework.bean.factory.Annotation.autowired; org.springframework.data.redis.core.StringRedistemplate; Import Java.util.ArrayList; Import Java.util.List; import Java.util.function.Function; @Override public String Beschreibung () {return "Service Discovery in Redis Registration Center"; } @Override öffentlicher Dienst und GetLocalServiceInstance () {return null; } @Override öffentliche Liste <ServiceInstance> GetInstances (String ServiceID) {redistemplate.opsforlist (). Bereich (serviceId, 0, -1). parallelsstream (). map ((Funktion <String, serviceInstance>) RedisRegistration.SetPor (Integer.ParseInt (Port)); } @Override publiclist <string> getServices () {list <string> list = new ArrayList <> (); list.addall (redistemplate.keys ("*")); Rückgabeliste; }}Diese Klasse richtet sich hauptsächlich auf die Service Discovery of Redis Registration Center
5. Definieren Sie automatische Montageklassen, um entsprechende Bohnen zu erstellen
Paket com.hzgj.ryrk.member; import org.springframework.boot.autoconFigure.Condition.ConditionalonProperty; Import org.springFramework.boot.Context.Properties.enableConfigurationProperties; Importee; org.springframework.cloud.client.serviceregistry.autoServiceregistrationProperties; import org.springframework.context.annotation.bean; org.springFramework.context.annotation.primary;@configuration@EnableConfigurationProperties (redisconfig.class) @ConditionalonProperty (value = "Spring.redis.registry.enabled", matchifming = truen) öffentliche Klasse RedisregistryAutoconfigistry {@@Bean -rediservistry {@@Bean -rediservistry {@@Bean -rediservistry {@@Beanybean -redisconistry {@| redisconfig) {System.out.println (redisconfig.gethost ()); Return New Rediserviceregistry (); } @Bean RedisautoServiceregistration RedisautoServiceregistration (Rediserviceregistry REISServiceregistry) {Neue RedisautoServiceregistration (Rediserviceregistry, neue autoServiceregistration -Registrierungsprüche (); } @Bean @Primary RedisDiscoveryClient RedisDiscoveryClient () {return New RedisDiscoveryClient (); }}6. Definieren Sie die Start -up -Klasse
Paket com.hzgj.ryrk.member; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootApplication; org.springframework.cloud.client.discovery.enablediscoveryclient; import org.springframework.cloud.client.discovery.comPosite.comPositediscoveryclientAutoconfiguration; org.springframework.context.ConfigurableApplicationContext;@EnableDiscoveryClient@SpringBootApplication(exclude = {SimpleDiscoveryClientAutoConfiguration.class, CompositeDiscoveryClientAutoConfiguration.class})public class MemberApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = springApplication.run (memberApplication.class, args); DiscoveryClient DiscoveryClient = ApplicationContext.getbean (DiscoveryClient.class); DiscoveryClient.getServices (). foreach (action -> {System.out.println (action);}); }}Hier ist die Standardanordnung von DiscoveryClient in der Annotation der Springbootapplication ausgeschlossen.
Wenn wir erfolgreich anfangen, können wir feststellen, dass die Konsole den entsprechenden Servicemamen und die entsprechende Adresse ausgibt:
Wir generieren die JAR -Datei erneut über Gradle -Verpackungen und Ausführen:
Java-Jar Mitgliedserver-0.0.1-Snapshot.jar-Server.port = 8800
Wir können sehen, dass der von der Service registrierte Wert, der in Redis zwischengespeichert wurde:
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.