您的当前位置:首页正文

Feign实现远程接口的调用

2024-11-26 来源:个人技术集锦


前言

在自己跟着做项目过程中,对springcloud中的feign实现远程调用不太熟悉,故记录一下


一、Fegin是什么?

Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解.Feign也支持可拔插式的编码器和解码器.Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.Feign可以与EurekaRibbon组合使用以支持负载均衡.

二、Feign使用步骤

准备工作

被调用的远程服务必须上传到nacos/eureka服务中心进行管理配置,比如我调用media-api服务(媒资管理服务),那么media-api必须被nacos/eureka所管理。如图,都注册到配置中,并且启动起相关的服务。

在启动类添加feign的注解

如果我1服务远程调用2服务,我需要在1服务配置feign的相关注解

@EnableFeignClients(basePackages={"com.xuecheng.content.feignClient"}) //如果feign注册的服务器不跟启动类同一个包,需要配置所在的包名
@SpringBootApplication

1.引入依赖

 <!-- Spring Cloud 微服务远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.配置好feign

代码如下(示例):

spring:
  application:
    name: content-api #服务名
#  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://192.168.101.65:3306/xyh_content?serverTimezone=UTC&userUnicode=true&useSSL=false&
#    username: root
#    password: mysql
    
  cloud:
    nacos:
      server-addr: 192.168.101.xx:8848 #nacos服务端口号
      discovery:
        namespace: xyh_dev #nacos空间名称
        group: xuecheng-plus-project #nacos组名
      config:
        namespace: xyh_dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true
        extension-configs: #扩展配置,只有自己服务进行配置
          - data-id: content-service-${spring.profiles.active}.yaml
            group: xuecheng-plus-project
            refresh: true 
          - data-id: search-${spring.profiles.active}.yaml #这个是els全文索引的配置
            group: xuecheng-plus-project
            refresh: true
        shared-configs: #共享配置,所有服务都需要用的放在共享配置
          #- data-id: swagger-${spring.profiles.active}.yaml #这个是swagger的配置
            #group: xuecheng1-common
            #refresh: true
          - #data-id: logging-${spring.profiles.active}.yaml #这个是日志的配置
            #group: xuecheng1-common
            #refresh: true
          #- data-id: freemarker-config-${spring.profiles.active}.yaml  #这个是freemarker文件渲染配置
            #group: xuecheng1-common
            #refresh: true
          - data-id: feign-${spring.profiles.active}.yaml #这个是我们的feign的配置
            group: xuecheng1-common
            refresh: true
  profiles:
    active: xyh_dev #环境名

咱们的服务中的配置文件需要去找nacos中feign的配置:

feign:
  hystrix:
    enabled: true
  circuitbreaker:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000  #熔断超时时间
ribbon:
  ConnectTimeout: 60000 #连接超时时间
  ReadTimeout: 60000 #读超时时间
  MaxAutoRetries: 0 #重试次数
  MaxAutoRetriesNextServer: 1 #切换实例的重试次数

3.创建好feign的客户端,用于引入远程服务的接口

例如:远程调用媒资服务中的上传文件接口

//远程调用媒资服务接口 value:远程服务在nacos上的配置名称 fallbackFactory熔断降级调用的类
@FeignClient(value = "media-api",configuration = {MultipartSupportConfig.class},fallbackFactory = com.xuecheng.content.feignClient.MediaServiceClientFallbackFactory.class)
public interface  MediaServiceClient {
	//直接使用restful类型调用媒资管理服务下面对应的接口
    @RequestMapping(value = "/media/upload/coursefile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadFile(@RequestPart("filedata") MultipartFile upload, @RequestParam(value = "objectName",required=false) String objectName);

}

我们还需要注册一个熔断降级的类,我们自己定义,如果客户端返回null说明远程调用时发生了熔断降级

@Slf4j
@Component
public class MediaServiceClientFallbackFactory implements FallbackFactory<MediaServiceClient> {
    @Override
    public MediaServiceClient create(Throwable throwable) {
        return new MediaServiceClient() {
            @Override
            public String uploadFile(MultipartFile upload, String objectName) {
                //降级方法
                log.debug("调用媒资管理服务上传文件时发生熔断,异常信息:{}",throwable.toString(),throwable);
                return null;
            }
        };
    }
}

4.进行远程调用,注入对应的远程调用客户端

显示全文