【转】 SpringCloudAlibaba--03——feign

【转】 SpringCloudAlibaba--03——feign

 参考地址:蚂蚁课堂视频

* 本地负载均衡和Nginx的区别

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

那么,本地负载均衡器有哪些?可以自己写(比如那个轮询算法)、Ribbon(SpringCloud第一代的)、LoadBalancerClient(SpringCloud自己研发,第二代的)

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

本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,既本地负载均衡器。

意思就是,先去Nginx 上负载均衡,拿到服务以后,再负载均衡到服务器上,请求到的服务

之前手写的轮询算法实现的负载均衡,现在用@LoadBalanced 注解 + RestTemplate 实现负载均衡

  /**
     * 基于Ribbon实现本地负载均衡
     *
     * @return
     */
    @RequestMapping("/orderToRibbonMember")
    public Object orderToRibbonMember() {
        String result = restTemplate.getForObject("http://meitemayikt-member/getUser", String.class);
        return "订单调用会员返回结果:" + result;
    }

这样可以拿到注册中心的地址,注意别忘记在主启动类的RestTemplate 加上注解:

    /**
     * 加上LoadBalanced 注解就可以实现我们的本地负载均衡
     *
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

这个根本不用引入Ribbon 的jar包,为啥嘞?

为什么只需要加入@LoadBalanced 注解 就直接可以负载均衡呢?

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

@LoadBalanced 注解的源码:

package org.springframework.cloud.client.loadbalancer;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}

点进去可以看到,用的是LoadBalancerClient,底层默认原理是调用ribbon实现客户端负载均衡器。

等同于:

  // 先注入LoadBalancerClient
  @Autowired
  private LoadBalancerClient loadBalancerClient;
  /**
     * 根据loadBalancerClient 实现客户端负载均衡
     *
     * @return
     */
    @RequestMapping("/loadBalancerClientMember")
    public Object loadBalancerClientMember() {
        ServiceInstance result = loadBalancerClient.choose("meitemayikt-member");
        return result;
    }

LoadBalancerClient为什么就可以调用到Ribbon ??

我们可以点进去 .choose 方法,发现它是个接口,是个父类!我们点进去他的子类,就可以看到:

 这个RibbonLoadBalancerClient 实现了LoadBalancerClient 这个接口,所以LoadBalancerClient 可以调用到Ribbon

举一反三,如果我们自己去写一个负载均衡器,只要实现LoadBalancerClient 这个接口就可以了

OpenFeign客户端

SpringCloud 第一代使用的是Feigin 客户端,第二代使用的是OpenFeign 客户端。

OpenFeign是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用。底层封装的HttpClient 技术。

Feign 客户端从16年到现在一直都没有更新,而OpenFeign 一直在更新。  

Feigin 是netflix 写的,OpenFeign 是SpringCloud 自己写的。  

OpenFeign 整合项目

创建微服务项目:

mayikt-opefeign-parent---父工程

---mayikt-service-api----微服务Api接口层

----mayikt-member-service-api

----mayikt-order-service-api

---mayikt-service-impl----微服务Api实现层

----mayikt-member-service-impl

----mayikt-order-service-api

这是微服务架构的基本样式,最大的优点能够能够对Feign 实现复用机制。

服务名称 命名时候不可以使用下划线 _ ,不然OpenFeign 会报错

原文地址:https://www.cnblogs.com/Javastudy-note/p/13818354.html