Eureka 服务发现框架(服务治理)

Eureka是一个基于REST的服务,主要是用于定于运行在AWS域中的中间服务,以达到负载均衡和故障转移的目的。
Eureka是微服务框架中最核心和最基础的模块,它主要用来实现微服务实例的自动化注册与发现。
Eureka由2个部分组成:服务端发现组件 和 客户端发现组件。

SpringCloud服务治理_客户端负载均衡

注:
a.客户端通过注解的方式嵌入程序中,服务器和客户端之间会进行周期性心跳检测 , 如果心跳不存在时,
该服务节点会从服务注册表中移除。 (心跳检测在客户端配置)
b.各个服务节点 通过注册中心得注册信息以Rest方式来实现调用

Eureka的三种角色:服务注册中心、服务提供者、服务消费者(一个结点 既可以是服务提供者 、也可以是服务消费者)

SpringCloud服务治理_负载均衡_02

Eureka高可用注册中心

  • 单节点时注册中心不需要注册自己,但是高可用注册中心,节点要向出自己以外的服务中心进行注册
  • 不需要重新创建新项目 只要多配制application.properties 运行时 java -jar xxx.jar
    –spring.profiles.active=ek8761 (命令行配置优先级最高)

注册中心一

#设置端口号
server.port=8761
#设置Eureka的注册IP
eureka.instance.hostname=localhost
#指定客户端进行注册的IP地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8762/eureka/

注册中心二

#设置端口号
server.port=8762
#设置Eureka的注册IP
eureka.instance.hostname=localhost
#指定客户端进行注册的IP地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8761/eureka/

其他组件

#指定Eureka服务器 IP地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
#指定应用名称
spring.application.name=springcloud-eureka-client-user

Eureka客户端的实现

  • 启动类@EnableEurekaClient中的@EnableDiscoveryClient用来实现发现服务,帮助与Eureka
    Server相互协作
  • 客户端在加载过程中 首先会加载Region,接着会加载Zone,一个应用只有一个Region,但是可以有多个Zone(适用于跨机房、跨地区配置)
  • Ribbon的默认策略会优先访问通客户端处于一个Zone中的服务端实例,只有当同一个Zone中没有可用服务端实例才会访问其他Zone的实例
#设置Region
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
#设置Zone
eureka.client.availability-zones.localhost=http://localhost:8761/eureka/,http://localhost:8762/eureka/

Eureka框架与负载均衡

ribbon是一个基于HTTP和TCP的客户端负载均衡器,只使用ribbon时需要在客户端配置ribbonServerList服务端列表去轮询以达到负载均衡的作用。当与Eureka结合,扩展成从Eureka注册中心获取服务端列表。ribbon将确认服务端是否启动的职责委托给Eureka。
Eureka服务端中保存着所有的服务的实例清单,当新的客户端进行注册时,会从服务端获取该份清单。
微服务对请求进行负载均衡时,便会从该份清单中以某种轮询策略选取一个组价进行请求的处理。

我们通常所说的服务端负载均衡(硬件负载均衡和软件负载均衡)和客户端负载均衡的差异就在于这份清单的存储位置:
服务端负载均衡只有服务器保存该份清单(如nginx),而客户端负载均衡(ribbon)每一个客户端组件都保存完整的服务清单。
通过设置nginx.conf的服务器端负载均衡的弊端在于:
通过这种静态配置来维护这份清单会随着业务增加而越来越困难。而通过Eureka注册服务,服务的调用可以通过向服务名发起请求而实现。

RestTemplate
该对象会使用Ribbon的自动化配置,同时通过配置@LoadBalanced还能开启客户端负载均衡。
@LoadBalanced会使用拦截器的方式来实现其负载均衡,如getForEntity(url,body类型,参数) 会通过url从服务清单中获取服务节点

@Bean
@LoadBalanced RestTemplate restTemplate()
{
return new RestTemplate();
}

GET请求
请求指定的页面信息,并返回实体主体。
getForEntity(url,body类型,参数)
该方法返回的是ResponseEntity,该对象是Spring对Http请求响应的封装,它包括:http请求状态、请求头、请求体对象

#返回对象是String
ResponseEntity<String>responseEntity =restTemplate.getForEntity("http://springcloud-eureka-client-user/user?name={1}",String.class,"luo");
String body =responseEntity.getBody();

#传参方式Map 多个参数
Map map=new HashMap();
map.put("name","luo");
ResponseEntity<String>responseEntity =restTemplate.getForEntity("http://springcloud-eureka-client-user/user?name={name}",String.class,map);
String body =responseEntity.getBody();

#返回结果
#返回对象是实体类
ResponseEntity<User>responseEntity =restTemplate.getForEntity("http://springcloud-eureka-client-user/user?name={1}",String.class,"luo");
User body =responseEntity.getBody();

POST请求
向指定资源提交数据进行处理请求
postForEntity(url,参数,返回对象类型)

User user=new User("luo","18");
ResponseEntity<String>responseEntity =restTemplate.postForEntity("http://springcloud-eureka-client-user/user",user,String.class,);
String body =responseEntity.getBody();

PUT请求
只提交数据,不会返回结果

put(url,参数,序列号)

Long id=10001L
User user=new User("luo","18");
restTemplate.put("http://springcloud-eureka-client-user/user",user,id);

DELETE请求
请求服务器删除指定的页面
delete(url,序列号)

Long id=10001L
restTemplate.put("http://springcloud-eureka-client-user/user/{1}",id);

Spring Eureka保护机制、重试机制

Eureka保护机制
Eureka会在超过85%的实例失去心跳而出发保护机制,注册中心会保留此时的所有节点,以实现服务间依然可以相互调用的场景,即时其中有部分故障节点,但这样可以继续保障绝大数服务可以正常使用。

重试机制为了尽可能保障其请求的成功率要尽肯能恢复节点 。

#################重试机制配置##################
#请求处理的超时时间
ribbon.ReadTimeout=60000
#请求连接的超时时间
ribbon.ConnectTimeout=60000
#对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=true
#切换实例重试次数
ribbon.MaxAutoRetriesNextServer=2
#对当前实例的重试次数
ribbon.MaxAutoRetries=2

SpringCloud服务治理_Eureka_03