最近写一个项目使用到了Spring Cloud技术,为了防止服务宕机所以服务层会被拆分很多的微服务,而服务之间也难免会进行交互,那么就会进行远程调用,而Spring Cloud中的远程调用方式有两种 Feign和Ribbon。就说一下两种的工作原理以及需要注意的点。
负载均衡
首先介绍一下什么是负载均衡:负载均衡是在微服务框架中必不可少的技术,因为通过负载均衡可以时间系统的高可用、集群扩容等功能。也可通过硬件设备以及软件来实现,硬件包括Array,软件有Ngnix等。
用户请求先到达负载均衡器(也相当于一个服务),负载均衡器根据负载均衡算法将请求转发到微服务。负载均衡算法有:轮训、随机、加权轮训、加权随机、地址哈希等方法,负载均衡器维护一份服务列表,根据负载均衡算法将请求转发到相应的微服务上,所以负载均衡可以为微服务集群分担请求,降低系统的压力。这样也保证了系统的高可用。
客户端负载均衡与服务端负载均衡的区别在于客户端要维护一份服务列表,微服务从注册中心获取服务列表,微服务(Robbin或Feign)根据负载均衡算法直接请求到具体的微服务,中间省去了负载均衡服务。
第一种 Ribbon
Ribbon是通过负载均衡的算法来完成远程调用。Spring Cloud引入Ribbon配合这restTemplate实现客户端负载均衡。需要在启动类定义好restTemlate交给Spring管理,就会用到@LoadBalanced注解。加上@LoadBalanced注解后,restTemplateLoadBalancerInterceptor拦截器,此拦截器中会通过RibbonLoadBalancerClient查询服务地址,可以在此类打断点观察每次调用的服务地址和端口。
第二种 Feign
Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。它比Ribbon功能更强大,使用起来也更为方便。用Feign时要在启动类加上@EnableFeignClients注解这样的话Spring会扫描标记了@FeignClient注解的接口,并声称此接口的代理对象。其次在带有@FeignClient注解的接口要声明指定的服务名称。这样Feign会根据服务名称去注册中心获取服务并通过负载均衡算法进行远程调用。
最后呢我们在使用SpringMVC的注解时需要注意:
1、feignClient接口 有参数在参数必须加@PathVariable(“XXX”)和@RequestParam(“XXX”)
2、feignClient返回值为复杂对象时其类型必须有无参构造函数。
当然了在java中远程调用的技术有很多,如:webservice、socket、rmi、Apache HttpClient、OkHttp等,互联网项目使用基于http的客户端较多,我使用的是OkHttp。因为OkHttp用起来更方便而且OkHttp的请求/响应API设计为流畅的构建器和不变性。它同时支持同步阻塞调用和带回调的异步调用。
OkHttp3官方文档介绍了它的4点优势:
HTTP/2支持允许对同一主机的所有请求共享一个socket。
连接池减少了请求延迟(如果HTTP/2不可用)。
透明GZIP压缩下载大小。
响应缓存完全避免了网络重复请求
以上就是我对Spring Cloud中的负载均衡的两种实现方式的简单介绍,以及远程调用技术的介绍,并且给出了在用Feign时需要注意的点。希望能给各位带来帮助!