Java Ribbon与openfeign区别和用法讲解

 更新时间:2022年08月01日 08:43:31   作者:kaico2018  
Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便

Ribbon 本地负载均衡器

在SpringCloud第一代中使用Ribbon、SpringCloud第二代中直接采用自研发 loadbalancer 即可,默认使用的Ribbon。

本地负载均衡与Nginx 的区别

本地负载均衡器基本的概念:我们的消费者服务从我们的注册中心获取到集群地址列表,缓存到本地,让后本地采用负载均衡策略(轮训、随机、权重、hash一致性等),获取接口列表地址,采用算法获取选择一个接口地址实现本地的rpc远程的。本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,既本地负载均衡器。

Nginx是客户端所有的请求统一都交给我们的Nginx处理,让后在由Nginx实现负载均衡转发,属于服务器端负载均衡器。

应用场景:

Nginx属于服务器负载均衡,应用于Tomcat/Jetty服务器等,而我们的本地负载均衡器,属于客户端负载均衡,应用于在微服务架构中rpc框架中,rest、openfeign、dubbo。

基本使用

注入 restTemplate,加上 @LoadBalanced 注解。

@Bean("restTemplate")
@LoadBalanced // 实现本地的负载均衡
public RestTemplate restTemplate(){
    return new RestTemplate();
}

请求路径上可以换成服务的名称

@RequestMapping("/orderToMember")
public String orderToMember() {
     // 使用本地rest形式实现rpc调用
     String result = restTemplate.getForObject("http://kaico-member/getUser", String.class);
     return "订单调用会员获取结果:" + result;
 }

使用 loadBalancerClient 实现负载均衡

@RequestMapping("/orderToMember")
public String orderToMember() {
    // 使用本地rest形式实现rpc调用
    ServiceInstance choose = loadBalancerClient.choose("kaico-member");
    return "获取结果:" + choose;
}

原理分析

ServiceInstance choose = loadBalancerClient.choose(“kaico-member”); 从这行代码分析,

客户端负载均衡器源码:

根据serviceId获取服务

可以支持的算法:默认是轮训

openfeign

openFeign是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用。

openfeign客户端作用:是一个Web声明式的Http客户端远程远程调用工具,底层是封装 HttpClient 技术。

openfeign属于 SpringCloud 自己研发,而 feign 是 netflix 研发的。

基本使用

提供服务方

接口

public interface MenberService {
    /**
     * 提供会员接口
     *
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Long userId);
}

接口的实现类

@RestController
public class MenberServiceImpl  implements MenberService {
    @Value("${server.port}")
    private String serverPort;
    @Override
    public String getUser(Long userId) {
        return "我是会员服务端口号为:" + serverPort;
    }
}

此时,服务方提供的接口已经准备好了

接下来编写接口调用方的代码:

1、引入maven 依赖

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

2、启动类上开启openfeign 注解:@EnableFeignClients

3、编写 feignClient 接口

@FeignClient(name = "kaico-member")
public interface MenberServiceFeign{
    /**
     * 提供会员接口
     *
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Long userId);
}

4、直接调用 MenberServiceFeign 接口的方法

@Autowired
private MenberServiceFeign menberServiceFeign;
@RequestMapping("/orderToMember")
public String orderToMember() {
    //测试openfeign 调用接口
    String user = menberServiceFeign.getUser(1L);
    return "获取结果:" + user;
}

总结:调用方在编写feignClient 接口代码时,只要方法代码和注解和提供方法接口代码一致即可,不要求类的全路径名称一致。然后在接口类上加上注解@FeignClient(name = “kaico-member”)并指定服务名称。openfeign默认是支持负载均衡:轮训算法(ribbon)

微服务的服务名称不能有下划线。

到此这篇关于Java Ribbon与openfeign区别和用法讲解的文章就介绍到这了,更多相关Java Ribbon与openfeign内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot如何读取模板文件

    springboot如何读取模板文件

    这篇文章主要介绍了springboot如何读取模版文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java9中新增的Collector收集器

    Java9中新增的Collector收集器

    这篇文章主要介绍了Java9中新增的Collector收集器,Collector作为收集器,简单来说就是将数据或元素收集到一起,并且flatMapping与收集器结合使用,通过提供智能元素集合进行分组。下文相关介绍需要的小伙伴可以参考一下
    2022-06-06
  • SPFA 算法实例讲解

    SPFA 算法实例讲解

    下面小编就为大家带来一篇SPFA 算法实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java实现读取resources目录下的文件路径的九种方式

    Java实现读取resources目录下的文件路径的九种方式

    本文主要介绍了Java实现读取resources目录下的文件路径的九种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 实战分布式医疗挂号系统之设置微服务接口开发模块

    实战分布式医疗挂号系统之设置微服务接口开发模块

    这篇文章主要为大家介绍了实战分布式医疗挂号系统之接口开发医院设置微服务模块,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 使用@TransactionalEventListener监听事务教程

    使用@TransactionalEventListener监听事务教程

    这篇文章主要介绍了使用@TransactionalEventListener监听事务教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JavaSE中compare、compareTo的区别

    JavaSE中compare、compareTo的区别

    本文主要介绍了JavaSE中compare、compareTo的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java中char[]输出不是内存地址的原因详解

    Java中char[]输出不是内存地址的原因详解

    这篇文章主要介绍了关于Java中char[]输出为什么不是内存地址的原因,文中通过示例代码介绍的很详细,需要的朋友们可以参考学习。
    2017-03-03
  • Spring的IOC控制反转详解

    Spring的IOC控制反转详解

    这篇文章主要为大家介绍了Spring的IOC控制反转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2022-01-01
  • 递归出现栈溢出stackoverflow的问题及解决

    递归出现栈溢出stackoverflow的问题及解决

    这篇文章主要介绍了关于递归出现栈溢出stackoverflow的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论