服务的调用---Ribbon和OpenFeign

目录

  • 一.Ribbon
    • 1.Ribbon概述
    • 2.Ribbon负载均衡
      • 2.1 Ribbon负载均衡策略
      • 2.2 Ribbon与Nginx的区别
    • 3.Ribbon服务调用+负载均衡的实现
  • 二.OpenFeign
    • 1.Feign和OpenFeign
    • 2.OpenFeign实现服务调用
    • 3.OpenFeign日志打印功能

一.Ribbon

1.Ribbon概述

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用(Ribbon+RestTemplate)
Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等,就是在配置文件中列出LoadBalancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们就很容易使用Ribbon实现自定义的负载均衡算法

2.Ribbon负载均衡

2.1 Ribbon负载均衡策略

命名 说明
RoundRobinRule 轮询策略 Ribbon的默认负载均衡策略
RandomRule 随机策略 从所有可用的提供者中随机选择一个
RetryRule 重试策略 从所有可用的提供者中随机选择一个,若获取失败的话,则可以在指定的时间内重试,默认为500毫秒
BestAvailableRule 最低并发策略 选择并发量最小的提供者
AvailabilityFilteringRule 可用过滤策略 过滤掉处于被标记伟circuit tripped状态的 提供者,或已经超过连接极限的 提供者,对剩余 provider 采用轮询策略
ZoneAvoidanceRule 复合判断策略 判断 提供所在区域的性能及 provider 的可用性选择服务器
WeightedResponseTimeRule 权重响应时间策略 根据每个 提供的平均响应时间计算其权重,响应时间越快权重越大,被选中的机率就越高。在刚启动时采用轮询策略。后面就会根据权重进行选择了

2.2 Ribbon与Nginx的区别

Ribbon是客户端负载均衡,在调用微服务接口时,会在Eureka注册中心上获取注册信息服务列表后,缓存到JVM本地,从而在本地实现RPC远程服务调用并负载均衡;
Nginx是服务器端负载均衡,客户端所有请求都会交给Nginx,然后Nginx实现转发请求到不同服务器上,即负载均衡是由服务端实现的。

3.Ribbon服务调用+负载均衡的实现

  • Eureka Client端内集成了Ribbon的依赖包,所以不需要导入新的依赖就能使用Ribbon+RestTemplate实现服务调用
    服务的调用---Ribbon和OpenFeign_第1张图片
  • config/ApplicationContextConfig:要实现服务调用,是Ribbon+RestTemplate,所以也要先配置好RestTemplate
@Configuration
public class ApplicationContextConfig {
    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

@LoadBalanced注解在RestTemplate上,就能实现调用服务时负载均衡,默认策略是轮询

  • 如果要自定义负载均衡策略,需要将你的策略配置类放在SpringBoot启动类扫面不到的地方,即放在SpringBoot主启动类所在的包外
    服务的调用---Ribbon和OpenFeign_第2张图片
  • MySelfRule:自定义负载均衡策略
@Configuration
public class MySelfRule {
    @Bean
    public IRule myRule(){
        return new RandomRule();//定义随机
    }
}
  • SpringBoot主启动类,配置自定义的负载均衡策略的路径
@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

OpenFeign 可以使消费者将提供者提供的服务名伪装为接口进行消费,消费者只需使用 “Service 接口+ 注解” 的方式。 即可直接调用Service 接口方法,而无需再使用 RestTemplate了。其实原理还是使用RestTemplate,而通过Feign(伪装)成我们熟悉的习惯.

1.Feign和OpenFeign

1.1 Feign

  • Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
  • Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
  • Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
  • Feign本身不支持Spring MVC的注解,它有一套自己的注解

1.2 OpenFeign

  • OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

Spring Boot 1.x 环境下使用的是 Feign,而该项目现已更新为了 OpenFeign。所以后续使用的依赖也发生了变化

2.OpenFeign实现服务调用

  • pom.xml:引入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>
  • application.yml:配置相关信息
server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/
  • 主启动类:加上Feign的注解@EnableFeignClients
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
     public static void main(String[] args) {
           SpringApplication.run(OrderFeignMain80.class, args);
      }
}
  • 业务逻辑接口+@FeignClient配置调用服务
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
  • @FeignClient(value = “CLOUD-PAYMENT-SERVICE”):指定要调用的服务名在这里插入图片描述
  • @GetMapping(value = “/payment/get/{id}”:被调用的服务的方法
    服务的调用---Ribbon和OpenFeign_第3张图片
  • controller层进行调用
@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);
    }
}

这样就成功调用了,并且也实现了负载均衡~~~

3.OpenFeign日志打印功能

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节
说白了就是对Feign接口的调用情况进行监控和输出

  • 日志级别
    NONE: 默认的,不显示任何日志
    BASIC: 仅记录请求方法、URL、响应状态码及执行时间
    HEADERS: 除了BASIC中定义的信息外,还有请求和响应的头消息
    FULL: 除了HEADERS中定义的信息外,还有还有请求和响应的正文和元数据
  • 配置日志bean
@Configuration
public class FeignConfig
{
    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;
    }
}
  • 配置yml
logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.baidu.springcloud.service.PaymentFeignService: debug
  • 后台打印结果
    服务的调用---Ribbon和OpenFeign_第4张图片

你可能感兴趣的:(分布式微服务)