SpringCloud系列之六:Fegin服务间调用,负载均衡

文章目录

      • Why
      • What?
      • How?

Why

What?

1.什么是Feign
Feign是一个声明式的Web服务客户端
使用:只需创建一个接口,然后在上面添加注解即可实现服务间调用,Feign是集成了Ribbon,也可实现负载均衡。

2.Feign 和Ribbon区别?
Ribbon
是一个基于 HTTP 和 TCP 客户端的负载均衡器
它可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载,Ribbon 是通过RestTemplate 模版拼接html进行调用。

@RestController
@Api(tags = {"部门表接口"})
@RequestMapping(value="/Dept")
public class DeptController_Consumer {

    //单机版
    // private static final String REST_URL_PREFIX="http://localhost:8001";

    //通过微服务名称访问微服务
    private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT8001";
    @Autowired
    private RestTemplate restTemplate;

    @PostMapping(value="/dept/add")
    public  boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }
}

Feign
feign本身里面就包含有了ribbon。是通过接口实现服务间调用的。。
Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去调用,而 Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。Feign是通过接口实现服务间调用的。
consumer 提供对外暴露的接口。添加注解@FeginClient,并打成jar包
provider 引入jar包,并在启动类添加注解扫描@EnableFeginClients 扫描@FeginClient的接口信息,直接调用接口里的方法即可。

@RestController
@Api(tags = {"部门表接口"})
@RequestMapping(value="/dept")
public class DeptController_Consumer {
    //面向接口编程
    @Autowired
    private DeptClientService deptClientService;

    @PostMapping(value="/add")
    public  boolean addDept(@RequestBody Dept dept){

        return deptClientService.addDept(dept);
    }

3. 原理
fegin 底层实现是基于http的调用,集成了ribbon来实现负载均衡。

1.启动配置上检查是否有@EnableFeignClients注解,如果有该注解,则开启包扫描,扫描被@FeignClient注解接口,扫描出该注解后,通过beanDefinition注入到IOC容器中,方便后续被调用使用。

2.当调用接口发起请求时,使用jdk动态代理为目标接口生成了一个动态大代理类,这里会生成一个InvocationHandler(jdk动态代理原理)统一的方法拦截器,同时为接口的每个方法生成一个SynchronousMethodHandler拦截器,并解析方法上的 元数据,生成一个http请求模板。

How?

Feign如何使用:
以做的一个项目为例:
https://blog.csdn.net/Sunny5319/article/details/82319587

Feign 与 Hystrix 结合使用:
在consumer 接口上添加fallback回调函数,即出现服务降级或者熔断之后要执行的方法

@FeignClient(name="product", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {

    @PostMapping("/product/findList")
    List<ProductInfoOutput> findList(@RequestBody List<String> productIdList);

    @PostMapping("/product/descreaseStock")
    void descreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);

    @Component
    static class ProductClientFallback implements ProductClient{

        @Override
        public List<ProductInfoOutput> findList(List<String> productIdList) {
            return null;
        }

        @Override
        public void descreaseStock(List<DecreaseStockInput> decreaseStockInputList) {

        }
    }
}

感谢您的阅读~~

你可能感兴趣的:(【SpringCloud】)