五、微服务框架spring cloud组件之负载均衡器ribbo

2019-03-31  本文已影响0人  小manong

一、客户单负载均衡和服务端负载均衡

1、服务端负载均衡

2、客户端负载均衡

1、服务提供者,启动多个应用实例并注册到 注册中心
2、服务消费者直接通过调用被@LoaderBalance注解修饰过的RestTemplate来实现服务接口的调用。

二、RestTemplate详解

封装并屏蔽了http通信细节
组装Http请求参数
抽取结果并转成调用端指定的Java pojo对象
屏蔽了不同消息格式的差异化处理

1、Restful API

(1)get

api:
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)

 //返回String对象
        ResponseEntity<String> strResults = restTemplate.getForEntity("domain/user?name={1}",
                String.class, "qiu");
//        Map<String,Object> params=new HashMap<>();
//        params.put("name","qiu" );
//        ResponseEntity<String> strResults = restTemplate.getForEntity("domain/user?name={name}",
//                String.class, params);
        String body=strResults.getBody();
        //返回user对象
        ResponseEntity<User> userResult = restTemplate.getForEntity("domain/user?name={1}",
                User.class, "qiu");
        User user=userResult.getBody();

(2)post

api:
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,Class<T> responseType, Object... uriVariables)
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,Class<T> responseType, Map<String, ?> uriVariables)
public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)

2、restTemplate简单使用配置

@Configuration
public class RestConfiguration {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate(simpleClientHttpRequestFactory());
    }
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        //设置超时时间
        factory.setReadTimeout(5000);//ms
        factory.setConnectTimeout(15000);//ms
        return factory;
    }
}

3、restTemplate一些高级应用(替换底层连接、配置转换器、配置拦截器等等)

https://www.jianshu.com/p/b4e479a6f5a8
https://www.xncoding.com/2017/07/06/spring/sb-restclient.html
https://blog.csdn.net/w05980598/article/details/79166507

三、Ribbon负载均衡策略

Ribbon负载均衡策略类结构图
策略名 策略声明 策略描述 实现说明
BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
ZoneAvoidanceRule public class ZoneAvoidanceRule extends PredicateBasedRule 复合判断server所在区域的性能和server的可用性选择server 使 用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个 zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的 Server。
RandomRule public class RandomRule extends AbstractLoadBalancerRule 随机选择一个server 该策略实现了从服务实例清单中随机选择一个服务实例的功能。
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式轮询选择server 该策略实现了按照线性轮询的方式依次选择每个服务实例的功能。
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。 一 个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择 server。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 对选定的负载均衡策略机上重试机制。 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

四、Ribbon配置使用

1、默认实现

com.netflix.client.config.IClientConfig:Ribbon的客户端配置,默认采用com.netflix.client.config.DefaultClientConfigImpl实现。
com.netflix.loadbalancer.IRule:Ribbon的负载均衡策略,默认采用com.netflix.loadbalancer.ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
com.netflix.loadbalancer.IPing:Ribbon的实例检查策略,默认采用com.netflix.loadbalancer.NoOpPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。
com.netflix.loadbalancer.ServerList:服务实例清单的维护机制,默认采用com.netflix.loadbalancer.ConfigurationBasedServerList实现。
com.netflix.loadbalancer.ServerListFilter:服务实例清单过滤机制,默认采org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。
com.netflix.loadbalancer.ILoadBalancer:负载均衡器,默认采用com.netflix.loadbalancer.ZoneAwareLoadBalancer实现,它具备了区域感知的能力。

2、自定义配置文件(全局)

@Configuration
public class ConfigBeans {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    /**自定义配置ribbon负载均衡算法
     * @return
     */
    @Bean
    public IRule myRule(){
        //return new RoundRobinRule();//轮询
        //return new RetryRule();//重试
        return new BestAvailableRule();
    }
}

3、针对某一个服务调用私人定制

4、脱离eureka使用

#取消Ribbon使用Eureka
ribbon.eureka.enabled=false

#配置Ribbon能访问 的微服务节点,多个节点用逗号隔开
microservice-provider-user.ribbon.listOfServers=localhost:8001,localhost:8002
上一篇 下一篇

猜你喜欢

热点阅读