阿里P8谈:Ribbon、LoadBalance(负载均衡)、OpenFeign服务调用之间的问题

前言

随着服务注册中心的安装完成后,客户端的负载均衡和服务的调用又是我们关注的话题。Ribbon可以实现客户端的负载均衡,而OpenFeign则是可以让我们像调用Dubbo接口一样,实现面向接口编程

负载均衡LB

Load Balance(负载均衡):简单的说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。常见的负载均衡工具有nginx、LVS,硬件上F5等

集中式LB

即在服务的消费方和提供方之间使用独立的LB设施,可以是硬件F5、也可以是软件nginx、LVS等,提供该设施将请求通过某种策略发送给服务提供方

进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心查找服务列表,然后获取服务地址根据某种规则选出合适的服务器。Ribbon就是进程内LB,它只是一个类库,集成于消费方进程,消费者通过它来获取到服务提供方的地址

Ribbon

SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,主要功能是提供了客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供了一系列完善的配置项例如连接超时、重试等。Ribbon目前也进入了维护模式

版本选择

SpringCloud版本依赖于SpringBoot的版本,可以从官网查询相关版本依赖关系:spring.io/projects/sp…

springboot 2.2.5.RELEASE
springcloud Hoxton.SR3

添加依赖



    org.springframework.cloud
    spring-cloud-starter-netflix-ribbon-client





    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-actuator


    org.projectlombok
    lombok
    true


    org.springframework.boot
    spring-boot-starter-test


    org.springframework.boot
    spring-boot-devtools
    runtime
    true

Ribbon核心组件Irule

阿里P8谈:Ribbon、LoadBalance(负载均衡)、OpenFeign服务调用之间的问题_第1张图片

 

IRule:根据特点算法从服务列表中选取一个要访问的服务

替换Ribbon的默认负载均衡算法

Ribbon默认的负载均衡算法是轮询RoundRobinRule

编写配置类

该配置类不能防止在主启动类的子包下,否则该类就会被所有Ribbon客户端共享,达不到定制化目的

@Configuration
public class MyLoadBalance {
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }
}
复制代码

主启动类的修改

修改某个微服务的负载均衡配置

// 使用@RibbonClient注解,name属性:服务名称,configuration:自定义的Irule实现类
@SpringBootApplication
@EnableEurekaClient
// 自定义某个微服务的负载均衡规则,使用@RibbonClient注解,将configuration属性中的@Configure去掉,不注入到spring容器中
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = {MyLoadBalance.class})
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }
}

Ribbon VS Nginx

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

OpenFeign

Feign是一个声明式的WebService客户端。使用Feign可以让编写WebService客户端更加便捷。它的使用方法是定义一个服务接口然后添加相关注解,OpenFeign支持SpringMVC标准注解和HttpMessageConverters。Feign默认结合了Ribbon,支持负载均衡

Feign和OpenFeign的区别

Feign

Feign是Spring Cloud组件中的一个轻量级Restful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端的负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解接口,调用这个接口,就可以调用服务注册中心的服务

OpenFeign

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

Feign服务的调用

公共模块中添加接口方法

// name属性:微服务名
@FeignClient(name = "cloud-payment-service")
public interface PaymentService {
    // 服务提供者端的配置
    @GetMapping("/payment/get/{id}")
    public CommonResult getById(@PathVariable("id") Integer id);
    
    @GetMapping("/payment/timeout")
    public String timeout();
}

添加依赖



    com.sun
    cloud-api-commons
    1.0-SNAPSHOT


    org.springframework.cloud
    spring-cloud-starter-openfeign


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-actuator


    org.springframework.boot
    spring-boot-starter-test


    org.springframework.boot
    spring-boot-devtools
    runtime
    true


    org.projectlombok
    lombok
    true

修改application.yml

注意:feign接口调用默认你超时时间是1s,如果出现网络延迟等,会导致接口调用失败

server:
  port: 80

spring:
  application:
    name: cloud-consumer-feign-order

eureka:
  client:
    fetch-registry: true
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka


#openfeign的超时处理
feign:
  client:
    config:
      default:
        # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
        connectTimeout: 5000
        # 指的是建立连接后从服务器读取到可用资源所用的时间
        readTimeout: 5000

修改主启动类

@SpringBootApplication
@EnableFeignClients
public class OrderOpenFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderOpenFeignMain80.class, args);
    }
}

OpenFeign日志信息完善

日志级别

  • NONE: 默认的,不显示任何日志
  • BASIC:仅记录请求方法,URL、响应状态码以及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文以及元数据

配置日志bean

@Configuration
public class LogConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

修改application.yml

#feign日志打印
logging:
  level:
    com.sun.cloud.service.PaymentService: debug

你可能感兴趣的:(面试,java,后端)