springcloud-netfilx(Eureka)服务注册

本文介绍如何使用Spring Cloud Eureka搭建服务注册中心,并实现客户端服务的自动注册及服务发现功能,包括配置与代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Eureka server


1.maven(war)项目 springcloud-eurekaserver

pom.xml添加依赖:  spring-cloud-starter-eureka-server
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>


2.src/main/resources目录新建application.yml
文件配置:
server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  
3.启动类Main 添加注解:@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class Main {   
        public static void main(String[] args) {
            SpringApplication.run(Main.class, args);
        }
}

运行程序:浏览器访问 localhost:8761

二.Eureka Client


1.新建maven(war)项目 springboot-sendemail

pom.xml添加依赖:pring-cloud-starter-eureka

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- mail:发送邮件 -->
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!-- eureka:服务注册 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

</dependencies>

2.src/main/resources目录新建application.properties
文件配置:
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#服务名不能带"_",多个相同的服务的服务名相同
spring.application.name=sendmail
server.port=8081

#下面的是发送邮件的配置
spring.mail.port=25
spring.mail.host=smtp.qq.com
spring.mail.username=邮箱名
spring.mail.password=密码/授权码
#qq邮箱配置
spring.mail.properties.mail.smtp.starttls.enable=true


3.启动类Main 添加注解:@EnableEurekaClient /EnableDiscoveryClient

@SpringBootApplication
@EnableEurekaClient
public class Main {   
        public static void main(String[] args) {
            SpringApplication.run(Main.class, args);
        }
}


4.新建contrller类:EmailController

@RestController
public class EmailController {

    @Autowired
    private JavaMailSender jms;
 
    @PostMapping("/psend")
    public String sendMail(@RequestBody Map<String,Object> map){
        SimpleMailMessage mailMessage  =   new  SimpleMailMessage();
        mailMessage.setFrom("邮件发送方的邮箱");
        mailMessage.setTo(map.get("send_to").toString());   //邮件接收方的邮箱
        mailMessage.setSubject(map.get("send_subject").toString());  //邮件主题
        mailMessage.setText(map.get("send_content").toString());  //邮件内容
        jms.send(mailMessage);
        return "发送成功";
    }     
    
}



启动server,再运行8081端口的client,修改client的端口为8082再次运行 


浏览器访问localhost:8761  即可查看注册的服务sendmail    
 
SENDMAIL n/a (2)(2) UP (2) - user:sendmail:8082 , user:sendmail:8081


服务与服务之间的调用:服务发现

