一 Ribbon 简介
Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为。在为 Ribbon 配置服务提供者列表后,Ribbon 就可以基于某种负载均衡算法,自动的帮助服务消费者去请求。 Ribbon 默认提供了很多的负载均衡算法,例如轮询,随机等,也可以自定义负载均衡算法。
在 Spring Cloud 中,当 Ribbon 个Eureka 配合使用时,Ribbon 可以自动从 Eureka Server 中获取服务提供者地址列表,并基于负载均衡算法,请求其中的一个满足需求的服务提供者实例。
Ribbon & Eureka
示例代码在 微服务注册与发现基础上添加
二 为服务消费者整合 Ribbon
- 在 microservice-consumer-movie 的基础上添加依赖
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version:'1.5.9.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client', version:'1.4.0.RELEASE'
- 在
RestTemplate
添加@LoadBalanced
注解
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieApplication.class, args);
}
}
当给RestTemplate
添加 @LoadBalanced
注解后,在使用 RestTemplate
时就会具备负载均衡的能力。
- 修改
Controller
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
}
其中 microservice-provider-user
为 虚拟主机名,当有其他服务注册到 Eureka Server
中,那么在发送请求时就会去注册列表中去找 application name
为 microservice-provider-user
的服务提供者,并映射其虚拟主机名对应的ip地址,如果注册的有多个相同的虚拟主机名,那么就会根据负载均衡算法返回其中一个服务提供者的ip。
3 测试
- 启动
microservice-discovery-eureka
- 启动多个
microservice-provider-user
- 启动
microservice-consumer-movie
- 访问
http:localhost:8761
,可见我们注册了三个services,一个 consumer,两个相同的 provider
- 当多次访问
http://localhost:8010/user/1
时,会轮询(默认方式)请求 注册到Eureka Server
中虚拟主机名为microservice-provider-user
中的一个。
三 脱离 Eureka 使用 Ribbon
如果我们没有使用 Eureka 或者甚至没能使用 Spring Cloud 的情况下,我们想要单独使用 Ribbon 的负载均衡功能。那么对于 consumer 端,可以将配置文件application.yml
修改为
server:
port: 8080
spring:
application:
name: microservice-consumer-movie
microservice-provider-user: ## 在 consumer 中使用调用的虚拟主机名称
ribbon:
listOfServers: localhost:8000, localhost:8001 ## 此处的域名为 providers 的列表
网友评论