EurekaServer:服务注册功能的服务器,是服务的注册中心,系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接,系统的维护人员可以通过Eureka Server来监控系统中各个微服务是否正常运行,
Eureka Server注册中心需要引入Eureka Server的jar
在注册中心中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
Eureka Server注册中心yml配置
eureka:
instance:
hostname: localhost #eureka服务端的实例名字
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护实例,不需要去检索实例
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动配置中心服务后访问localhost:7001会有如下界面
但此时并没有服务注册在Eureka上面,下面将一个微服务添加到Eureka的中策中心上
将一个服务添加到Eureka注册中心上
① 在微服务的pom上引入Eureka Client的jar包依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
②在微服务的yml文件上填写EurekaClient的相关配置
eureka:
client:
register-with-eureka: true #表示是否将自己注册进EurekaServer 默认是true
fetch-registry: true #是否从EurekaServer抓取已有的注册信息,默认true.单节点无所谓,集群必须设置true才能配合ribbon使用负载均衡
service-url:
defaultZone: http://localhost:7001/eureka #表示注册在这个地址的注册中心上
③别忘了在微服务的启动类上添加@EnableEurekaClient
注解哈
启动服务注册中心和刚才配好的微服务,访问注册中心地址:localhost:7001,就会发现页上发现了刚刚配置好的服务名字了
以上就是单机版的Eureka注册与发现的配置
配置Eureka集群
EurekaServer的集群配置实际上就是将多个Eureka相互注册
和上面的单机版配置差不多,只是需要注意注意Eureka的服务端名字不能重复
在新建一个EurekaServer,yml文件的配置如下:
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护实例,不需要去检索实例
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
defaultZone: http://eureka7001.com:7001/eureka/
向Eureka Server集群中添加微服务,只需将需要添加的服务yml配置文件中的注册地址增加EurekaServer的地址即可:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #将服务注册到eureka集群
这样这个服务就会注册到EurekaServer的集群中了
至此,服务注册中心集群已经有多个了,一般实际中不可能两三个EurekaServer全都挂吧,已经满足使用要求了,上面我们将服务提供注册到集群,但是也要设想一下,万一服务提供者挂了怎么办?所以有必要将服务提供者也设计成集群的模式.
将服务提供者设置成集群(多个)
只需将服务提供者再复制一份即可,但要注意改端口号
多个服务提供者注册到EurekaServer集群中,为消费者提供服务,对外暴露的是相同的服务名称,消费者根据服务者提供的服务名称进行访问.至于访问的是哪个具体服务,需要有负载均衡机制来决定(默认的负载均衡是轮询机制).所以需要在消费者端添加负载均衡注解;并且消费者访问的也不在是具体的服务地址和端口号了,而应该改成具体的服务名称;
此时,在访问的话,会是轮询的方式访问服务提供者
有时为了方便管理,我们可能需要定义主机名字.以及让访问路径显示ip地址
可以通过配置yml文件中添加如下内容
eureka:
instance:
instance-id: payemnt8002 #自定义的主机名
prefer-ip-address: true #访问路径可以显示ip地址
上面的操作还需要在pom中添加
<!--spring-boot-starter-web和spring-boot-starter-actuato这两个几乎永远在一起,图形化界面用的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
服务发现Discovery
服务发现:对于注册进Eureka里面的微服务,可以通过服务发现来获得该服务的信息
①在启动类上添加@DiscoveryClient
②通过DiscoveryClient 获得相关信息,例如:
@Resource
private DiscoveryClient discoveryClient;
public Object discover(){
List<String> services = discoveryClient.getServices();//得到服务清单列表
for (String element:services
) {
log.info("**********element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for(ServiceInstance instance:instances){
log.info(instance.getInstanceId()+"\t"+instance.getUri()+"\t"+instance.getPort());
}
return this.discoveryClient;
}
Eureka的自我保护机制
保护模式主要用于一组客户端和EurekaServer之间存在网络分区场景下的保护.一旦进入保护模式,EurekaServer将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务.