一个项目(程序)中的每个服务都可以当做独立的一部分,可以单独运行和使用,
在多台服务器上部署相同的服务(服务名都相同)
服务启动后自动注册在注册中心,由注册中心来决定调用那台机器上的服务(负载均衡策略)
<think>我们正在解决SpringBoot应用启动时因Eureka DiscoveryClient初始化失败导致的Bean创建异常。根据引用内容,我们可以总结出几个可能的原因和解决方案:1.依赖冲突:特别是与Jersey客户端相关的依赖(引用[3][4])。SpringCloud Netfilx Eureka Client默认使用Jersey作为REST客户端,但如果项目中同时引入了SpringWeb(使用RestTemplate)可能导致冲突。2.类缺失:具体是`com.sun.jersey.client.apache4.ApacheHttpClient4`类缺失(引用[3]),这通常是因为依赖不完整或版本问题。3.依赖配置问题:需要排除Jersey依赖并引入其他REST实现(如引用[4]中提到的解决方案)。解决方案:方案一:排除Eureka Client中的Jersey依赖,并引入ApacheHttpClient(或其他支持)的依赖。方案二:升级Spring Cloud版本,因为新版本可能已经不再使用Jersey(如从Hoxton版本开始,SpringCloud Netflix默认使用Spring的RestTemplate替代Jersey)。具体步骤:1.排除Jersey依赖(如果使用旧版本SpringCloud):在`pom.xml`中,对`spring-cloud-starter-netflix-eureka-client`排除Jersey相关依赖:```xml<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><exclusions><exclusion><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId></exclusion><exclusion><groupId>com.sun.jersey</groupId><artifactId>jersey-core</artifactId></exclusion><exclusion><groupId>com.sun.jersey.contribs</groupId><artifactId>jersey-apache-client4</artifactId></exclusion></exclusions></dependency>```然后,添加ApacheHttpClient的依赖(因为Eureka Client可能需要一个HTTP客户端):```xml<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>```2.升级SpringCloud版本(如果可行):如果使用的是较旧的SpringCloud版本(例如Finchley或更早),考虑升级到Hoxton或更高版本。在Hoxton版本中,EurekaClient默认使用Spring的`RestTemplate`,不再依赖Jersey。3.检查依赖树:使用`mvndependency:tree`命令检查依赖冲突,确保没有其他不兼容的依赖。4.确保配置正确:在`application.yml`或`application.properties`中,确保Eureka客户端配置正确,例如:```yamleureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/```5.检查Eureka服务器状态:确保Eureka服务器正在运行并且可访问。6.如果以上方法无效,检查堆栈跟踪中是否有其他异常信息,可能还有其他根本原因。根据引用[5],还可能是由于上下文尚未刷新完成导致的,但通常这会在启动时自行解决。如果遇到类似问题,可以检查应用启动顺序和配置。请根据您的实际情况选择解决方案。如果问题仍然存在,请提供更多错误日志信息。相关问题:1.如何排除Maven依赖中的特定库?2.如何升级Spring Cloud版本?3.如何配置Eureka客户端以连接到不同的Eureka服务器?</think>### Spring Boot Eureka DiscoveryClient BeanCreationException 解决方案 根据您遇到的错误信息,核心问题是 Eureka Discovery Client 初始化失败导致 Bean 创建异常。以下是常见原因和解决方案: #### 常见原因及解决方案 1. **依赖冲突(最常见)** Spring Cloud Eureka Client 默认使用 Jersey REST 客户端,而 Spring Web 使用 RestTemplate,两者冲突。 **解决方案**: 在 `pom.xml` 中排除 Jersey 依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <exclusions> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> </exclusion> <exclusion> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-apache-client4</artifactId> </exclusion> </exclusions> </dependency> ``` 添加 Apache HttpClient 替代: ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> ``` 引用[4]指出此冲突是主要原因[^4]。 2. **类路径缺失** 错误 `java.lang.NoClassDefFoundError: com/sun/jersey/client/apache4/ApacheHttpClient4` 表明依赖不完整。 **解决方案**: 确保包含完整依赖: ```xml <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-apache-client4</artifactId> <version>1.19.4</version> <!-- 匹配您的Spring Cloud版本 --> </dependency> ``` 引用[3]确认此类缺失导致初始化失败[^3]。 3. **Eureka 服务器连接问题** DiscoveryClient 初始化需连接 Eureka Server。 **解决方案**: 检查 `application.yml` 配置: ```yaml eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # 确保URL正确 instance: prefer-ip-address: true ``` 验证 Eureka Server 是否运行且网络可达。 4. **Spring Cloud 版本兼容性** **解决方案**: 升级 Spring Boot 和 Spring Cloud 至兼容版本(推荐 Spring Boot 2.6.x + Spring Cloud 2021.0.x)。 在 `pom.xml` 中指定: ```xml <properties> <spring-cloud.version>2021.0.3</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` 5. **上下文初始化顺序问题** **解决方案**: 在启动类添加延迟初始化: ```java @SpringBootApplication @EnableDiscoveryClient public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .web(WebApplicationType.SERVLET) .run(args); } } ``` 引用[5]指出上下文未刷新可能导致异常[^5]。 #### 调试步骤 1. 检查完整堆栈跟踪:`nested exception is java.lang.RuntimeException: Failed to initialize DiscoveryClient` 后的具体原因。 2. 运行 `mvn dependency:tree` 分析依赖冲突。 3. 启用 DEBUG 日志: ```yaml logging: level: org.springframework.cloud: DEBUG com.netflix.discovery: DEBUG ``` #### 预防措施 - 使用 Spring Cloud 2020.0.0+ 版本(默认移除 Jersey 依赖)。 - 在测试环境使用 `@SpringBootTest(properties = "eureka.client.enabled=false")` 隔离 Eureka 依赖。 通过上述步骤,95% 的类似问题可解决。若仍失败,请提供完整的异常堆栈和依赖树进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值