一、开始
本文介绍Ribbon,我们需要去思考解决的问题:
- Ribbon是什么?
- Ribbon能干什么?
- Ribbon和nignx的区别?
- Ribbon实现负载均衡的策略?
- SpringCloud使用Ribbon实现负载均衡。
二、Ribbon是什么?
spring cloud ribbon 是一个基于HTTP 和 TCP 的客户端负载均衡
工具,它基于Netflix Ribbon 实现。通过Spring Cloud 的封装,可以轻松的将面向服务的REST模块请求自动转换为客户端负载均衡的服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器
。我们也很容易使用Ribbon实现自定义的负载均衡算法。后续要介绍的 Feign,它也是基于Ribbon实现的工具。
简之,Ribbon会获取Eureka Server上服务注册列表上的地址,然后在服务消费者本地上通过一定的策略规则去选择合适的地址,将请求发送到对应的服务提供者实例上,实现客户端的负载均衡。
三、Ribbon能干什么?
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。
常见的负载均衡有软件Nginx,LVS,硬件 F5等。
相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义。
服务端负载均衡LB
:即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方。
客户端负载均衡LB
: 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于客户端负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址
四、Ribbon和nginx的区别?
Ribbon客户端负载均衡:原理:在调用接口的时候,会在eureka注册中心上获取信息服务列表,获取到之后,缓存在jvm本地,通过一定策略选择服务实例,让你使用本地实现rpc远程调用技术进行调用,即是客户端实现负载均衡。
Nginx是服务端负载均衡,客户端将所有请求发送给nignx,然后再由nginx实现转发请求,即是负载均衡有服务端实现的。
应用场景:ribbon本地负载均衡适合微服务rpc远程调用,比如dubbo,springcloud。
nginx服务端负载均衡适合针对服务端,比如tomcat,jetty。
五、Ribbon实现负载均衡的策略
这个负载策略配置说白了就是让 Ribbon 这个客户端负载均衡器怎么进行访问服务提供者列表。是轮流访问?随机访问?权重?等。
默认为轮询策略。
六、SpringCloud使用Ribbon实现负载均衡
首先,我们需要去启动Eureka注册中心,启动两个不同端口的相同服务。
我们可以将服务通过maven install 导成jar包,然后通过命令行去启动两个服务。
java -jar springboot-java-0.0.1-SNAPSHOT.jar --server.port=9001
这样,就能看到这个服务有两个用例在提供
服务消费
新建个项目,pom.xml如下
4.0.0
org.springframework.boot
spring-boot-starter-parent
1.5.19.RELEASE
com.travis.java
springboot-java
0.0.1-SNAPSHOT
springboot-java
Demo project for Spring Boot
1.8
Edgware.SR5
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
我们可以看下jar包依赖,在eureka包中已经帮我们引用了ribbon包,所以我们引用eureka包后能直接使用ribbon
在application.properties和application.java配置好,使其能注册到eureka
application.properties
spring.application.name=eureka-consumer
server.port=9010
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
application
@EnableEurekaClient
@SpringBootApplication
public class SpringbootWebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
需要在application 将restTemplate 在spring容器上生成,不然会报找不到restTemplate的错。
接着直接可以通过restTemplate调用eureka上的服务。
@RestController
public class TestController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value="testConsumer",method=RequestMethod.GET)
public String testConsumer()
{
String url="http://eureka-client/getTest";
return restTemplate.getForEntity(url, String.class).getBody();
}
}
下面是eureka-client 项目上的getTest方法:
@RestController
public class TestController {
@Value("${server.port}")
private String serverport;
@RequestMapping("/getTest")
public String getTest()
{
return "我的端口号是:"+serverport;
}
}
启动注册中心,两个不同端口的eureka-client 服务,eureka-consumer服务作为消费者去调用eureka-client 服务。