• Spring Cloud 之 Ribbon服务消费(五)


    我们在Spring Cloud 之 Eureka Client服务注册(三) 中实现了简单的服务注册,本篇主要通过Ribbon实现服务消费者调用,因为本系列博客不专注细节,所以对于Ribbon及后续其它SpringCloud组件也不展开讨论。Ribbon非常优秀,尤其对接第三方服务时,如果第三方服务涉及多机房部署,往往会给调用者几个服务IP,我们通过Ribbon Httpclient便可以实现客户端的负载均衡及服务探活。

    1、创建一个module名称为x-demo-service-ribbon的ribbon服务

    2、build.gradle中加入依赖

    dependencies {
        compile("org.springframework.cloud:spring-cloud-starter-netflix-ribbon")
    }

    3、创建启动类

    注意启动类上需要加@EnableEurekaClient注解,因为Ribbon默认通过Eureka找服务提供者列表,特殊场景下(比如跨机房),我们也可以把服务提供者IP列表维护在数据库或配置文件里,此时启动类上就不需要加@EnableEurekaClient注解。

    第13行通过@LoadBalanced注解使RestTemplate具备负载均衡能力

    第12到15行配置了负载均衡的访问策略为随机访问

     1 /**
     2  * @author Leo
     3  */
     4 @SpringBootApplication
     5 @EnableEurekaClient
     6 public class RibbonServerApplication {
     7 
     8     public static void main(String[] args) {
     9         SpringApplication.run(RibbonServerApplication.class, args);
    10     }
    11 
    12     @Bean
    13     @LoadBalanced
    14     RestTemplate restTemplate() {
    15         return new RestTemplate();
    16     }
    17 
    18     @Bean
    19     public IRule ribbonRule() {
    20         return new RandomRule();
    21     }
    22 }

    4、创建测试Controller

     1 @RestController
     2 @RequestMapping("ribbon")
     3 @Slf4j
     4 public class RibbonDemoController {
     5 
     6     @Autowired
     7     RestTemplate restTemplate;
     8 
     9     @Autowired
    10     LoadBalancerClient loadBalancerClient;
    11 
    12     @RequestMapping("service")
    13     public String service() {
    14         log.info("[ribbon]谁在撩我?");
    15 
    16         //随机访问策略
    17         this.loadBalancerClient.choose("x-demo-service");
    18         return restTemplate.getForObject("http://X-DEMO-SERVICE/demo/service", String.class);
    19     }
    20 }

    5、bootstrap.yml配置文件

    注意第10行配置,这个地方通过配置文件的方式配置了随机访问策略,和之前启动类中的配置只要配置一个即可,都配置也无所谓。

     1 spring:
     2   application:
     3     name: x-demo-service-ribbon
     4 
     5 server:
     6   port: 8091
     7 
     8 spring-demo-service:
     9   ribbon:
    10     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    11 
    12 management:
    13   endpoints:
    14     web:
    15       exposure:
    16         include: '*'
    17   endpoint:
    18       health:
    19         show-details: ALWAYS

    6、启动RibbonServerApplication,看到X-DEMO-SERVICE-RIBBON已经注册上来了。

    7、服务访问测试

    浏览器访问http://localhost:8091/ribbon/service,可以看到如下输出,说明通过Ribbon调用服务提供者已经成功了

    同时观察x-demo-service-ribbon后台日志输出:

    2021-02-23 11:33:50.975 INFO 53920 --- [nio-8091-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client X-DEMO-SERVICE initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=X-DEMO-SERVICE,current list of Servers=[windows10.microdone.cn:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]

    8、多实例x-demo-service服务提供者演示

    为了更好的验证Ribbon实现了负载均衡,我们对x-demo-service进行一下改造,增加服务端口返回。

     1 @RestController
     2 @RequestMapping("demo")
     3 @Slf4j
     4 public class DemoController {
     5 
     6     @Value("${server.port}")
     7     String port;
     8 
     9     @RequestMapping("service")
    10     public String service() {
    11         log.info("谁在撩我?");
    12         return "x-demo-service hello." + port;
    13     }
    14 }

    依次修改启动端口为8081,8082,8083并启动,idea2020.3版本可以通过勾选Allow parallel run选项,实现服务并行启动。

    此时观察Eureka注册中心,可以看到3个端口都已经注册成功了

    9、Ribbon负载均衡测试

    浏览器再次访问:http://localhost:8091/ribbon/service

    返回内容

    x-demo-service hello.8081

    x-demo-service hello.8082

    x-demo-service hello.8083

    同时观察x-demo-service-ribbon后台日志输出:

    2021-02-23 13:37:38.710 INFO 61484 --- [nio-8091-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client X-DEMO-SERVICE initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=X-DEMO-SERVICE,current list of Servers=[windows10.microdone.cn:8083, windows10.microdone.cn:8082, windows10.microdone.cn:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:3; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]

    到此Ribbon演示完成,因为我们用的随机访问策略,需要多刷新几次,才能把每一个服务访问到。如果用轮询策略就会依次访问各个服务了。

    10、其它负载均衡策略

    1 com.netflix.loadbalancer.RoundRobinRule  - 轮询
    2 com.netflix.loadbalancer.RandomRule  - 随机
    3 com.netflix.loadbalancer.RetryRule - 重试,先按RoundRobinRule进行轮询,如果失败就在指定时间内进行重试
    4 com.netflix.loadbalancer.WeightedResponseTimeRule - 权重,响应速度越快,权重越大,越容易被选中。
    5 com.netflix.loadbalancer.BestAvailableRule  - 先过滤掉不可用的处于断路器跳闸转态的服务,然后选择一个并发量最小的服务
    6 com.netflix.loadbalancer.AvailabilityFilteringRule - 先过滤掉故障实例,再选择并发量较小的实例
    7 com.netflix.loadbalancer.ZoneAvoidanceRule - 默认规则,复合判断server所在区域的性能和server的可用性进行服务的选择。
  • 相关阅读:
    分布式消息系统Kafka初步
    webService 学习
    一个周末掌握IT前沿技术之node.js篇
    mount
    dd
    fsck
    resize2fs
    mkfs
    parted
    tune2fs
  • 原文地址:https://www.cnblogs.com/shileibrave/p/14435273.html
Copyright © 2020-2023  润新知