文章目录
Ribbon简介
ribbon是一种客户端负载均衡工具
负载均衡是什么?
- 简单来说就是将用户的请求平摊的分配到多个服务商,从而达到系统的HA(高可用),nginx,LVS都是常见的负载均衡的工具
Ribbon客户端负载均衡和nginx服务端负载均衡的区别?
- nginx服务端负载均衡是客户端将请求提交到nginx,由nginx实现负载均衡(集中式负载均衡)
- ribbon客户端负载均衡是客户端本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表,然后在本地实现远程RPC的服务调用(进程内的负载均衡)
- 举例子就是去医院看病,nginx是别人安排你到某科的指定医生那里,ribbon是你自己去找到某科的医生
ribbon使用
新版本的eureka-client默认引入了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.1.RELEASE</version>
<scope>compile</scope>
</dependency>
即eureka客户端默认继承ribbon
在这里是基于订单和支付服务来的,支付服务是集群部署,2台集群
3台eureka服务端集群
payment1 yaml文件
server:
port: 8101
spring:
application:
name: payment8101
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/
payment2 yaml文件
server:
port: 8103
spring:
application:
name: payment8101
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/
也可以看到同一个服务名下两台集群
订单服务controller
@RestController
@Slf4j
@RequestMapping("/get")
public class OrderController {
public static final String URL = "PAYMENT8101";
@Autowired
public RestTemplate restTemplate;
@RequestMapping("/get")
public String create(){
return restTemplate.getForObject("http://" + URL + "/res/res",String.class);
}
}
restTemplate使用:
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@LoadBalanced:默认是轮询
从结果也可以看出:
负载均衡策略配置
负载均衡算法:
更改负载均衡策略:
自定义规则类必须跟主类同级,不能被主类的@ComponentScan扫到
规则类
@Configuration
public class MyRule {
@Bean
public IRule iRule(){
return new RandomRule();//随机选择
}
}
主启动类通过注解@RibbonClient声明选用的规则类
@SpringBootApplication
@EnableEurekaClient //声明自己是eureka客户端
@RibbonClient(configuration = MyRule.class)//声明选用的规则类
public class Order8102 {
public static void main(String[] args) {
SpringApplication.run(Order8102.class,args);
}
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}