java 带有Eureka DiscoveryClient的Sping Boot 应用程序无法启动

mctunoxg  于 2023-01-04  发布在  Java
关注(0)|答案(4)|浏览(154)

我正在尝试编写一个简单的SpringBoot应用程序,它可以(1)向Netflix的Eureka服务器注册,以及(2)查询Eureka服务器以检索其他已注册服务的详细信息。
我的客户端类有一个com.netflix.discovery.DiscoveryClient类型的@Autowired字段,用于与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:网站名称:eureka.示例配置Bean. getInstanceI d()语言/字符串;获取(EurekaConfigBasedInstanceInfoProvider. java:53)在com. netflix.应用程序信息管理器. initComponent(应用程序信息管理器. java:90)... 25更多**

我不知道这里发生了什么。有什么想法吗?我相信应用程序仍然应该启动,即使我的Eureka 配置是不正确的,但它在启动时间跌倒了。
第二,我使用的DiscoveryClient是否正确?理想情况下,我希望它是通用的,这样我就可以将其作为示例用于Eureka、Consul或ZooKeeper。我发现文档并不擅长说明使用这些Spring Cloud/Netflix发现组件时需要什么。

ghhkc1vu

ghhkc1vu1#

您可以使用

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

sshcrbum

sshcrbum2#

在我的经验中,当我使用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;
}
2hh7jdfx

2hh7jdfx3#

如果我们使用的是最新版本的SpringBoot,那么我们就不需要在主类中定义@EnableDiscoveryClient或@EnableEurekaClient,当我们在pom.xml中添加依赖项时,Spring会在后台执行此操作
请确保您的文件包含以下基本信息。

    • 聚合物. 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

No changes or @ Annotations required in the main class in Application.java
请检查我的GIT Repository here的工作代码。

9avjhtql

9avjhtql4#

添加应用程序.yml文件这些设置;

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

服务器:端口:8482

我们的服务将按自己的服务名注册

Spring:应用:名称:产品-服务

# To be register we assign eureka service url
eureka:
   client:
     service-url :
        defaultZone:
            ${EUREKA_URI:http://localhost:8481/eureka} # add your port where your eureka server running
   instance :
      prefer-ip-address : true

# Logging file path
logging :
   file :
      path : target/${spring.application.name}.log

相关问题