一、euerka的基本知识
1. 服务治理
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,
管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,
可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2. 服务注册
Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。
这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息
比如:服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),
以该别名的方式去注册中心上获取到实际的服务通讯地址,
然后再实现本地RPC调用RPC远程调用框架核心设计思想:
在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。
在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
3. Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,
这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,
服务节点的信息可以在界面中直观看到。EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、
使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。
如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,
EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
二、euerka的Server端以及单机集群的相关配置
-
启动类
在启动类上添加注解:
@EnableEurekaServer // 标明该服务是euerka的一个服务注册中心 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) // 避免加载数据库报错
-
配置文件:使用yml配置文件
server: port: 7000 eureka: instance: hostname: eureka7000 # eureka服务端的实例名称 client: register-with-eureka: false # false表示不向注册中心注册自己。 fetch-registry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 service-url: # 集群配置,指向其他euerka defaultZone: http://eureka7001:7001/eureka/ # 单机配置 # defaultZone: http://eureka7000:7000/eureka/ # server: # 关闭自我保护机制,保证不可用服务被及时踢除 # enable-self-preservation: false # eviction-interval-timer-in-ms: 2000
三、euerka的client端以及单机集群的相关配置
-
启动类
@EnableEurekaClient // 标明将该服务注册到euerka注册中心
-
配置文件:yml配置文件
server:
port: 8000 # 端口号
spring:
application:
name: payment # 服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://127.0.0.1:3306/spring-cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root # 用户名
password: root # 密码
eureka:
client:
# 表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
# 单机版
# defaultZone: http://localhost:7000/eureka
# 集群版
defaultZone: http://eureka7000:7000/eureka,http://eureka7001:7001/eureka
instance:
instance-id: payment8000 # euerka注册中心中显示的实例名
# 访问路径可以显示IP地址
prefer-ip-address: true
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
#lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
#lease-expiration-duration-in-seconds: 2
mybatis-plus:
mapperLocations: classpath:com/kl/payment/mapper/xml/*.xml # 扫描xml文件
四、euerka的自我保护机制
当某些服务发送的心跳数没有按照设定的时间间隔正常返回时,euerka会触发自我保护机制。
开启保护机制的情况下euerka不会立即将对应的服务下线,而是认为该服务可能出现了例如网络延时
这样的问题,只要在到达强制下线的时间才会将服务正式下线。
默认心跳时间:30秒一次
默认强制下线时间:90秒
-
配置文件中的具体配置
eureka: instance: # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒) lease-renewal-interval-in-seconds: 1 # 可以根据具体场景进行修改 # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务 lease-expiration-duration-in-seconds: 10 # 可以根据具体场景进行修改
五、服务发现
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
-
主启动类
@EnableDiscoveryClient // 服务发现
-
需要用的到controller、service直接注入
@Autowired private DiscoveryClient discoveryClient;
// 调用例子 @GetMapping(value = "/payment/discovery") public Object discovery(){ List<String> services = discoveryClient.getServices(); for (String element : services) { System.out.println(element); } List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); for (ServiceInstance element : instances) { System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t" + element.getUri()); } return this.discoveryClient; }
六、 actuator微服务信息完善
-
主机名称:服务名称修改、访问信息有IP信息提示
eureka: instance: # 服务名称 instance-id: payment8000 # 访问路径可以显示IP地址 prefer-ip-address: true
-
服务健康检查
检查服务order
浏览器输入 http://IP:端口号/actuator/health,显示 status : "UP" 说明服务正常