spring boot 负载均衡Ribbon
git地址
https://github.com/a18792721831/studySpringCloud.git
1. RestTemplate简介
RestTemplate 是 Spring Resources 中一个访问第三方RESTful API 接口的网络请求框架。RestTemplate 的设计原则和其他 Spring Template(例如JdbcTemplate、JmsTemplate)类似,都是为执行复杂任务提供了一个具有默认行为的简单方法。
RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 的主要方法都与REST的 Http协议的一些方法紧密相连,例如 HEAD、GET、POST、PUT、DELETE和 OPTIONS 等方法,这些方法在 RestTemplate 类对应的方法为 headForHeaders()、getForObject()、postForObject()、put()和delete()等。
我们在写测试方法时用到的TestRestTemplate
就是用RestTemplate实现的
2. Ribbon简介
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如Ngnix。另一种是将负载均衡逻辑以代码的形式封装到服务消费者的客户端上,服务消费者客户端维护了一份服务提供者的信息列表,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
Ribbon是 Netflix 公司开源的一个负载均衡的组件,它属于上述的第二种方式,是将负载均衡逻辑封装在客户端中,并且运行在客户端的进程里。Ribbon是一个经过了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的负载均衡行为。
在Spring Cloud 构建的微服务系统中,Ribbon作为服务消费者的负载均衡器,有两种使用方式,一种是和RestTemplate相结合,另一种是和 Feign相结合。
Ribbon有很多子模块,但很多模块没有用于生产环境,目前Netilix 公司用于生产环境的Ribbon子模块如下。
- ribbon-loadbalancer:可以独立使用或与其他模块一起使用的负载均衡器API。
- ribbon-cureka:Ribbon 结合 Eureka 客户端的API,为负载均衡器提供动态服务注册列
表信息。 - ribbon-core:Ribbon的核心API。
不知是否还有人维护?
积累了140多个issues没人处理
3. 实例–使用RestTemplate和Ribbon消费服务
3.1 启动eureka server
3.2 多实例启动eureka client
3.3 验证eureka
3.4 创建 Ribbon模块
项目结构
3.5 配置
3.6 创建Ribbon Config类
只需要在程序的IoC容器中注入一个restTemplate的Bean,并在这个Bean上加上@LoadBalanced注解,此时RestTemplate就结合Ribbon开启了负载均衡。(为什么?负载均衡策略有哪些?存疑)
3.7 创建service
3.8 service test
结果
默认是轮询策略。
3.9 创建controller
3.10 controller test
结果
3.11 启动
访问
4. LoadBalancerClent
负载均衡器的核心类为LoadBalancerClient,它可以获取负载均衡的服务提供者的实例信息。
我们上述的项目基础上,在创建一个模块。
如下配置
写一个controller
打上断点,调试启动。
不要忘记这里:
查看choose方法
这里getserver,打上断点,继续。
首先看getLoadBalancer
进入打断点
接下来
getLoadBalancer
通过反射,获取IClientConfig.
接下来是
loadBalancer有什么?
从上述图片看出,本次请求应该是8764
看下allServers
是个接口,其实现有
有四个实现类,本次使用从调试信息看是使用第二个实现类。猜测这里应该是不同的策略。
5. 本地serverList
在4的基础上进行修改:
设置不连接eureka server
且定义stores,这个stores就是我们之前的eureka-client 的url
接着修改controller
然后运行:
这里的list就是我们配置的本地的list