SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用(Ribbon+RestTemplate)
Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,就是在配置文件中列出LoadBalancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们就很容易使用Ribbon实现自定义的负载均衡算法
类 | 命名 | 说明 |
---|---|---|
RoundRobinRule | 轮询策略 | Ribbon的默认负载均衡策略 |
RandomRule | 随机策略 | 从所有可用的提供者中随机选择一个 |
RetryRule | 重试策略 | 从所有可用的提供者中随机选择一个,若获取失败的话,则可以在指定的时间内重试,默认为500毫秒 |
BestAvailableRule | 最低并发策略 | 选择并发量最小的提供者 |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉处于被标记伟circuit tripped状态的 提供者,或已经超过连接极限的 提供者,对剩余 provider 采用轮询策略 |
ZoneAvoidanceRule | 复合判断策略 | 判断 提供所在区域的性能及 provider 的可用性选择服务器 |
WeightedResponseTimeRule | 权重响应时间策略 | 根据每个 提供的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。在刚启动时采用轮询策略。后面就会根据权重进行选择了 |
Ribbon是客户端负载均衡,在调用微服务接口时,会在Eureka注册中心上获取注册信息服务列表后,缓存到JVM本地,从而在本地实现RPC远程服务调用并负载均衡;
Nginx是服务器端负载均衡,客户端所有请求都会交给Nginx,然后Nginx实现转发请求到不同服务器上,即负载均衡是由服务端实现的。
@Configuration
public class ApplicationContextConfig {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@LoadBalanced注解在RestTemplate上,就能实现调用服务时负载均衡,默认策略是轮询
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule();//定义随机
}
}
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
这样就实现了服务的调用并且以随机的策略负载均衡到提供的服务端口~~~
OpenFeign 可以使消费者将提供者提供的服务名伪装为接口进行消费,消费者只需使用 “Service 接口+ 注解” 的方式。 即可直接调用Service 接口方法,而无需再使用 RestTemplate了。其实原理还是使用RestTemplate,而通过Feign(伪装)成我们熟悉的习惯.
1.1 Feign
1.2 OpenFeign
Spring Boot 1.x 环境下使用的是 Feign,而该项目现已更新为了 OpenFeign。所以后续使用的依赖也发生了变化
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>com.baidugroupId>
<artifactId>cloud-api-commonsartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain80.class, args);
}
}
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
@GetMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
@RestController
@Slf4j
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
{
return paymentFeignService.getPaymentById(id);
}
}
这样就成功调用了,并且也实现了负载均衡~~~
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节
说白了就是对Feign接口的调用情况进行监控和输出
@Configuration
public class FeignConfig
{
@Bean
Logger.Level feignLoggerLevel()
{
return Logger.Level.FULL;
}
}
logging:
level:
# feign日志以什么级别监控哪个接口
com.baidu.springcloud.service.PaymentFeignService: debug