使用Ribbon+RestTemplate消费服务

zestroly 2019-01-06

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

主要包括六个组件:

         1、ServerList,负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当 Ribbon 与 Eureka 结合使用时,ServerList 的实现类就是 DiscoveryEnabledNIWSServerList,它会保存 Eureka Server 中注册的服务实例表。

         2、ServerListFilter,服务器列表过滤器。这是一个接口,主要用于对 Service Consumer 获取到的服务器列表进行预过滤,过滤的结果也是 ServerList。Ribbon 提供了多种过滤器的实现。

         3、IPing,探测服务实例是否存活的策略。

         4、IRule,负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等。

         5、ILoadBalancer,负载均衡器。这也是一个接口,Ribbon 为其提供了多个实现,比如 ZoneAwareLoadBalancer。而上层代码通过调用其 API 进行服务调用的负载均衡选择。

         6、RestClient,服务调用器。

主要负载均衡策略:

         1、com.netflix.loadbalancer.RoundRobinRule:轮询,这是默认的策略。

         2、com.netflix.loadbalancer.RandomRule:随机

         3、com.netflix.loadbalancer.RetryRule:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

         4、com.netflix.loadbalancer.WeightedResponseTimeRule:加权响应时间。根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。

         5、com.netflix.loadbalancer.ZoneAvoidanceRule:区域感知轮询。复合判断server所在区域的性能和server的可用性选择server

         6、com.netflix.loadbalancer.AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server。

         7、com.netflix.loadbalancer.BestAvailableRule:选择一个最小的并发请求的server,逐个考察Server,如果Server被tripped了,则忽略

 启动类:

@EnableEurekaClient
// @RibbonClient(name="service-provider-1", configuration=DefaultRibbonConfiguration.class)
@SpringBootApplication
public class Main {
	@Bean
	@LoadBalanced //添加负载均衡支持,默认策略是轮询
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

	public static void main(String[] args) {
		SpringApplication.run(Main.class, args);
	}
}

Controller类:

@RestController
public class UserController {
	@Autowired
    private RestTemplate restTemplate;
	
	@GetMapping("/user/{id}")
	public String addUser(@PathVariable Long id){
		//服务提供者的接口地址:此处用 spring.application.name 属性值
		String url = "http://service-provider-1/user/" + id;
		
		//通过RestTemplate对象调用接口
		String result = restTemplate.getForObject(url, String.class);
		
		return result;
	}
}

通过自定义Ribbon更改默认的负载均衡策略,有以下两种方式:

1、通过代码自定义Ribbon

    创建Ribbon配置类

/**
 * 自定义Ribbon配置类
 * 
 * 该配置类不能被@ComponentScan扫描到,否则配置信息就会被所有 @RibbonClient 共享
 * Ribbon默认配置类是 RibbonClientConfiguration
 */
@Configuration
public class DefaultRibbonConfiguration {
	@Bean
	public IRule ribbonRule(){
		IRule rule = new RandomRule();
	    return rule;
	}
}
 

    在启动类中使用 @RibbonClient 或 @RibbonClients 注解为服务提供者指定Ribbon配置类

         @RibbonClient(name="service-provider-1", configuration=DefaultRibbonConfiguration.class)

 2、使用配置文件自定义Ribbon

        在application.properties文件中添加以下配置信息

service-provider-1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

相关推荐