SpringCloud2.x(三)客户端负载均衡——Ribbon

之前,我们是这样调用服务提供者的

但是,如果服务提供者部署了多个实例,怎么实现负载均衡呢?答案就是使用Ribbon。

一、Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

二、为服务消费者整合Ribbon

1)新建maven项目microservice-consumer,pom.xml文件引入spring boot、spring cloud和eureka-client的相关依赖。



    4.0.0

    cn.zhh
    microservice-consumer
    1.0
    
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
    

    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Finchley.M7
                pom
                import
            
        
    
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
		
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
    

    
    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/libs-milestone
            
                false
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2)在application.yml加上以下配置。

server:
  port: 8082
spring:
  application:
    name: consumer-order
 
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/

3)创建RestTemplate实例并注入到Spring容器。注意需要添加LoadBalanced注解,就可为其整合Ribbon,使其具备负载均衡的能力。

@Configuration
public class BeanConf {

	@Bean
	@LoadBalanced // 整合Ribbon,使其具备负载均衡的能力
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
}

4)编写订单控制器,远程调用支付服务。并增加一个方法,用来测试Ribbon的负载均衡情况。

@RestController
public class OrderController {

	@Autowired
	private RestTemplate restTemplate;
	
	@Autowired
	private LoadBalancerClient loadBalancerClient;
	
	@GetMapping("/order/pay")
	public String pay() {
		System.out.println("订单服务开始调用支付服务...");
		return restTemplate.getForObject("http://provider-pay/pay", String.class);
	}
	
	@GetMapping("/order/ribbon_test")
	public String testRibbon() {
		ServiceInstance serviceInstance = loadBalancerClient.choose("provider-pay");
		return serviceInstance.getServiceId() + "-->" + serviceInstance.getHost() + ":" + serviceInstance.getPort();
	}
}

5)启动Eureka Server和3个服务提供者(上一篇博客SpringCloud2.x——Eureka已经写了)。

此时,Eureka首页可以看到PROVIDER-PAY有了3个实例。

访问http://localhost:8082/order/pay成功,然后多次访问http://localhost:8082/order/ribbon_test,可以看到依次轮询地返回不同的服务提供者地址信息,说明负载均衡功能实现了。

 

三、使用属性自定义Ribbon配置

也可以使用Java代码自定义Ribbon配置,不过比较麻烦,这里就不介绍了。

还是使用上面的项目microservice-consumer,在application.yml加上以下内容

provider-pay: 
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

这样,就可以将负载均衡规则修改为随机。

四、脱离Eureka使用Ribbon

1)复制一份上面的项目microservice-consumer,将ArtifactId修改为microservice-consumer-ribbon-withot-eureka,并将pom.xml的eureka依赖去掉,引入Ribbon。



    4.0.0

    cn.zhh
    microservice-consumer-ribbon-withot-eureka
    1.0
    
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
    

    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Finchley.M7
                pom
                import
            
        
    
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
		
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        
    

    
    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/libs-milestone
            
                false
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

2)修改application.yml。

server:
  port: 8082
spring:
  application:
    name: consumer-order
provider_pay: 
  ribbon:
    listOfServers: localhost:8081,localhost:8181

3)剩下操作和测试结果跟上面整合Eureka的例子一样,就不介绍了。

你可能感兴趣的:(Spring,Cloud,2.x,Ribbon,SpringCloud2.x,微服务)