Eureka服务治理
Eureka服务治理
1、什么是服务治理?
SpringCloud 封装了Netflit公司开发的Eureka模块来实现服务治理;在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错、实现服务的发现与注册。
2、什么是服务的注册与发现?
Eureka采用了CS的设计架构,Eureka Server 作为服务注册的服务器,他是服务的注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接,这样系统的维护人员就可以通过Eureka Server来监控系统中的各个服务是否运行正常。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把自己的服务器信息 比如服务地址、通讯地址等以别名的方式注册到注册中心上,另一方(消费|服务提供者),以改别名的方式去注册中心上获取到实际的服务通讯地址,然后在实现本地RPC调用RPC远端调用,框架的核心思想:在于注册中心,因为使用注册中心管理每一个服务与服务的依赖关系(服务治概念),在任何的rpc远程框架中,都会有一个注册中心(存放服务地址信息(接口地址))
3、Eureka 简介
Eureka包含两个组件:Eureka Server(eureka服务端) 和 Eureka Client (eureka客户端)。
4、Eureka Server: 提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有服务节点的信息,服务节点的信息可以直接在界面中直观看到。
1、maven依赖:
<dependency>
<groupId>org.springframework.cloud<groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、在启动类上添加 @EnableEurekaServer 注解来启用Euerka注册中心功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3、yml配置:
server:
port: 7001
eureka:
instance:
# eureka 服务端的实例名称(服务器Ip)
hostname: eureka7001.com
client:
# false 表示不向注册中心注册自己
register-with-eureka: false
#false 表示自己端就是注册中心,我的职责就是维护实例,并不需要去检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
# 1: 单机就是自己
defaultZone: http://eureka7001.com:7001/eureka/
# 集群就是指向其他的Eureka
# defaultZone: http://eureka7002.com:7002/eureka/
# @@@@【关闭自我保护机制】@@@###########################################################
# server:
# # 关闭自我保护机制,保证不可用服务及时被踢出
# enable-self-preservation: false
# # 服务不可用时2秒提出
# eviction-interval-timer-in-ms: 2000
4、运行完成后访问地址http://localhost:7001/可以看到Eureka注册中心的界面。
5、Eureka Client 注册自己到 eureka server
Eureka client是一个java客户端,用于简化Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期30秒)。如果Eureka Server 在多个心跳周期内没有接受到某个节点的心跳, EurekaServer将会从服务注册表中移除节点(默认90秒)
1、Maven依赖:
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、在启动类上添加 @EnableDiscoveryClient 注解表明是一个Eureka客户端
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
3、yml配置
server:
port: 8001
eureka:
client:
# 表示是否将自己注册进Eureka Server 默认为true
register-with-eureka: true
# 是否从EurekaServer 抓取已有的注册信息,默认为true。单节点为所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
# 注册中心地址
service-url:
# 单机版注册地址
# defaultZone: http://localhost:7001/eureka
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
# 实例ID
instance:
instance-id: payment8001
# 访问路径可以显示IP地址
prefer-ip-address: true
# Eureka 客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
# lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后的等待时间上线,单位为秒(默认是90秒),超时将剔除服务
# lease-expiration-duration-in-seconds: 2
spring:
application:
name: cloud-payment-service
instance-id: xxx-server:${spring.cloud.client.ip-address}:${server.port}
6、搭建集群的Eureka注册中心,实现负载均衡加容错。
由于所有服务都会注册到注册中心去,服务之间的调用都是通过从注册中心获取的服务列表来调用,注册中心一旦宕机,所有服务调用都会出现问题。所以我们需要多个注册中心组成集群来提供服务,下面将搭建一个双节点的注册中心集群。
EurekaServer集群原理:互相注册,相互守望。
单机集群配置:
找到C:\Windows\System32\drivers\etc\hosts文件:
修改映射配置加入hosts文件中:
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
集群修改yml注册中心地址:7001指向7002, 7002指向7001
server:
port: 7001
eureka:
instance:
# eureka 服务端的实例名称
hostname: eureka7001.com
client:
# false 表示不向注册中心注册自己
register-with-eureka: false
#false 表示自己端就是注册中心,我的职责就是维护实例,并不需要去检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/
server:
port: 7002
eureka:
instance:
# eureka 服务端的实例名称
hostname: eureka7002.com
client:
# false 表示不向注册中心注册自己
register-with-eureka: false
#false 表示自己端就是注册中心,我的职责就是维护实例,并不需要去检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
7、项目启动注意:
应该先启动服务注册中心(7001、7002),然后再去启动服务提供者与服务消费者
8、通过接口显示注册中心的注册信息:
启动类上添加: @EnableDiscoveryClient
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("********service: " + service);
}
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;
}
9、Eureka的常用配置
eureka:
client: #eureka客户端配置
register-with-eureka: true #是否将自己注册到eureka服务端上去
fetch-registry: true #是否获取eureka服务端上注册的服务列表
service-url:
defaultZone: http://localhost:8001/eureka/ # 指定注册中心地址
enabled: true # 启用eureka客户端
registry-fetch-interval-seconds: 30 #定义去eureka服务端获取服务列表的时间间隔
instance: #eureka客户端实例配置
lease-renewal-interval-in-seconds: 30 #定义服务多久去注册中心续约
lease-expiration-duration-in-seconds: 90 #定义服务多久不去续约认为服务失效
metadata-map:
zone: jiangsu #所在区域
hostname: localhost #服务主机名称
prefer-ip-address: false #是否优先使用ip来作为主机名
server: #eureka服务端配置
enable-self-preservation: false #关闭eureka服务端的保护机制
10、Eureka服务手动上下线
eureka 服务下线
curl -X PUT "http://ip:port/eureka/apps/{application}/{instance}/status?value=OUT_OF_SERVICE"
其中:
application: 服务名称。
instance: 需要下线的实例名称
示例:
https://192.168.248.5/eureka/apps/PROPERTY-PROJECT/192.168.230.1:8386/status?value=OUT_OF_SERVICE
eureka 服务上线
curl -X PUT "http://ip:port/eureka/apps/{application}/{instance}/status?value=UP"
示例:
https://192.168.248.5/eureka/apps/PROPERTY-PROJECT/192.168.230.1:8386/status?value=UP