学习笔记:微服务11 spring cloud ribbon(负载均衡)+ hystrix(熔断)

为了提高服务稳定性和服务能力,相同的微服务可能会配置运行多个副本,这些微服务同时提供同等服务,这里要解决的是如何实现负载均衡,随机地访问其中某个微服务,再就是某个微服务宕机时,需要熔断,就是不再分配任务到这个服务器,但恢复服务后又给它分配任务,spring的方案是 ribbon(负载均衡)+ hystrix(熔断)配合使用。

这里要测试这个功能,需要至少四台服务器,一个是eureka 注册中心,reibbon需要它来发现备选服务器列表,二是有两台相同功能的微服务提供者,这两台可以分布在两个ip上,或一个ip的两个端口上,但注册到eureka的应用名要相同,三是一台ribbon+ hystrix功能的服务消费者。

下面介绍这个ribbon+hystrix的配置,主要参考https://blog.csdn.net/wcblog/article/details/80251226 及其他文章,再抄集理解测试通过。

1. pom.xml 添加依赖

      <dependency> 
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
        <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
       </dependency> 

2. application.properties

server.port: 8803
spring.application.name=MicroserviceRibbonHystrix8803
spring.cloud.discovery.enabled=true
eureka.client.serviceUrl.defaultZone=http://admin:123@centos7.linbsoft.com:8101/eureka/,http://admin:123@microservice1.linbsoft.com:8102/eureka/
 

3. 启动类 MicroserviceRibbonHystrix8803Application

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class MicroserviceRibbonHystrix8803Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceRibbonHystrix8803Application.class, args);
    }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
在这里定义restTemplate为具有LoadBalanced负载均衡注解。restTemplate是一个发起rest访问请求功能的模板。

4.发起ribbon访问的类


 
 
  1. @RestController
  2. public class UserManagementRibbonClient {
  3. @Autowired
  4. RestTemplate restTemplate;
  5. @Value("${server.port}")
  6. String port;
  7. @GetMapping("/listUsersByRibbon")
  8. @HystrixCommand(fallbackMethod="listUsersByRibbonFallback")
  9. public String listUsersByRibbon(){
  10. // MicroserviceServerA8801 是提供同类服务的多个应用的同名eureka注册名称
  11. String result = this.restTemplate.getForObject( "http://MicroserviceServerA8801/listusers", String. class);
  12. return result;
  13. }
  14. public String listUsersByRibbonFallback(){
  15. return "listUsersByRibbon异常,端口:" + port;
  16. }
  17. }

其中 @HystrixCommand(fallbackMethod="listUsersByRibbonFallback") 指定访问超时(时间可在配置文件设置),执行listUsersByRibbonFallback并发起熔断,ribbon不再指向这个熔断的服务器,但服务恢复一段时间后,会自动再加入服务列表。

上图显示两个同名的服务提供者MicroserviceServerA8801,启动一个8801端口副本后修改端口为8802,再启动。

5.访问测试,分别测试两个服务提供者都启动,停止其中一个,停止两个,再启动一个,看访问8803端口的不同响应。

其中服务提供者简单返回字符串

@RestController
public class listUsers {
       @Value("${server.port}")
       String port;
      @RequestMapping("/listusers")
        public String listusersmain() {
            return "服务器端口:" + port + " | users[{'id':'1',name':'张三'},{'id':'2',name':'李四'},{'id':'3',name':'王五'}]";
        }
}

结果:轮询两个服务器,并识别宕机。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值