2015-05-08 11 views
5

Stavo cercando di esplorare il servizio di rilevamento utilizzando il servizio Eureka (Netflix). Ho seguito i passaggi indicati nel collegamento wiki mostrato di seguito:Registrazione del servizio Web con Eureka

https://github.com/Netflix/eureka 

Il servizio Eureka è attivo e funzionante.

Successivamente ho provato a utilizzare il client postino per registrare un servizio con il metodo POST come descritto nel twiki, dopo aver letto lo schema xml e aver inviato il tipo di contenuto come JSON.

XML

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xsd:element name="instance"> 
     <xsd:complexType> 
      <xsd:all> 
       <!-- hostName in ec2 should be the public dns name, within ec2 public dns name will 
        always resolve to its private IP --> 
       <xsd:element name="hostName" type="xsd:string" /> 
       <!-- app name 
        Instructions for adding a new app name - <a _jive_internal="true" href="/clearspace/docs/DOC-20965" target="_blank">http://wiki.netflix.com/clearspace/docs/DOC-20965</a> --> 
       <xsd:element name="app" type="xsd:string" /> 
       <xsd:element name="ipAddr" type="xsd:string" /> 
       <xsd:element name="vipAddress" type="xsd:string" /> 
       <xsd:element name="secureVipAddress" type="xsd:string" /> 
       <xsd:element name="status" type="statusType" /> 
       <xsd:element name="port" type="xsd:positiveInteger" minOccurs="0" /> 
       <xsd:element name="securePort" type="xsd:positiveInteger" /> 
       <xsd:element name="homePageUrl" type="xsd:string" /> 
       <xsd:element name="statusPageUrl" type="xsd:string" /> 
       <xsd:element name="healthCheckUrl" type="xsd:string" /> 
       <xsd:element ref="dataCenterInfo" minOccurs="1" maxOccurs="1" /> 
       <!-- optional --> 
       <xsd:element ref="leaseInfo" minOccurs="0"/> 
       <!-- optional app specific metadata --> 
       <xsd:element name="metadata" type="appMetadataType" minOccurs="0" /> 
      </xsd:all> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="dataCenterInfo"> 
     <xsd:complexType> 
      <xsd:all> 
       <xsd:element name="name" type="dcNameType" /> 
       <!-- metadata is only required if name is Amazon --> 
       <xsd:element name="metadata" type="amazonMetdataType" minOccurs="0"/> 
      </xsd:all> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="leaseInfo"> 
     <xsd:complexType> 
      <xsd:all> 
       <!-- (optional) if you want to change the length of lease - default if 90 secs --> 
       <xsd:element name="evictionDurationInSecs" minOccurs="0" type="xsd:positiveInteger"/> 
      </xsd:all> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:simpleType name="dcNameType"> 
     <!-- Restricting the values to a set of value using 'enumeration' --> 
     <xsd:restriction base = "xsd:string"> 
      <xsd:enumeration value = "MyOwn"/> 
      <xsd:enumeration value = "Amazon"/> 
     </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:simpleType name="statusType"> 
     <!-- Restricting the values to a set of value using 'enumeration' --> 
     <xsd:restriction base = "xsd:string"> 
      <xsd:enumeration value = "UP"/> 
      <xsd:enumeration value = "DOWN"/> 
      <xsd:enumeration value = "STARTING"/> 
      <xsd:enumeration value = "OUT_OF_SERVICE"/> 
      <xsd:enumeration value = "UNKNOWN"/> 
     </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:complexType name="amazonMetdataType"> 
     <!-- From <a class="jive-link-external-small" href="http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html" target="_blank">http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?AESDG-chapter-instancedata.html</a> --> 
     <xsd:all> 
      <xsd:element name="ami-launch-index" type="xsd:string" /> 
      <xsd:element name="local-hostname" type="xsd:string" /> 
      <xsd:element name="availability-zone" type="xsd:string" /> 
      <xsd:element name="instance-id" type="xsd:string" /> 
      <xsd:element name="public-ipv4" type="xsd:string" /> 
      <xsd:element name="public-hostname" type="xsd:string" /> 
      <xsd:element name="ami-manifest-path" type="xsd:string" /> 
      <xsd:element name="local-ipv4" type="xsd:string" /> 
      <xsd:element name="hostname" type="xsd:string"/>  
      <xsd:element name="ami-id" type="xsd:string" /> 
      <xsd:element name="instance-type" type="xsd:string" /> 
     </xsd:all> 
    </xsd:complexType> 

    <xsd:complexType name="appMetadataType"> 
     <xsd:sequence> 
      <!-- this is optional application specific name, value metadata --> 
      <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

I parametri dello sguardo richiesta di registro in questo modo:

url: http://tpdeva13:8080/eureka/v2/apps/service1 Content-Type: application/json

I parametri inviati come JSON sono:

{ 
    "hostName":"tpdeva13", 
    "app":"service1", 
    "ipAddr":"tpdeva13", 
    "vipAddress":"tpdeva13", 
    "secureVipAddress":"tpdeva13", 
    "status":"STARTING", 
    "port":"11111" 

    } 

Non sono sicuro se l'audio che sto fornendo si allinea allo schema xml?

Quando invio la richiesta posta al server Tomcat che ospita eureka, ottengo il seguente errore:

com.thoughtworks.xstream.mapper.CannotResolveClassException: hostName 
com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:45) 
com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) 
com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:133) 
com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1052) 
com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1036) 
com.thoughtworks.xstream.XStream.fromXML(XStream.java:921) 
com.netflix.discovery.converters.EntityBodyConverter.read(EntityBodyConverter.java:57) 
com.netflix.discovery.provider.DiscoveryJerseyProvider.readFrom(DiscoveryJerseyProvider.java:94) 
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474) 
com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) 
com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) 
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$VoidOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:166) 
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
com.sun.jersey.server.impl.uri.rules.SubLocatorRule.accept(SubLocatorRule.java:134) 
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:895) 
com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:843) 
com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:804) 
com.netflix.eureka.ServerRequestAuthFilter.doFilter(ServerRequestAuthFilter.java:34) 
com.netflix.eureka.StatusFilter.doFilter(StatusFilter.java:68 

I servizi web sarebbe scritto in C++ e ho bisogno di utilizzare le API REST esposto da eureka registrarsi, annullare la registrazione dei miei servizi.

Qualcuno può aiutare. Sono bloccato con questo.

Il server eureka è in esecuzione in modalità di sviluppo.

Grazie!

risposta

1

L'errore che si sta verificando è a causa di un campo esterno mancante instance che dovrebbe avvolgere i campi definiti.

{ 
    "instance": { 
     "hostName":"tpdeva13", 
     "app":"service1", 
     "ipAddr":"tpdeva13", 
     "vipAddress":"tpdeva13", 
     "secureVipAddress":"tpdeva13", 
     "status":"STARTING", 
     "port":"11111" 
    } 
} 
1

porta ha questa sintassi "porta": { "$": 8001, "@enabled": "true"}

e anche bisogno dataCenterInfo "dataCenterInfo": { "name": "myown" }

0

Will Vanderhoef già asnwered la domanda, ma ho ottenuto lo stesso errore esatto utilizzando il client Java di Eureka. Dopo il debug esteso ho scoperto che la versione originale 2.4.3 di jackson è stata sostituita con 2.2.1 e che non rispettava la "istanza" di serializzazione dell'elemento radice.