zoukankan      html  css  js  c++  java
  • spring cloud学习笔记三 Feign与Ribbon负载均衡的区别

    一、Feign的介绍

      Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线添加注解,,同事也支持JAX-RX标准的注解,Feign也支持可拔插式的编码器和解码器,Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准直接和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用一支持负载均衡。

      Feign和Ribbon的区别是:

      简单的说,ribbon是直接通过微服务的地址调用服务,Feign是通过调用接口来进行调用服务。下面我就来根据二者的代码来分析两者的区别:

    二、Feign的服务调用与Ribbon的服务调用

    1.Ribbon的调用模式

      a.导入maven  

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

       b.创建一个RestBean注入RestTemplate,不直接注入到controller层的原因是:我们还会为RestTemplate注入其他的属性

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    //这个注解表示将这个类注入到spring boot的容器中
    @Configuration
    public class RestBean {
    
        @Bean
        @LoadBalanced
        //这个注解是Ribbon使用负载均衡的注解
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    
    }

      c.创建controller层,调用生产者服务

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.List;
    
    @RestController
    public class RibbonController {
        //此处的请求前缀是微服务提供者的服务名称,相当于localhost:8080
        private static final String producter_url = "http://productor";
    
        /**
         * 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
         * ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
         */
        @Autowired
        private RestTemplate restTemplate;
    
    
        @RequestMapping(value = "/consumer/dept/list")
        public List<String> list()
        {
            return restTemplate.getForObject(producter_url + "/show", List.class);
        }
    
    }

    我们可以看见,Ribbon的调用模式是直接通过响应为服务的地址进行访问

    2.Feign的调用模式

      a.导入maven

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

      b.创建一个controller

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    public class FeignController {
    
        @Autowired
        private FeignService feignShow;
    
    
        @RequestMapping(value = "/show")
        public List<String> feignMain() {
            
            return this.feignShow.show();
        }
    }

      c.创建service

    //这个注解表示要调用的微服务名称
    @FeignClient(value = "productor")
    public interface FeignService {
    
        //使用Feign方式调用服务,直接就能调用生产者接口的地址
        @RequestMapping(value = "/show", method = RequestMethod.GET)
        List<String> show();
    }

      从上面两个调用方式的对比我们可以看见:Ribbon中没有使用service,而是通过RestTemplate直接通过地址访问生产者的服务;Feign则是和我们平时使用的架构一样,只是service的接口没有自己去实现,而是直接去调用生产者的接口地址。

  • 相关阅读:
    document对象补充
    JavaScript(DOM操作)(Window.document对象)
    DOM、Window操作
    JavaScript基础
    格式布局
    洛谷P2756 飞行员配对方案问题
    洛谷P2526 【SHOI2001】小狗散步
    洛谷P1129 【ZJOI2007】矩阵游戏
    洛谷P1640 【SCOI2010】连续攻击游戏
    二分图
  • 原文地址:https://www.cnblogs.com/daijiting/p/11121064.html
Copyright © 2011-2022 走看看