Eureka简介
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性,类似zookeeper,Eureka也是一个服务注册和发现组件,是SpringCloud的一个优秀子项目,不过比较坑的是,Eureka2版本已经停止更新了,但是Eureka1版本还是很稳定,功能足够用,所以还是有必要学习下
几个常用的服务注册与发现组件对比:
Eureka GitHub地址: https://github.com/Netflix/eureka
为什么需要服务治理组件
之前每个应用都是一个CPU,一个主机上的单一系统。随着大数据和云计算时代的到来,任何独立的程序都可以运行在多个计算机上,并且随着业务的发展,访问用户量的增加,开发人员或小组的增加,系统会被拆分成多个功能模块,拆分后每个功能模块可以作为一个独立的子系统提供其职责范围内的功能;而多个子系统中,由于职责不同并且会存在相互调用,同时可能每个子系统还需要多个实例部署在多台服务器或者镜像中,导致子系统间的相互调用形成了一个错综复杂的网状结构,下面用几幅图来说明一下
单体应用:
随着业务的发展,经过了多个系统架构的演变,变成了这样(拿百度的功能举个栗子):
图中,每个网页搜索子系统和百度地图子系统的实例都可以视同为一个微服务,网页搜索子系统为百度地图子系统提供了“用户查询内容、用户IP地址”等信息提供的服务接口,为百度地图子系统定位用户地理信息情况提供数据依据
百度地图子系统提供了“根据内容查询出地图信息”的接口提供给其他子系统调用,而这里网页搜索子系统调用了这个接口,获取地图相关信息
网页搜索子系统和百度地图子系统又提供了各自对外用户调用的网页搜索、地图搜索等各自的对外服务。这个过程就形成了以上错综复杂的网状结构;而实际上这样还远远不够,因为每个子系统往往会提供多个对内的其他子系统调用的服务接口,同时也会调用多个不同子系统提供的多个服务接口,还会对外提供多个各自的服务接口。所以实际中上图的网状调用结构将会成几何倍的扩张,而且随着用户量的增加,每个子系统还需要继续增加更多的实例来提供服务,从而导致了凌乱的加剧。对于微服务之间错综复杂的调用关系,通过Eureka来进行管理,可以让每个服务之间不用关心如何调用的问题,专注于自己的业务功能实现
Eureka的初步使用
- 搭建Eureka服务注册中心
前面说过Eureka是c/s模式的,server服务端就是服务注册中心,其他的都是client客户端,服务端用来管理所有服务,客户端通过注册中心,来调用具体的服务,先来搭建下服务端,也就是服务注册中心:
创建一个简单的springboot模块(microservice-eureka-server-2001)
在pom文件中加入eureka-server依赖,pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ue</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-eureka-server-2001</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
在yml文件中添加Eureka服务端相关信息,application.yml如下:
server:
port: 2001
context-path: /
eureka:
instance:
#Eureka注册中心实例名称
hostname: localhost
client:
#由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
register-with-eureka: false
#由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
fetch-registry: false
service-url:
#设置与Eureka注册中心交互的地址,查询服务和注册服务时用到
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
在启动类中添加@EnableEurekaServer注解,MicroserviceEurekaServer2001Application.java如下:
package com.ue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class MicroserviceEurekaServer2001Application {
public static void main(String[] args) {
SpringApplication.run(MicroserviceEurekaServer2001Application.class, args);
}
}
搭建成功截图如下:
- 向Eureka中注册服务提供者
这里在原来的服务提供者项目microservice-student-provider-1001的基础上直接修改,首先修改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.yml里加上配置:
eureka:
instance:
#eureka客户端主机实例名称
hostname: localhost
#客户端服务名
appname: microservice-student
#客户端实例名称
instance-id: microservice-student:1001
#显示IP
prefer-ip-address: true
client:
service-url:
#把服务注册到eureka注册中心
defaultZone: http://localhost:2001/eureka
注:这里的defaultZone要和前面服务注册中心的暴露地址一致
最后在启动类加上一个注解@EnableEurekaClient:
然后测试下,先启动服务注册中心,再启动服务提供者,然后用浏览器访问http://localhost:2001,服务提供者成功注册截图如下:
这里有个问题,点击实例状态结果如下:
解决方案如下:
首先在服务提供者项目pom.xml里加入actuator监控依赖:
<!-- actuator监控引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在服务提供者项目application.yml加上info配置:
info:
groupId: com.ue.microservice
artifactId: microservice-student-provider-1001
version: 1.0-SNAPSHOT
负责人: Tom
联系电话: 123456
结果图如下: