eureka服务治理的基础架构包含三个要素:
eureka提供服务端,提供服务的注册与发现功能。
注:在配置注册中心时,记得避免注册中心向自己注册,需要在配置文件中添加:
eureka.client.register-with-eureka=false(这个是避免eureka向自己进行注册)
eureka.client.fetch-registry=false(这个是避免eureka查找服务列表)
提供服务的应用,可以是springboot应用,也可以是其他技术平台且遵循Eureka通信机制的应用,可以将自己的服务注册到Eureka上。
消费者应用从服务注册中心获取服务列表,从而使消费者知道去哪调用所需要的服务。
“服务提供者”在启动的时候会发送REST请求将自己注册到Eureka Server上,并带上一些元信息。
Eureka Server接收到REST请求,将元信息存储在一个双层Map中,第一层key是服务名,第二层key是具体服务的实例名。
注:在服务注册时,需要确认一下eureka.client.register-with-eureka=true是否正确,如果为false是禁止向Eureka Server注册的。
在注册完成后。服务提供者会维护一个心跳告诉注册中心服务政策,防止注册中心剔除服务,该过程称为服务续约。
eureka.instance.lease-renewal-interval-in-seconds参数用于定义:服务续约任务的调用间隔时间,默认30s。
eureka.instance.lease-expiration-duration-in-seconds参数用于定义:服务失效时间,默认30s。
启动服务消费者后,会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。
Eureka Server会维护一份只读清单返回给消费者客户端,该缓存清单30s更新一次。
注:在服务获取时,确定eureka.client.fetch-registry=true,设置成false,服务客户端不会再向注册中心发送请求。
缓存清单的时间配置:eureka.client.registry-fetch-internal-seconds=30s
消费者获取服务清单后,可以通过服务名获取到具体服务实例与实例的元数据信息。在Ribbon中默认采用轮询的方式进行调用,从而实现负载均衡。
当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server。注册中心接收到请求后,将该服务状态置为DOWN,并把下线时间传播出去。
不同的服务提供者分别注册到了一个注册中心集群上的不同的注册中心上。他们的信息被不同的注册中心维护。
由于在集群中,一个注册中心互为其他注册中心的服务,当服务提供者请求到一个服务注册中心后,它会将请求转发到其他服务注册中心,实现注册中心之间的服务同步。
通过服务同步,服务提供者的服务信息可以通过集群中的任何一个注册中心获取。
Eureka Server启动时会创建定时任务,默认60s一次,将当前清单中超时(90s)没有续约的服务剔除。
本地调试Eureka的程序时,会出现:
该警告是触发了Eureka Server的自我保护机制。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果低于,就会将当前实例注册信息保护起来,让实例不会过期,尽可能保护这些注册信息。
但是如果在保护期间,实例出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败。这个时候客户端的容错机制就很重要了。(重新请求,断路器)
保护机制,可能会导致服务实例不能够被正确剔除。
在本地开发时,可使用:eureka.server.enable-self-preservation=false关闭保护机制,使不可用实例能够正常下线。
Ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等。
使用RestTemplate进行Eureka Client(包括服务提供者以及服务消费者,在这里其实是服务消费者使用RestTemplate)之间的通信,为RestTemplate配置类添加@LoadBalanced注解即可,如下所示:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
主程序:
@SpringBootApplication
@EnableEurekaClient
//在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
@RibbonClient(name="MICROSERVICECLOUD-DEPT")
public class DeptConsumer80_App{
public static void main(String[] args){
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
默认的是RoundBobinRule(轮询)
RetryRule(重试)
1、先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
2、如多次获取某个服务失败,则不会再次获取该服务(如高德地图上某条道路堵车,司机不会走那条道路)
Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装json 数据的繁琐。Feign集成了Ribbon。Ribbon+eureka是面向微服务编程,而Feign是面向接口编程。
接口+注解(一般在公共接口中定义,方面其他微服务调用)
@FeignClient(value = "MICROSERVICECLOUD-DEPT") //该接口对应于应用id为MICROSERVICECLOUD-DEPT的微服务
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/dept/list",method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/dept/add",method = RequestMethod.POST)
public boolean add(Dept dept);
}
与ribbon类似
@FeignClient(value = "YunCai-SearchServer", fallback=ServiceHystrix.class)
public interface SchedualServiceHi {
@RequestMapping(value = "/luke/itemsearch",method = RequestMethod.GET)
ResponseMap sayHiFromClientOne(@RequestParam(value = "start") Integer start,
@RequestParam(value = "rows") Integer rows,
@RequestParam(value = "tenantId") Integer tenantId,
@RequestParam(value = "status") Integer status,
@RequestParam(value = "key") String key);
}
@Component
public class ServiceHystrix implements SchedualServiceHi {
@Override
public ResponseMap sayHiFromClientOne(Integer start, Integer rows, Integer tenantId, Integer status, String key) {
SearchResult result = new SearchResult(0, new ArrayList<>(Arrays.asList(1L,2L,3L)));
return new ResponseMap(false, "111", 506, result);
}
}
hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能。
使用场景:
比如双十一买东西出现,哎哟喂,被挤爆了。app秒杀某个商品提示网络开小差,请稍后再试。
为每一个hystrixCommand提供一个线程池,自动实现了依赖隔离,即使线程池满了也不会影响其他进程。
(1)服务在高并发的情况下出现进程阻塞,导致当前线程不可用,慢慢的全部线程阻塞 ,导致服务器雪崩。这时直接熔断整个服务,而不是一直等到服务器超时。
(2)断路器全开时:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象 断路器完全打开 那么下次请求就不会请求到该服务
半开:短时间内 有恢复迹象 断路器会将部分请求发给该服务,正常调用时 断路器关闭
关闭:当服务一直处于正常状态 能正常调用
Zuul相当于是第三方调用(app应用端和PC端)和服务提供方之间的防护门。作为前端服务(Edge Service也称边缘服务,前端服务的作用是对后端服务做必要的聚合和裁剪后暴露给外部不同的设备,如PC,Pad或者Phone),Zuul旨在实现动态路由,监控,弹性和安全性。它具备根据需求将请求路由到多个AWS自动弹性伸缩组的能力。
类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块
filterType:过滤器的类型.
pre:可以在请求被路由之前调用
route:在路由请求时候被调用
post:在route和error过滤器之后被调用
error:处理请求时发生错误时被调用
spring cloud config是一个基于http协议的远程配置实现方式。通过统一的配置管理服务器进行配置管理,客户端通过https协议主动的拉取服务的的配置信息,完成配置获取