注册中心Eureka
文章目录
Eureka简介
SpringCloud 封装了Netflix 公司开发的Eureka模块来实现服务治理
提示:什么是服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
提示:什么是服务注册与发现
Eureka Server提供注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
一、Eureka整合
1.添加maven依赖
服务端:maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
客户端:maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.yml 配置文件
服务端:yml文件配置
server:
port: 7001
eureka:
instance:
#单点配置
hostname: localhost #eureka服务端的实例名称
client:
#false 表示不向注册中心注册自己
register-with-eureka: false
#fals e表示自己就是注册中心,职责是维护服务实例,不需要检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
客户端:将服务注册进Eureka ,在需要注册的服务配置文件中添加
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示IP地址
3.启动类
服务端:启动类添加Eureka 注释 @EnableEurekaServer
@EnableEurekaServer Eureka服务端
/**
* @EnableEurekaServer
* Eureka 注册服务中心
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
客户端:启动类添加Eureka 注释 @EnableEurekaClient
4.访问操作台
三、Eureka 集群
流程:
服务发现:从注册中心上获取服务信息—>实质:存key服务命令 取value调用地址
1、集群介绍
微服务RPC远程服务调用最核心的就是高可用
解决办法:搭建Eureka集群,实现负载均衡+故障容错
集群原理:互相注册,相互守望
2、集群搭建
注册中心配置文件:
server:
port: 7001
eureka:
instance:
#集群配置
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false 表示不向注册中心注册自己
register-with-eureka: false
#fals e表示自己就是注册中心,职责是维护服务实例,不需要检索服务
fetch-registry: false
service-url:
#集群搭建:注册到另一台Eureka Server
defaultZone: http://eureka7002.com:7002/eureka/
微服务配置文件:
配置文件
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver #mysql驱动包
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDateTimeCode=false&serverTimezone=GMT%2B8&useSSL=false
username: root
password: root1234
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
#集群版
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
#单机版
#defaultZone: http://localhost:7001/eureka
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示IP地址
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.lc.cloud #所有model所在包
3、访问服务台
http://localhost:7001
三、Eureka项目使用
1、负载均衡 @LoadBalanced
负载均衡作用:
Ribbon和Eureka整合后consumer可以直接调用服务而不在关系地址和端口号,而且该服务还有负载功能了。(默认是轮询)
@LoadBalanced注解:
使用 @LoadBalanced注解赋予RestTemplate负载均衡的能力
@Configuration
public class ApplicationContextConfig {
@Bean
//使用 @LoadBalanced注解赋予RestTemplate负载均衡的能力
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
通过微服务在Eureka上注册过的微服务名称调用
2、服务发现@EnableDiscoveryClient
@EnableDiscoveryClient注解
通过DiscoveryClient获得服务的信息
详细信息获得
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String info : services) {
log.info("******info:{}",info);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
四、Eureka自我保护机制
1、介绍
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不在删除服务注册表中的数据,也就是不会注销任何微服务
某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该服务信息进行保存。属于CAP里面的AP分支(高可用)
2、过程
默认情况下EurekaClient定时向Eurekaerver端发送心跳(默认30秒),如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送的心跳包,便会直接从服务注册表中剔除该服务,但是在短时间(90秒)内丢失大量服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务,该现象可能出现在如果网络不通但是EurekaClienr出现宕机,此时如果换做别的注册中心一定时间内没有收到心跳便会剔除该服务,这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延时问题,而保护机制是为了解决此问题而产生的。
宁可保存所有服务实例,也不会盲目注销任何健康的服务实例
3、使用
禁止自我保护机制:
修改配置文件:(默认是true开启状态)
eureka.server.enable-self-preservation: false
控制台关闭自我保护机制显示: