Ribbon、LocdBalance和openFeign的实战

Ribbon

使用RestTemplate时,如果不加@LoadBalance,调用不通,需要使用@LoadBalance作为负载均衡

手写一个客户端的负载均衡器

@GetMapping("order/create2")
    public String createOrder2(){
        List<ServiceInstance> instances = discoveryClient.getInstances("stock-service");
        String uri = instances.get(0).getUri().toString(); // 获取第一个url,也可以自己进行负载均衡(随机、轮询)
        System.out.println("uri:"+uri);
        return restTemplate.getForObject(uri+ "/stock/reduce", String.class);
    }

ribbon是netflix开源的一个客户端负载均衡器,不过现在已经不再更新了(闭源)

nacos中使用ribbon来做负载均衡

nacos-discovery中已经包含了ribbon

负载均衡规则

默认是轮询

 

修改负载均衡规则

使用java配置的方式(在调用方进行)

添加配置,使用random的方式进行负载均衡

public class RibbonConfig {

    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }

}

配置对应的服务的负载均衡策略 

@Configuration
@RibbonClient(name = "stock-service", configuration = RibbonConfig.class)
public class StockRibbonConfig {
}

使用配置文件配置

stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

java配置高于配置文件配置

全局配置

一般不使用全局配置

直接在配置类上加@Configuration

@Configuration
public class RibbonConfig {

    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }

}

懒加载

ribbon默认是懒加载,第一次调用会很慢,可以改成饿加载

ribbon:
  eager-load:
    enabled: true
    clients: stock-service

LoadBalance

 LoadBalance是spring cloud提供的客户端的负载均衡器,用来替代ribbon

ribbon与LoadBalance对比

RestTemplate的扩展点是LoadBalancerClient

LoadBalance的使用

nacos-discovery中集成了ribbon,需要剔除掉

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

添加loadBalance依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

这样也可以使用RestTemplate进行服务调用

自定义负载均衡策略

LoadBalance自定义负载均衡策略需要实现ReactorServiceInstanceLoadBalancer接口

public class CustomerLoadBalancer implements ReactorServiceInstanceLoadBalancer {

    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers;

    public CustomerLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers){
        this.serviceInstanceListSuppliers = serviceInstanceListSuppliers;
    }

    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSuppliers.getIfAvailable();
        return supplier.get().next().map(this::getInstanceResponse);
    }

    private Response<ServiceInstance>  getInstanceResponse(List<ServiceInstance> instances){
        return new DefaultResponse(instances.get(0)); // 可以自己实现负载均衡
    }

}

OpenFeign

常见的http客户端

HttpClient

apache下的,提供丰富、高效、最新的http请求

Okhttp

轻量级,一般用于安卓

HttpURLConnection

feign底层默认的就是HttpURLConnection,jdk中标准的http客户端;单线程

RestTemplate

介绍

openFeign是Netflix开源的声明式HTTP客户端

优点:

可以做到使用http请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方,更感知不到这是个http请求

openFeign实现远程http调用

 

 整合openFeign

引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

添加注解@EnableFeignClients

openFeign不用添加配置

client写法

@FeignClient("stock-service")
public interface StockClient {

    @GetMapping("/stock/reduce")
    String reduce();
}

调用

   @Autowired
    private StockClient stockClient;

    @GetMapping("order/create3")
    public String createOrder3(){
        return stockClient.reduce();
    }

openFeign中也集成了ribbon

openFeign通过ribbon做负载均衡,ribbon从nacos client获取服务列表

日志级别

生产环境中一般使用BASIC、NONE

 

配置日志级别

(需要提前配置好springboot的日志级别)

代码配置

添加配置类

public class StockFeignConfig {

    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}
@FeignClient(name = "stock-service", configuration = StockFeignConfig.class)

 配置文件

feign:
  client:
    config:
      stock-service:
        loggerLevel: full

 全局配置

不推荐

@Configuration
public class StockFeignConfig {

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

推荐

@EnableFeignClients(defaultConfiguration = StockFeignConfig.class)

 推荐

feign:
  client:
    config:
      default:
        loggerLevel: full

配置项

Contract

    @Bean
    public Contract feignContract(){
        return new SpringMvcContract();
    }

Decoder

默认就是SpringDecoder,一般不修改

拦截器

需要实现RequestInterceptor接口

Client设置

添加依赖

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

修改配置 

feign:
  httpclient:
    enabled: true
    max-connections: 200

也是可以使用其他Client

超时配置

    @Bean
    public Request.Options timeout(){
        return new Request.Options(200,500);
    }

### 回答1: ribbonopenfeign都是Spring Cloud中的负载均衡组件,但它们的作用不同。 Ribbon是一个客户端负载均衡器,它可以在客户端上实现负载均衡,将请求分发到多个服务提供者上。Ribbon提供了多种负载均衡策略,例如轮询、随机、加权等。Ribbon还可以与Eureka等注册中心集成,实现自动发现服务提供者。 OpenFeign是一个声明式的HTTP客户端,它可以让开发者更加方便地调用其他服务的API。OpenFeign可以自动将Java接口转换为HTTP请求,开发者只需要定义接口并使用注解描述请求参数、请求方式等信息,就可以直接调用其他服务的API。OpenFeign也可以与Ribbon等负载均衡组件集成,实现负载均衡和服务发现的功能。 因此,RibbonOpenFeign虽然都可以实现负载均衡,但它们的作用不同,Ribbon更加注重负载均衡的实现,而OpenFeign更加注重API的调用。 ### 回答2: ribbonOpenFeign都是Spring Cloud中常用的服务调用工具。它们的主要作用都是通过负载均衡方式实现微服务之间的调用,从而提高了系统的稳定性和可靠性。不同的是,ribbonOpenFeign的实现思路和注重点不同,并且在使用过程中也有不同的特点。 Ribbon的特点 Ribbon是一个客户端负载均衡器,它通过向Eureka Server注册发现服务,并且根据服务实例的可用状态和负载均衡算法等,来决定向哪个服务实例发送请求。与OpenFeign不同的是,Ribbon本身只提供了负载均衡功能,没有API调用的封装功能。因此,我们需要手动的使用RestTemplate或FeignClient等工具来向服务实例发送请求。Ribbon的优点在于简单易用,适用范围广泛,可以用在各种语言的开发中。 OpenFeign的特点 OpenFeign是一个对HTTP API进行调用的Java客户端,在Ribbon的基础上定义了更为丰富和易用的API。它可以像声明式RESTful客户端一样发送请求,并且支持多种注解,使得API调用变得更加简便和可读。OpenFeign可以自动完成微服务之间的负载均衡,而不需要显式的使用RestTemplate或者Ribbon等工具。只要在OpenFeign的接口上添加@FeignClient注解,就可以实现微服务的调用,并且OpenFeign会自动地将请求转发给相应的服务实例。因此,OpenFeign适用于需要代码更少且易于维护的场景。 总结 RibbonOpenFeign都是Spring Cloud中常用的服务调用工具,它们在实现思路和使用方法上有很大的差异。Ribbon只提供负载均衡功能,需要手动使用RestTemplate或FeignClient等工具进行API调用;而OpenFeign则是在Ribbon的基础上,封装了更为丰富和易用的API,并且自动完成了微服务之间的负载均衡,适用于代码更少且易于维护的场景。在实际应用中,我们需要根据不同的场景来选择合适的工具。 ### 回答3: RibbonOpenFeign都是Spring Cloud框架中用于进行微服务调用的工具。Ribbon是一个负载均衡的客户端工具,而OpenFeign则是一个声明式的REST客户端工具。虽然它们都用于微服务调用,但它们的作用和使用方式有不同之处。 首先,Ribbon用于负载均衡,它提供了多种方式进行负载均衡,例如轮询、随机、加权等等。它可以与Eureka、Consul等服务发现框架结合使用,实现服务发现和负载均衡的功能。在使用Ribbon时,我们需要编写代码来配置和管理与服务的连接,包括选择哪个服务、连接到哪个IP地址等,因此需要编写一定量的代码。 相比之下,OpenFeign是一个声明式的REST客户端工具。它利用了Spring MVC的注解和接口方法定义,可以让我们使用类似于SpringMVC的适配器来实现对外部服务的调用,而无需自己编写代码来处理连接服务等基础性问题。在使用OpenFeign时,我们只需要定义对外服务的接口,然后在接口中使用注解和方法定义来对服务进行描述。OpenFeign会自动生成客户端代码,用于与服务进行交互。这样,我们可以更加简便地实现对外服务的调用。 除此之外,在使用Ribbon进行微服务调用时,我们需要手动管理连接,对于复杂的应用场景,这些重复的代码会影响开发效率。而OpenFeign通过继承Ribbon或使用RibbonClient来管理连接,因此可以减少重复代码的数量,提高开发效率。 总的来说,RibbonOpenFeign在微服务调用及负载均衡方面各有优劣。如果我们只需要简单地进行微服务调用,OpenFeign可能更加适合;如果我们需要更加灵活地进行负载均衡并且服务的调用比较复杂,Ribbon则可能更加适合。在实际的开发中,我们可以根据项目需求和自身技术背景选择合适的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值