Eureka DiscoveryClient的Spring Boot应用无法启动

时间:2015-12-15 20:00:44

标签: java spring spring-boot discovery netflix-eureka

我正在尝试编写一个简单的Spring Boot应用程序,它可以(1)向Netflix Eureka服务器注册,以及(2)查询Eureka服务器以检索其他注册服务的详细信息。

我的客户端类有一个@Autowired字段com.netflix.discovery.DiscoveryClient,用于与Eureka交谈并查询它以了解其他服务。在我的主要课上,我有注释@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class AppBootstrap {

    public static void main(String[] args) {
        SpringApplication.run(AppBootstrap.class, args);
    }

}

在src / main / resources下的application.yml文件中,我有:

eureka:
    instance:
         lease-renewal-interval-in-seconds: 10
         lease-expiration-duration-in-seconds: 20
         prefer-ip-address: true
         secure-port: 443
         non-secure-port: 80
         metadata-map:
             instanceId: my-test-instance
    client:
         service-url:
             defaultZone: http://localhost:9080/eureka/
         registry-fetch-interval-seconds: 6
         instance-info-replication-interval-seconds: 6
         register-with-eureka: true
         fetch-registry: true
         heartbeat-executor-thread-pool-size: 5
         eureka-service-url-poll-interval-seconds: 10

当我启动我的应用程序时,服务无法启动,抛出了一个根源于:

的异常

引起:java.lang.AbstractMethodError:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean.getInstanceI d()Ljava /郎/字符串;         在com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider.get(EurekaConfigBasedInstanceInfoProvider) 的.java:53)         at com.netflix.appinfo.ApplicationInfoManager.initComponent(ApplicationInfoManager.java:90)         ......还有25个

我不知道这里发生了什么。有任何想法吗?我相信即使我的Eureka配置不正确,应用程序仍应启动,但它会在启动时失效。

其次,我使用正确的DiscoveryClient吗?理想情况下,我想把它变成一般的,以便我可以将它与Eureka,Consul或ZooKeeper一起用作例子。我发现使用这些Spring Cloud / Netflix发现组件时,文档并不能很好地说明所需的内容。

4 个答案:

答案 0 :(得分:0)

您可以使用

org.springframework.cloud.client.discovery.DiscoveryClient

然后您可以使用discoveryClient.getInstances

获取实例列表
ServiceInstance instance = discoveryClient.getInstances(service).get(0);
instance.getUri().toString();

如果您使用RestTemplate,Ribbon等其他组件,则只需在URL中使用服务名称(在eureka中注册的名称)

restTemplate.getForObject("http://PRODUCTSMICROSERVICE/products/{id}", Product.class, id)

你可以在这里看到更多

https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

答案 1 :(得分:0)

当我使用discoveryclient在任何函数之外获取类中的信息时,我收到了自动装配错误。所以我使用eureka找到我的服务的端口,因为端口被描述为0因此服务正在动态地启动端口,同时作为spring boot应用程序启动。我需要以编程方式知道端口。在控制器中,我以错误的方式使用下面的代码

public class HelloController {

private static final Logger LOG = LoggerFactory.getLogger(HelloController.class);

@Autowired
private DiscoveryClient discoveryClient;

int port = discoveryClient.getLocalServiceInstance().getPort();


@RequestMapping("/hello/{id}")
public String  sayhello(@PathVariable String id)
{
    String s ="A very nice and warm welcome to the world "+id;
            LOG.info(String.format("calling helloservice for %s",id));
    LOG.info(String.format("calling helloservice for port %d",port));
    return s;
} 

一旦我将端口代码放入sayhello方法中,错误便消失了。因此,正确的端口检索方式如下所示

public class HelloController {

private static final Logger LOG = LoggerFactory.getLogger(HelloController.class);

@Autowired
private DiscoveryClient discoveryClient;



@RequestMapping("/hello/{id}")
public String  sayhello(@PathVariable String id)
{
    String s ="A very nice and warm welcome to the world "+id;
    int port = discoveryClient.getLocalServiceInstance().getPort();
    LOG.info(String.format("calling helloservice for %s",id));
    LOG.info(String.format("calling helloservice for port %d",port));
    return s;
}

答案 2 :(得分:0)

如果我们使用的是Spring Boot的最新版本,则不需要在主类中定义@EnableDiscoveryClient或@EnableEurekaClient。当我们在pom.xml中添加依赖项时,Spring会在后台发生这种情况

请确保您的文件具有以下基本信息。

pom.xml

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.0-SNAPSHOT</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

application.properties 或根据选择的YAML文件

spring.application.name=eureka-client

eureka.client.service-url.defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
eureka.instance.prefer-ip-address= true
server.port= 8082

在Application.java的主类中不需要任何更改或@注释

请签出我的GIT Repository here以获取工作代码。

答案 3 :(得分:0)

添加application.yml文件这些设置;

我们的产品应用程序在此端口上运行

服务器: 端口:8482

我们的服务将通过自己的服务名称进行注册

春天: 应用范围: 名称:产品服务

from sklearn.metrics import accuracy_score
from sklearn.linear_model import LinearRegression 

errors = []
for i in range(10):
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, Shuffle=True)
    model = LinearRegression() # the model you want to use here
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    error = accuracy_score(y_test, y_pred) # the error metric you want to use here
    errors.append(error)