一、Eureka的概述
Eureka的基本概念和作用
Eureka是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Eureka是Netflix开发的服务发现框架,主要用于解决在云计算环境中动态位置服务和快速弹性变化的问题。在微服务架构中,Eureka可以作为服务注册与发现组件,使服务之间能够相互通信。
Eureka的作用主要包括以下几点:
1、服务注册与发现: Eureka作为服务注册中心,允许服务实例注册自己的信息,并能够被其他服务查询和发现。这使得服务之间能够动态地相互发现和通信。
2、负载均衡: Eureka提供了负载均衡机制,能够根据服务实例的状态和数量,动态地将请求分配给可用的服务实例。这有助于提高服务的可用性和性能。
3、故障转移: 当某个服务实例出现故障时,Eureka能够自动将其从服务列表中移除,并将请求路由到其他可用的服务实例。这有助于提高服务的可靠性和稳定性。
4、监控和日志管理: Eureka提供了丰富的监控和日志管理功能,能够帮助开发人员和运维人员实时监控服务的状态和性能,以及进行故障排查和日志分析。
Eureka的主要特点
1、易于使用: Eureka提供了简洁的API和友好的用户界面,使得服务的注册、发现和配置变得简单。
2、高可用性: Eureka支持服务注册中心的集群部署,通过相互注册来保证注册中心的高可用性。
3、动态扩展:Eureka支持服务的动态注册和注销,适应服务实例的动态变化。
4、负载均衡: Eureka集成了Ribbon负载均衡器,实现了对多个服务提供者的请求分配,提高了系统的性能和稳定性。
5、健康检查:Eureka注册中心会定期对服务提供者进行健康检查,如果一个服务提供者出现故障,Eureka将其标记为不可用。服务消费者在查询服务列表时可以过滤掉不可用的服务提供者,确保只选择健康的服务。
6、故障转移: 在Eureka平台中,如果某台服务器宕机,客户端请求会自动切换到新的Eureka节点。当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理中。
7、客户端缓存功能:Eureka还有客户端缓存功能,即使Eureka集群中所有节点都失效,或者发生网络分割故障导致客户端不能访问任何一台Eureka服务器,Eureka服务的消费者仍然可以通过Eureka客户端缓存来获取现有的服务注册信息。
总的来说,Eureka主要特点体现在服务的动态注册与发现、负载均衡、健康检查、故障转移和客户端缓存等方面,这使得Eureka成为构建微服务架构的可靠基础设施。
Eureka在微服务架构中的地位和作用
Eureka在微服务架构中扮演着核心的角色,负责服务的注册与发现。其主要作用和地位如下:
1、中心枢纽: Eureka作为中心服务注册与发现组件,使得其他微服务能够相互发现和通信。其他组件和服务都依赖Eureka来获取其他服务的地址信息,然后根据项目需求实现自己的业务。
2、服务治理: Eureka负责管理服务的注册与发现,使得服务可以动态地加入或离开。这有助于实现服务的动态管理和快速弹性变化,提高了服务的可用性和可靠性。
3、负载均衡和故障转移: Eureka集成了负载均衡和故障转移机制。它可以根据服务实例的状态和数量,动态地将请求分配给可用的服务实例,并在某个实例出现故障时自动进行故障转移。
二、Eureka的工作原理
Eureka的注册与发现机制
Eureka的注册与发现机制主要基于以下步骤:
1、服务注册: 当一个服务启动时,Eureka客户端会向Eureka Server发送注册请求,将自己的信息注册到Eureka Server上。这些信息包括服务实例的IP地址、端口号、应用名称、实例ID等信息。Eureka Server接收到注册信息后,会将该服务实例的信息存储在内存中,并定期向其他Eureka Server节点发送心跳,保持信息的同步。
2、服务发现: 当一个服务消费者需要调用其他服务时,它会向Eureka Server发送一个服务发现请求。Eureka Server会返回已注册的服务实例列表,消费者可以根据返回的列表来获取目标服务的地址信息。为了实现负载均衡,Eureka Server提供了多种负载均衡策略,如轮询、随机等。
3、服务更新与注销: 当服务实例的状态发生变化时,Eureka客户端会向Eureka Server发送更新请求,更新服务实例的状态信息。如果服务实例需要下线或注销,Eureka客户端会向Eureka Server发送注销请求,将该服务实例从注册表中删除。
4、健康检查: Eureka Server会定期对服务实例进行健康检查,检查其是否正常运行。如果某个服务实例出现故障或异常,Eureka Server会自动将其从服务列表中移除,保证服务的可用性。
5、客户端缓存: 为了提高性能和可用性,Eureka客户端会缓存服务实例的信息。即使在Eureka Server节点宕机或网络分割的情况下,服务消费者仍然可以通过缓存来获取现有的服务注册信息。
通过以上机制,Eureka实现了服务的动态注册与发现,使得微服务架构中的服务之间能够动态地相互发现和通信,提高了服务的可用性、可靠性和性能。
Eureka的注册与发现机制主要通过Eureka Server和Eureka Client来实现。以下是一个简单的代码实现例子:
首先,我们需要创建一个Eureka Server:
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaserver;@EnableEurekaserver@SpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(String[] args){
SpringApplication.run(EurekaServerApplication.class, args);}}
然后,我们需要创建一个Eureka Client,用于注册和发现服务:
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.EnableEurekas;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaserver;@EnableEurekas@SpringBootApplicationpublicclassEurekaClientApplication{publicstaticvoidmain(String[] args){
SpringApplication.run(EurekaClientApplication.class, args);}}
在application.yml或application.properties文件中,你需要配置Eureka Server的地址:
yml
eureka:instance:hostname: localhost
client:registerWithEureka:truefetchRegistry:trueserviceUrl: http://localhost:60001/eureka/
Eureka的服务实例状态管理
Eureka的服务实例状态管理主要包括以下几个方面:
1、正常状态: 服务实例正常运行,能够正常处理请求。在Eureka中,服务实例的状态由Eureka Server进行监控和记录。当服务实例处于正常状态时,Eureka Server会定期向该实例发送心跳包,以保持其注册信息的有效性。
2、下线状态: 服务实例由于某种原因无法正常提供服务,需要从服务列表中移除。当服务实例处于下线状态时,Eureka Server会将其从服务列表中剔除,以保证服务的高可用性。服务实例的下线状态可以通过Eureka Server的管理界面进行手动设置。
3、离线状态: 与下线状态类似,服务实例处于离线状态时也无法正常提供服务。离线状态通常用于在服务实例短暂不可用时,暂时将其从服务列表中移除。与下线状态不同的是,离线状态的实例在恢复正常后,可以自动重新注册到Eureka Server。
4、禁用状态: 服务实例被禁用,无法接受任何请求。禁用状态通常用于在维护或升级期间暂时停止服务。在禁用状态下,Eureka Server会保留服务实例的注册信息,但不会向其发送心跳包。
通过以上状态管理机制,Eureka能够有效地监控和管理服务实例的状态,保证服务的可用性和可靠性。同时,Eureka还提供了丰富的API和监控界面,方便管理员对服务实例的状态进行管理和监控。
Eureka的安全和认证机制
Eureka的安全和认证机制主要是通过设置用户名和密码来实现的。具体步骤如下:
在Eureka Server中导入Security依赖,如Spring Security依赖。
在Eureka Server的配置文件中添加安全认证相关的配置,包括用户名和密码。例如,可以在application.yml或application.properties文件中添加如下配置:
spring:security:user:name: ldzg
password:123456
在Eureka Client的配置文件中设置与Eureka Server相同的用户名和密码,以进行安全认证。例如,在application.yml或application.properties文件中添加如下配置:
yml
eureka:client:username: ldzg
password:123456
重启Eureka Server和Eureka Client,启动后Eureka Client会自动使用设置的用户名和密码向Eureka Server进行安全认证。如果认证失败,Eureka Client将无法注册到Eureka Server。
完成安全认证后,Eureka Client就可以正常地注册到Eureka Server,并与其他服务进行交互。
通过以上步骤,可以确保只有通过安全认证的服务才能注册到Eureka Server,提高了服务的可用性和安全性。
三、Eureka的实操
单机版无安全检验方式
架构图
1、Eureka-server
代码
packagecom.ldzg;importlombok.extern.slf4j.Slf4j;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;importorg.springframework.context.ConfigurableApplicationContext;importorg.springframework.core.env.Environment;importjava.net.InetAddress;importjava.net.UnknownHostException;@Slf4j@EnableEurekaServer@SpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(String[] args)throwsUnknownHostException{ConfigurableApplicationContext application =SpringApplication.run(EurekaServerApplication.class, args);Environment env = application.getEnvironment();String ip =InetAddress.getLocalHost().getHostAddress();String port = env.getProperty("server.port");String path ="";// env.getProperty("server.servlet.context-path");
log.info("\n----------------------------------------------------------\n\t"+"Application Eureka is running! Access URLs:\n\t"+"Local: \t\thttp://localhost:"+ port + path +"/\n\t"+"External: \thttp://"+ ip +":"+ port + path +"/\n\t"+"swagger-ui: \thttp://"+ ip +":"+ port + path +"/swagger-ui.html\n\t"+"Doc: \t\thttp://"+ ip +":"+ port + path +"/doc.html\n"+"----------------------------------------------------------");}}
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud-learning</artifactId><groupId>com.ldzg</groupId><version>1.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-server1</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><!-- <dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-starter-security</artifactId>--><!-- </dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml配置文件说明
server:port:60001#指定运行端口spring:application:name: eureka-server #指定服务名称eureka:instance:hostname: localhost #指定主机地址client:fetch-registry:false#指定是否要从注册中心获取服务(注册中心不需要开启)register-with-eureka:false#指定是否要注册到注册中心(注册中心不需要开启)service-url:#eureka的地址信息defaultZone: http://localhost:60001/eureka
server:enable-self-preservation:false#关闭保护模式
运行结果:
2、springcloud-consumer
java代码
packagecom.ldzg;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublicclassEurekaClientApplication{publicstaticvoidmain(String[] args){SpringApplication.run(EurekaClientApplication.class, args);}}
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud-learning</artifactId><groupId>com.ldzg</groupId><version>1.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>eureka-client</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka-client</name><description> Spring cloud</description><!-- <dependencies>--><!-- <dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-starter-security</artifactId>--><!-- </dependency>--><!-- </dependencies>--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml配置文件说明
server:port:60002#运行端口号spring:application:name: eureka-client #服务名称eureka:client:register-with-eureka:true#注册到Eureka的注册中心fetch-registry:true#获取注册实例列表service-url:defaultZone: http://localhost:60001/eureka/ #配置注册中心地址
3、springcloud-provider
java代码
- Controller
packagecom.ldzg.controller;importcom.ldzg.ov.CommonResult;importcom.ldzg.ov.User;importcom.ldzg.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;/**
* Created by ldzg on 2024/1/18.
*/@RestController@RequestMapping("/ldzguser")publicclassUserFeignController{@AutowiredprivateUserService userService;@GetMapping("/{id}")publicCommonResultgetUser(@PathVariableLong id){return userService.ldzg_getUser(id);}@GetMapping("/getByUsername")publicCommonResultgetByUsername(@RequestParamString username){return userService.ldzg_getByUsername(username);}@PostMapping("/create")publicCommonResultcreate(@RequestBodyUser user){return userService.ldzg_create(user);}@PostMapping("/update")publicCommonResultupdate(@RequestBodyUser user){return userService.ldzg_update(user);}}
- Service
packagecom.ldzg.service.impl;importcom.ldzg.ov.CommonResult;importcom.ldzg.ov.User;importcom.ldzg.service.UserService;importorg.springframework.stereotype.Component;/**
* Created by ldzg on 2024/1/18.
*/@ComponentpublicclassUserFallbackServiceimplementsUserService{@OverridepublicCommonResultldzg_create(User user){User defaultUser =newUser(-1L,"ldzg","123456");returnnewCommonResult<>(defaultUser);}@OverridepublicCommonResult<User>ldzg_getUser(Long id){User defaultUser =newUser(-1L,"ldzg","123456");returnnewCommonResult<>(defaultUser);}@OverridepublicCommonResult<User>ldzg_getByUsername(String username){User defaultUser =newUser(-1L,"ldzg","123456");returnnewCommonResult<>(defaultUser);}@OverridepublicCommonResultldzg_update(User user){returnnewCommonResult("调用失败",500);}}
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud-learning</artifactId><groupId>com.ldzg</groupId><version>1.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springcloud-provider</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml配置文件说明
server:port:60005spring:application:name: consumer
eureka:client:register-with-eureka:true#注册到Eureka的注册中心fetch-registry:true#获取注册实例列表service-url:defaultZone: http://localhost:60001/eureka/ #配置注册中心地址feign:hystrix:enabled:true#开启Hystrixlogging:level:com.macro.cloud.service.UserService: debug
运行结果
第一篇先讲到这里,下一期讲第二篇关于Eureka的高可用与安全连接模式
- 欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!
版权归原作者 落地之光 所有, 如有侵权,请联系我们删除。