Spring Cloud之声明式服务调用(Feign)

目录

OpenFeign

简介

常用注解

远程调用

超时控制

配置

日志增强

Feign

远程调用方式

简介

使用

1.引入依赖

2.添加注释

3.编写Feign客户端

4.测试

实现原理

自定义配置

1.日志级别

2.响应结果解析器

3.请求参数编码

4.支持的注解格式

5.失败的重试机制

Feign VS OpenFeign 

相同点

不同点


OpenFeign

简介

        是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign;OpenFeign 是对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持。

常用注解

注解 说明
@FeignClient  该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。
@EnableFeignClients 该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。
@RequestMapping Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。
@GetMapping Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。
@PostMapping Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。

        Spring Cloud Finchley 及以上版本一般使用 OpenFeign 作为其服务调用组件。由于 OpenFeign 是在 2019 年 Feign 停更进入维护后推出的,因此大多数 2019 年及以后的新项目使用的都是 OpenFeign,而 2018 年以前的项目一般使用 Feign。

远程调用

1.添加依赖

  1. org.springframework.cloud
  2. spring-cloud-starter-openfeign

2.创建接口,并在该接口上使用 @FeignClient 注解实现对服务接口的绑定

//添加为容器内的一个组件
@Component
// 服务提供者提供的服务名称,即 application.name
@FeignClient(value = "MICROSERVICECLOUDPROVIDERDEPT")
public interface DeptFeignService {
    //对应服务提供者(8001、8002、8003)Controller 中定义的方法
    @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
    public Dept get(@PathVariable("id") int id);
    @RequestMapping(value = "/dept/list", method = RequestMethod.GET)
    public List list();
}

注意:

        1.在 @FeignClient 注解中,value 属性的取值为:服务提供者的服务名,即服务提供者配置文件(application.yml)中 spring.application.name 的取值

        2.接口中定义的每个方法都与服务提供者中 Controller 定义的服务方法对应

3.创建一个Controller 类

@RestController
public class DeptController_Consumer {
    
    @Resource
    private DeptFeignService deptFeignService;
    @RequestMapping(value = "/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Integer id) {
        return deptFeignService.get(id);
    }
    @RequestMapping(value = "/consumer/dept/list")
    public List list() {
        return deptFeignService.list();
    }
}

4.在主启动类上添加 @EnableFeignClients 注解开启 OpenFeign 功能

@SpringBootApplication
@EnableFeignClients //开启 OpenFeign 功能
public class MicroServiceCloudConsumerDeptFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudConsumerDeptFeignApplication.class, args);
    }
}

        应用在启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口生成代理,并注人到 Spring 容器中

5.依次启动服务注册中心集群、服务提供者

超时控制

        OpenFeign 客户端的默认超时时间为 1 秒钟,如果服务端处理请求的时间超过 1 秒就会报错。为了避免这样的情况,我们需要对 OpenFeign 客户端的超时时间进行控制。

配置

application.yml 中添加以下配置

ribbon:

        ReadTimeout: 6000 #建立连接所用的时间,适用于网络状况正常的情况下,两端两端连接所用的时间

        ConnectionTimeout: 6000 #建立连接后,服务器读取到可用资源的时间

日志增强

        OpenFeign 提供了日志打印功能,我们可以通过配置调整日志级别;Feign 为每一个 FeignClient 都提供了一个 feign.Logger 实例,通过它可以对 OpenFeign 服务绑定接口的调用情况进行监控。

logging:

        level:

                #feign 日志以什么样的级别监控该接口

                net.biancheng.c.service.DeptFeignService: debug

说明:

        net.biancheng.c.service.DeptFeignService 是开启 @FeignClient 注解的接口(即服务绑定接口)的完整类名。也可以只配置部分路径,表示监控该路径下的所有服务绑定接口

        debug:表示监听该接口的日志级别

Logger.Level 的具体级别如下:

        NONE:不记录任何信息。

        BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。

        HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。

        FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。

Feign

远程调用方式

在Spring cloud 中服务之间通过restful方式调用有两种方式

1.restTemplate+Ribbon :通过服务名称远程调用服务

//url
String url = "http://user-service:8081/user/" + order.getUserId();
//发起调用
User user = restTemplate.getForObject(url,User.class);

2.feign:通过接口和注解远程调用服务

简介

        Feign是一个声明式的web service客户端,它使得编写web service客户端更为容易。创建接口,为接口添加注解,即可使用Feign。Feign可以使用Feign注解或者JAX-RS注解。Spring Cloud为Feign添加了Spring MVC的注解支持,并整合了Ribbon和Eureka来为使用Feign时提供负载均衡。 feign让微服务之间的调用变得更简单了。

使用

1.引入依赖

在调用其他微服务的微服务 order-service 的 pom.xml 中添加


    org.springframework.cloud
    spring-cloud-starter-openfeign

2.添加注释

在调用其他微服务的微服务 order-service 的启动类添加注解开启 Feign 的功能

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
​
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
​
}

3.编写Feign客户端

新建一个接口

​
@FeignClient("user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

        在该接口中配置@FeignClient(value = "***")注解,value值为服务名,可以被其他服务直接调用,通过客户端去找springcloud-provider服务名,进行负载均衡

4.测试

实现原理

        Feign的实现比较简单,它集成了Rebbon,它只要编写一个接口和使用注解即可,它是将所有的业务内容写在一个接口中,服务消费者通过属性注入该接口,去调用该接口中的方法即可完成远程服务间的调用,这样就感觉到远程服务间的调用和之前的本地Controller层调用service层的实现一样简单

自定义配置

1.日志级别

feign.Logger.Level

包含4种不同的级别:

        NONE:不记录任何信息。

        BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。

        HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。

        FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。

2.响应结果解析器

feign.codec.Decoder:http远程调用的结果做解析

3.请求参数编码

feign.codec.Encoder:请求参数编码,便于通过http请求发送

4.支持的注解格式

默认SpringMVC注解

5.失败的重试机制

默认没有,不过内部集成了Ribbon,会使用Ribbon的重试

Feign VS OpenFeign 

相同点

1.Feign与OpenFeign作用一样,都是SpringCloud下的远程调用和负载均衡组件

2.Feign与OpenFeign都对Ribbon进行了集成,并通过Ribbon实现了客户端的负载均衡

3.Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用

不同点

1.Feign 和 OpenFeign 的依赖项不同,Feign 的依赖为 spring-cloud-starter-feign,而 OpenFeign 的依赖为 spring-cloud-starter-openfeign

2.Feign 和 OpenFeign 支持的注解不同,Feign 支持 Feign 注解和 JAX-RS 注解,但不支持 Spring MVC 注解;OpenFeign 除了支持 Feign 注解和 JAX-RS 注解外,还支持 Spring MVC 注解

你可能感兴趣的:(Spring,Cloud,spring,cloud,spring,后端,Feign,OpenFeign,java,服务调用)