一、Ribbon是什么?
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。
二、4种方式使用Ribbon
①使用注解@loadBalanced
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、application启动类
/**
* @author liangshaofeng
*/
@SpringBootApplication
public class ConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieApplication.class, args);
}
}
3、controller
/**
* @author liangshaofeng
*/
@RequestMapping("/movies")
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/users/{id}")
public User findById(@PathVariable Long id) {
// 这里用到了RestTemplate的占位符能力
User user = this.restTemplate.getForObject(
"http://microservice-provider-user/users/{id}",
User.class,
id
);
// ...电影微服务的业务...
return user;
}
}
4、启动提供者多个相同名服务类,ribbon的服务
这样就起到负载均衡的效果
②通过配置java文件实现
1、@Configuration配置类
/**
* 使用RibbonClient,为特定的目标服务自定义配置。
* 使用@RibbonClient的configuration属性,指定Ribbon的配置类。
* 可参考的示例:
* http://spring.io/guides/gs/client-side-load-balancing/
*
* @author 梁少锋
*/
@Configuration
@RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class)
public class TestConfiguration {
}
/**
* 该类为Ribbon的配置类
* 注意:该类不能放在主应用程序上下文@ComponentScan所扫描的包中,否则配置将会被所有Ribbon Client共享。
* @author 梁少锋
*/
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则,改为随机
return new RandomRule();
}
}
2、application启动类
/**
* @author liangshaofeng
*/
@SpringBootApplication
public class ConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieApplication.class, args);
}
}
3、controller
/**
* @author liangshaofeng
*/
@RequestMapping("/movies")
@RestController
public class MovieController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/users/{id}")
public User findById(@PathVariable Long id) {
// 这里用到了RestTemplate的占位符能力
User user = this.restTemplate.getForObject(
"http://microservice-provider-user/users/{id}",
User.class,
id
);
// ...电影微服务的业务...
return user;
}
}
③通过yml配置
1、同上controller,application
2、yml
server:
port: 8010
spring:
application:
# 指定注册到eureka server上的服务名称
name: microservice-consumer-movie
eureka:
client:
service-url:
# 指定eureka server通信地址,注意/eureka/小尾巴不能少
defaultZone: http://localhost:8761/eureka/
instance:
# 是否注册IP到eureka server,如不指定或设为false,那就会注册主机名到eureka server
prefer-ip-address: true
microservice-provider-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
④Ribbon和Hystrix结合使用
1、application启动类
/**
* @author liangshaofeng
*/
@SpringBootApplication
@EnableCircuitBreaker //启动断路器 配置本应用将使用服务注册和服务发现
public class ConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerMovieApplication.class, args);
}
}
2、controller
/**
* @author liangshaofeng
*/
@RequestMapping("/movies")
@RestController
@Slf4j
public class MovieController {
@Autowired
private RestTemplate restTemplate;
//此注解表示此方法是hystrix方法,其中fallbackMethod定义回退方法的名称
@HystrixCommand(fallbackMethod = "findByIdFallback")
@GetMapping("/users/{id}")
public User findById(@PathVariable Long id) {
// 这里用到了RestTemplate的占位符能力
User user = this.restTemplate.getForObject(
"http://microservice-provider-user/users/{id}",
User.class,
id
);
// ...电影微服务的业务...
return user;
}
public User findByIdFallback(Long id, Throwable throwable) {
log.error("进入回退方法", throwable);
return new User(id, "默认用户", "默认用户", 0, new BigDecimal(1));
}
}
3、yml配置
server:
port: 8010
spring:
application:
# 指定注册到eureka server上的服务名称
name: microservice-consumer-movie
eureka:
client:
service-url:
# 指定eureka server通信地址,注意/eureka/小尾巴不能少
defaultZone: http://localhost:8761/eureka/
instance:
# 是否注册IP到eureka server,如不指定或设为false,那就会注册主机名到eureka server
prefer-ip-address: true
management:
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: 'hystrix.stream'
以上就是整合Ribbon的4种实现方式!加油!!!一起学习交流讨论!