2015-05-08 23 views
5

Próbowałem zgłębiać usługę wykrywania przy użyciu usługi Eureka (Netflix). Po wykonaniu czynności wymienionych w łączu wiki podanym poniżej:Rejestracja usługi internetowej za pomocą Eureka

https://github.com/Netflix/eureka 

Usługa Eureka została uruchomiona.

Następnie próbowałem użyć klienta listonosza do zarejestrowania usługi przy użyciu metody POST, jak opisano w twiki, po przeczytaniu schematu XML i wysłaniu typu zawartości jako 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> 

Parametry żądanie rejestr wyglądać następująco:

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

Parametry przesyłane jako json są:

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

    } 

Nie jestem pewien, czy json, który dostarczam wyrównuje ze schematem XML?

Kiedy wysłać żądanie POST do serwera tomcat którym odbywa eureka, pojawia się następujący błąd:

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 

Web Services będzie napisany w C++, więc muszę korzystać z REST API wystawioną przez eureka zarejestrować się, wyrejestrować moje usługi.

Czy ktoś może pomóc. Utknąłem z tym.

Serwer eureka działa w trybie programowania.

Dzięki!

Odpowiedz

1

Błąd, który widzisz, wynika z brakującego zewnętrznego pola instance, które ma zawinąć zdefiniowane pola.

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

port ma tej składni "port" : { "$": 8001, "@enabled": "Prawda"}

a także potrzeba dataCenterInfo "dataCenterInfo": { "name": "MyOwn" }

0

Czy Vanderhoef już odpowiedział na pytanie, ale otrzymałem dokładnie ten sam błąd za pomocą klienta java eureka. Po rozszerzonym debugowaniu okazało się, że oryginalna wersja 2.4.3 z jackson została nadpisana przez 2.2.1 i nie respektowała serializacji elementu głównego "instancja".