Java Ribbon与openfeign区别和用法讲解

Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。openfeign对Feign进行了增强,使其支持SpringMVC注解,另外还整合了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内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!

本文标题为:Java Ribbon与openfeign区别和用法讲解

基础教程推荐