Ribbon
Ribbon是客户端负载均衡工具
客户端负载均衡与服务端负载均衡
1.客户端负载均衡:
客户端获取到服务端的提供者列表,然后根据一定的规则去调用。(随机/轮询)
服务提供者启动时向Eureka集群注册服务,在消费者第一次进行消费时,会从Eureka获取可用的服务列表并缓存到本地(所以第一次耗时多),并且会定时更新服务列表,然后通过负载均衡的算法向其中一个服务提供者请求(默认轮询机制)。
2.服务端负载均衡
服务端将所有的请求地址放在ng中,消费端请求ng的地址,由ng进行请求的分发。
搭建Ribbon工程
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.定义自定义的config类
1.类上加@configuration
3.在config类中定义restTemplate并加上@LoadBalanced
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@LoadBalanced是指创建一个负载均衡的RestTemplate的Bean
4.调用服务方(通过微服务名称 )
String result = restTemplate.getForEntity("http://HELLO-SERVICE/hello"
,String.class,"").getBody();
5.负载均衡算法机制
在configuration类中 可以配置算法
@Bean
public IRule myRule(){
return new RetryRule();
}
算法列表:
- RandomRule 随机
- RetryRule 重试
- RoundRobinRule 轮询(默认)
- AvailabilityFilteringRule 过滤掉处于熔断或者高并发的server。
使用Java配置类为某个服务指定负载均衡算法
-
在独立包(与application启动类同级的包)中写RibbonConfiguration类
//该类不能在主应用程序上下文的@CompentScan中 @Configuration public class RibbonConfiguration{ @Bean public IRule myRule(){ // 随机策略 return new RandomRule(); } }
-
在application同级包中写ProviderConfiguration类通过@RannonClient指定策略
@Configuration @RibbonClient(name="microservice-provider-user",configuration = RibbonConfiguration.class) public class ProviderUserConfiguration{ }
策略配置类如果放在application启动类同级上,那么就会是统配生效
通过配置文件配置策略
在application.yml中进行配置
microservice-provider-user:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
Ribbon组件
1.ServerList 负载均衡使用的服务器列表,这个列表会缓存在负载均衡器中,并定期更新。(当 Ribbon 与 Eureka 结合使用时,ServerList 的实现类就是 DiscoveryEnabledNIWSServerList,它会保存 Eureka Server 中注册的服务实例表。)
2.ServerListFilter 服务器列表过滤器。这是一个接口,主要用于消费者过滤服务器列表,过滤后的结果就是ServerList。
3.IPing 探测服务器是否存活的策略。
4.IRule 负载均衡策略。
5.ILoadBablancer 负载均衡器。这也是一个接口,Ribbon 为其提供了多个实现,比如 ZoneAwareLoadBalancer。而上层代码通过调用其 API 进行服务调用的负载均衡选择。一般 ILoadBalancer 的实现类中会引用一个 IRule。
6.RestClient 服务调用器。
IRule使用的是抽象模式+模版模式
模版模式:定义算法中的骨架在抽象类中,在子类中进行实现。
工作步骤
1.优先选择在同一个zone切负载较少的EurekaServer。
2.定期从Eureka更新并过滤服务器列表。
3.根据用指定的侧裂,在Server列表中选择一个实例地址。
4.通过RestClient进行服务调用。
Feign
Feign是声明式、模版化的HTTP客户端,可以帮助我们更便捷、更优雅的使用HttpApi。
在springCloud中使用Feign只需要创建接口,然后在接口上添加注解即可。
Ribbon 如果遇到参数很多时,维护困难,需要用feign。
Feign继承
- Feign支持继承,使用继承可以将一些公共操作分组到一些父接口中,从而简化Feign的开发。
- 抽取服务的公共接口到新的项目中,增加父接口。
- 在实现服务中引入父接口服务工程的依赖。
- 在实现服务中增加父服务接口的子接口并在子接口上加注解@FeignClient
使用Feign
- 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 创建接口,并在接口上增加@FeignClient(name="")
- 启动类上增加注解@EnableFeignCient