SpringCloud微服务_1 Ribbon实现客户端负载均衡

               SpringCloud微服务_1 Ribbon实现客户端负载均衡

                                                                                                                            作者:田超凡

版权所有,转载请注明原作者,仿冒侵权必究法律责任

1 Ribbon+LoadBalance基本概念和实现原理        

在客户端采用轮询的机制从注册中心基于REST传输机制(HTTP+JSON)一次性获取所有已经注册的服务列表并封装为Map返回到客户端HTTP线程池中,由于ribbon采用的是LocalThread和线程池的机制,所有客户端加载的注册中心服务列表每个服务都存在不同线程池中,线程池和线程池完全舱壁,基于LocalThread共享注册中心公共资源,但是对于每个服务所占用的线程数量却是相互隔离的,确保微服务架构的弹性和容灾性(当然这只是一种基本的保护机制,主要的微服务容灾处理和事件响应定时渲染机制以及可伸缩性的保障需要结合Hystrix熔断器使用,后期再专门针对Hystrix熔断机制和容灾防护实现原理做相关补充说明),ribbon在客户端轮询到的服务列表会根据url中的serviceid进行解析,解析成serviceid对应的主机和端口号,然后就可以基于REST传输机制进行服务调用,这是基本原理。


       再来说下实现,首先引入starter依赖,然后在Spring ioc配置类中注册RestTemplate组件,使用LoadBalanced标注RestTemplate,表示对RestTemplate调用机制采用ribbon,然后在需要调用服务的地方注入RestTemplate,RestTemplate封装了各类针对不同请求方式的调用方法,总的来说按调用服务返回类型分为2种,一种是直接显式指定调用服务接口返回类型并接收对应类型数据,一种是统一返回spring-web内置的ResponseEntity,这是一个泛型类,封装了HTTP请求头,请求体,响应头,响应体,请求类型,状态响应码等HTTP协议请求响应机制基本信息。当然了,这样对于跨服务参数传递还是不太方便,尤其是提供者定义的服务接口中的方法参数形态各异的情况。没关系,这一点RestTemplate早都帮我们考虑到了,提供了通用的基于豪猪Hystrix的通用断路方法exchange,可以直接以参数的形式一次性指定请求url,请求方式,请求参数(HttpEntity泛型包装机制,构造注入参数和HttpHeaders请求头),返回类型。是不是一下子全都搞定了!当然了,这个方法也有一个瓶颈,就是返回值都是ResponseEntity,不过也可以理解,毕竟面相层级不同,如果说Object所有子类都是一圈,那么ResponseEntity强大泛型也是一圈,对于响应数据类型的灵活性来说,当然是ResponseEntity更胜一筹,springcloud官方推荐的方法自然也是exchange了,不然豪猪的意义根本体现不来。由于ResponseEntity在原始架构中的作用基本是作为通用层的控制器处理方法响应模型类,通用层数据响应模型的规范性和重要性肯定是不言而喻的,毕竟随着架构升级演变,ResultT站到最后。再说一下关于ribbon和nginx的区别,ribbon是客户端负载均衡,nginx是服务器端负载均衡,就功能完整性来说,肯定是nginx功能更加完善,因为nginx除了负载均衡还有反向代理等功能,但是请记住nginx永远只作用在服务器端,而且要进行大量复杂的配置和搭建集群,不然服务器一旦出现问题,nginx就手足无措了,并且nginx安装使用过的都知道,太重!这和SpringBoot提倡的微型和轻便完全是大相径庭,所以在SpringBoot2.0到来之后,也就是SpringCloud微服务框架问世之后,nginx的地位被逐渐缩小,SpringBoot和SpringCloud也就把他趋之门外了。同时,ribbon得到了广泛的支持,无论是配置的灵活性还是体型的轻量级都做到了极致,在客户端负载均衡调度器角色上愈演愈烈。


2 Feign实现声明式负载均衡服务调度器

        对于服务调用方式,其实除了ribbon还有一个声明式的客户端负载均衡调度器feign,相比较对于服务之间依赖关系比较复杂和服务接口数量庞大的微服务体系中,使用声明式调度器feign的频率更高,因为feign调用机制底层实际上还是基于ribbon实现的,但是feign针对请求信息的组装机制更加灵活,可以把需要调用的服务的所有方法统一定义在一个接口中,基于FeignClient注解指定需要调用的服务提供者,基于各类Mapping注解标注接口方法,feign会基于JDK动态代理机制扫描所有EnableFeignClients注解中指定的基准包及其子包中的所有FeignClient映射接口并注册动态代理实例,根据接口中方法的签名和服务提供者信息自动构建请求信息并调用对应服务提供者中和Feign映射接口对应方法签名相同的方法执行,在视图层控制器就可以直接注入Feign映射接口并调用接口中的方法实现服务调用,Feign优点就是服务调用方式更加灵活,由于把需要调用的服务方法封装成了接口,所以对于请求服务信息的组装更加灵活,同时对于需要调用的服务提供者数量比较多和微服务之间关系比较复杂的情况下,Feign的调用关系清晰,这样做的好处就是,当服务提供者信息出现变动,只需要改动消费者的Feign映射接口部分声明信息即可,如果是使用传统ribbon原始方式调用服务,每次调用的url都是显式指定了的,如果调用次数很多改动量可想而知,间接破坏微服务架构的弹性和伸缩性。Feign还提供了服务降级机制实现高可用提高伸缩性,具体的服务降级机制实现和高可用实现原理放到后续Hystrix总结再来细说。综上所述,所以在客户端负载均衡调用机制的临床运用中,Feign调用机制更为常用。

发布了100 篇原创文章 · 获赞 10 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_30056341/article/details/105489598
今日推荐