版权声明:本文为CSDN原创投稿文章,转载请标明原创地址! https://blog.csdn.net/qq_27046951/article/details/82880609
Eureka介绍
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务注册与发现功能。
Eureka的架构
- 服务器端(服务注册中心)
Eureka提供的服务器端,用于提供服务注册与发现功能,Eureka没有提供后台的存储而是将服务保存在内存的注册中心,通过心跳来保持最新状态 - 服务提供者
服务提供者是Eureka的客户端,向服务端注册服务、向服务器发送心跳、获取服务注册列表。当服务注册到服务端时,会提供自己的元信息(主机、端口、服务名等) - 服务消费者
对于注册发布到服务端的服务,服务消费者可以对其进行查找与调用,服务调用者也是一个Eureka客户端,但其主要职责是查找与调用服务。
Eureka的服务治理机制
-
服务提供者
- 服务注册
服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureser服务器,同时携带了自身服务的一些元数据信息。 - 服务同步
集群模式下会有多个Eureka服务器,如上图,服务提供者将服务分别注册到了两个不同的Eureka服务器,他们的信息分别被两个Eureka服务器维护,而Eureka服务器之间也相互注册为服务,当一个服务提供者注册服务的REST请求到达Eureka服务器后,该Eureka服务器会将请求转发给集群中相连的其它Eureka服务器,从而实现服务的同步。 - 服务续约
在服务注册成功后,服务提供者会维护一个心跳(默认为每隔30秒)给Eureka服务器,以防止Eureka服务器将服务剔除! - 服务下线
在服务运行的过程中会面临关闭和重启服务的情况,在服务关闭期间,我们不希望服务消费者来继续调用关闭了的服务,所以在服务端进行正常的关闭时,会触发一个下线的REST请求给Eureka服务器,服务器接收到请求后,会将该服务于标记为下线,并广播给其它服务器。
- 服务注册
-
服务消费者
- 获取服务
当我们启动服务消费者的时候,它会发送一个REST请求给Eureka服务器,来获取服务器上成功注册的服务。 - 服务调用
服务消费者获取到注册的服务后,可以通过服务名来调用服务,在Ribbon中会采用轮询的方式来进行调用,从而实现客户端的负载均衡。
- 获取服务
-
Eureka服务器(服务注册发现中心)
- 失效剔除
有些时候,服务并不一定会正常下线,可能由于内存溢出或者网络故障导致服务无法继续工作,Eureka服务器并没有收到下线请求。为了从服务列表中清除不能正常工作的服务,Eureka服务器在启动的时候会创建一个定时任务,默认每隔60秒将当前服务列表中超过90秒没有发送心跳的服务剔除出去。 - 自我保护
该警告就是发出了Eureka的自我保护机制!服务注册到Eureka服务器后,会向其发送心跳,Eureka在运行期间,会统计心跳失败的比率在15分钟是否低于85%,如果低于,Eureka服务器会将这些服务保护起来,不会剔除。
- 失效剔除
简单Eureka应用
-
构建Eureka服务
-
pom.xml文件中添加依赖
<!--添加eureka服务端的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
-
在application.yml文件中进行配置
#配置服务端口 server: port: 8761 eureka: client: fetch-registry: false #自己就是注册中心,负责维护服务,不需要去检索服务 register-with-eureka: false #不向注册中心注册自己
-
启动类配置@EnableEurekaService
@SpringBootApplication // @EnableEurekaService:EurekaServer服务器端启动类,接受其它微服务注册进来 @EnableEurekaServer public class WzxSpringCloudEurekaApplication { public static void main(String[] args) { SpringApplication.run(WzxSpringCloudEurekaApplication.class, args); } }
-
启动应用并在浏览器访问http://localhost:8761/
-
-
服务提供者
-
在pom.xml文件中添加依赖
<!--添加eureka,将服务提供者注册到eureka中--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
在application.propreties文件中进行配置
server.port=9000 eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ spring.application.name=wzx-spring-cloud-provider
-
编写Controller,提供简单的REST服务
/** * @author WangZX * @create 2018-09-28 0:48 */ @RestController @RequestMapping("/dept") public class DeptControllerProvider { @Autowired private DeptService deptService; @GetMapping("/findAll") public List<Dept> findAll() { List<Dept> depts = deptService.findAll(); return depts; } }
-
编写启动类,添加@EnableEurekaClient注解声明该应用是一个Eureka客户端
@SpringBootApplication // 扫描Mapper接口 @MapperScan("com.wzx.dao") // @EnableEurekaClient:声明该应用是一个Eureka客户端 @EnableEurekaClient public class WzxSpringCloudProviderApplication { public static void main(String[] args) { SpringApplication.run(WzxSpringCloudProviderApplication.class, args); } }
-
-
服务消费者
-
在pom.xml文件中引入依赖
<!--添加eureka,将服务消费者注册到eureka中--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--客户端的负载均衡,轮询--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
-
在application.properties文件中进行配置
#消费者端口 server.port=80 spring.application.name=wzx-spring-cloud-consumer eureka.instance.hostname=localhost eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
-
配置RestTemplate
RestTemplate是Spring提供的一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类@Configuration public class RestTemplateConfig { /** * RestTemplate:提供了多种便捷访问远程Http服务的方法 * 是一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类 */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
编写Controller,通过服务名来调用服务
/** * @author WangZX * @create 2018-09-27 14:54 */ @RestController @RequestMapping("/consumer/dept") public class DeptController { @Autowired private RestTemplate restTemplate; @GetMapping("findAll") public List<Dept> findAll() { //通过服务提供者名称调用 List<Dept> depts = restTemplate.getForObject("http://wzx-spring-cloud-provider/dept/findAll", List.class); return depts; } }
-
-
最终测试
- 启动Eureka服务器
- 启动服务提供者
- 启动服务消费者