简介
SpringCloud Ribbon 是一个客户端负载均衡器。当请求到达客户端后,客户端从注册中心拉取的服务列表中,根据制定的负载均衡策略来选择对应的目标服务发出请求。
可以理解为服务与服务之间的负载均衡作用,它只不过是处于客户端内。平时使用的Nginx是属于服务端软件的负载均衡器。
依赖
<!-- 使用nacos的话 自动会引入 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.9.RELEASE</version>
<scope>compile</scope>
</dependency>
配置调用服务的规则
这里使用简单的例子,订单服务(order-service)调用库存服务(stock-service)
订单服务
@RestController
@RequestMapping("order")
public class OrderController {
@Resource
RestTemplate restTemplate;
/**
* 添加订单
* @return
*/
@RequestMapping("add")
public String add() {
System.out.println("调用了添加订单功能...");
//执行远程减库存
String result = restTemplate.postForObject("http://stock-service/stock/minus", null, String.class);
return "成功添加订单,执行库存的结果:"+result;
}
}
@Configuration
public class WebConfig {
/**
* 创建restTemplate
* @param restTemplateBuilder
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.build();
}
}
库存服务
@RestController
@RequestMapping("stock")
public class StockController {
@Value("${server.port}")
private Integer port;
@PostMapping("minus")
public String minus() {
System.out.println(port+"端口调用了减库存....");
return "减库存成功";
}
}
使用注解@RibbonClients
- 创建好规则配置类
不要在这个配置上加任何注解,加@Configuration 的话就不能被ComponentScan扫描的包内创建这个类
/**
* 随机规则
*/
public class RibbonRandomRuleConfig {
@Bean
public IRule iRule() {
return new RandomRule();
}
}
- @RibbonClients
@SpringBootApplication
@EnableDiscoveryClient
@RibbonClients(value = {@RibbonClient(name="stock-service",configuration = {RibbonRandomRuleConfig.class})})
public class OrderNacosApp {
public static void main(String[] args) {
SpringApplication.run(OrderNacosApp.class, args);
}
}
测试效果
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8201端口调用了减库存....
8201端口调用了减库存....
application.yml配置规则类
stock-service: #服务名
ribbon:
NFLoadBalancerRuleClassName: com.gaby.cloud.order.config.ribbon.RibbonRoundRuleConfig #配置类的全路径
/**
*@Description 轮询
*@Date 2021/12/14 11:06
*@Version
*/
@Configuration
public class RibbonRoundRuleConfig {
@Bean
public IRule iRule() {
return new RoundRobinRule();
}
}
测试效果
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8200端口调用了减库存....
8201端口调用了减库存....
8201端口调用了减库存....
8201端口调用了减库存....
8201端口调用了减库存....
8201端口调用了减库存....