springCloud笔记
Spring Cloud OpenFeign解释
1. 两个重要的标注
@FeignClient :标注用于声明Feign客户端可访问的web服务
参数:
1.nam
2.qualifier
3.url,
4.decode404,
5.configuration,
6.fallback(默认void.class),
7.fallbackFactory(默认void.class),
8.path
@EnableFeignClients :标识用于修饰spring boot应用的入口类,通知spring boot应用启动时扫描应用中声明的Feign客户端可访问的Web服务。
参数:
feignContract: SpringMvcContract
feignDecoder: ResponseEntityDecoder
feignEncoder: SpringEncoder
feignLogger: Slf4jLogger
feignBuilder: Feign.Builder
feignClient: LoadBalancerFeignClient(开启Ribbon时)或默认的HttpURLConnection
Springcloud的服务发现框架 --Eureka
它是基于REST(代表性状态转移)的服务,主要在AWS云中用于定位服务,已实现负载均衡和中间层服务器的故障转移。我们称次为Eureka服务器,他还有一个基于java的客户端组件Eureka Client,使与服务的交互变得更加容易。客户端还有一个内置的负载平衡器,可以执行基本的循环负载平衡。
服务发现:相当于房东中介和租客 , 租房。。等一系列的流程
服务提供者;提供一些自己能够给执行的一些服务给外界,相当于房东
服务消费者:就是需要使用一些服务的用户,相当于租客
服务中介:服务提供者可以吧自己注册到服务中介那里,而服务消费者如需要消费一些服务,就可以去服务中介中寻找注册在服务中介的服务提供者
服务注册 Register
当Eureka客户端向Eureka Server注册时,它提供自身的元数据比如ip,端口,运行状况指示符url,主页等。(房东去中介那里提供房屋信息)
服务续约 Renew
Eureka客户会每隔30秒(默认)发送一次心跳来续约。通过续约来告知EurekaServer该Eureka客户仍然存在,没有问题,正常情况下,如果EurekaServer在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。(房东定期告诉中介,我的房子还租,中介收到后继续保留房屋信息)
获取注册列表信息 Fetch Registries
Eureka客户端从服务器获取注册表信息,并将其缓存在本地。客户端每次会使用该信息查找其他服务,从而远程调用。该注册表每30秒更新一次(默认)。每次返回可能都跟本地缓存不一样,Eureka客户端自动处理。如果因某原因导致注册列表信息不能及时匹配,Eureka客户端则会重新获取整个注册表信息。默认情况下Eureka客户端使用压缩JSON格式来获取注册列表的信息。(租客去中介那里获取所有房源,租客为了获取最新的信息,会定期向中介那里获取并更新本地列表)
服务下线 Cancel
Eureka客户端在程序关闭时向Eureka服务器发送取消请求。发送之后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,需要调用
DiscoveryManager.getInstance().shutdownComponent();
(房东告诉中介我的房子不租了,中介就将注册的房屋从房屋信息下架)
负载均衡之Ribbon
什么是RestTemplate?
RestTemplate是spring提供的一个访问Http服务的客户端类(微服务之间的调用使用的是RestTemplate)。Eureka框架中的注册、续约等,底层使用的都是RestTemplate
为什么需要Ribbon?
是Netflix公司的一个开源均衡负载的项目,是一个客户端/进程内负载均衡器,运行在消费端。
其工作原理就是客户端获取到所有服务器列表后,在其内部使用负载均衡算法,进行对多个系统的调用。
Nginx和Ribbon的对比
Nginx是一种集中式的负载均衡器,接收所有请求进行负载均衡
Ribbon是消费者端进行的负载均衡。
Ribbon负载均衡算法
Nginx使用的是轮询加权轮询算法,ribbon默认使用的是轮询策略
RoundRobinRule:轮询策略
RandomRule:随机策略
RetryRule:重试策略
Ribbon与Feign的区别?
Ribbon使用RestTemplate调用远程服务对应的方法
Feign提供方提供对外接口,调用方使用 在接口上使用@FeignClinet(“指定服务名”)
区别:
相同:都是调用其他服务的,不过方式不同
不同:
1. 启动类使用注解不同,Ribbon使用的是@RibbonClient,Feign使用的是@enableFeignClients
2. 服务的指定位置不同,Ribbon是在@RibbonClient主街上声明,Feign则是定义抽象方法接口上的
3. 调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤繁琐,Feign则是在Ribbon的基础上改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求,不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。