【转】 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 会报错