基于Feign远程调用

发布时间 2023-10-30 09:21:17作者: monkey大佬

Feign的介绍

  Feign是一个声明式的http客户端,官方地址:Spring Cloud OpenFeign

 

定义和使用Feign

1.引入依赖

        <!-- feign 客户端依赖(声明式服务调用) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.在order-service的启动类添加注解开始Feign的功能

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication //配置类
@EnableFeignClients(clients = {UserClient.class})// 指定需要加载的Client接口
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

3.编写Feign客户端:

/**
 * Feign可以把Rest的请求进行隐藏,伪装成类似Spring MVC的Controller一样。不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做
 */
@FeignClient("userserver")
public interface UserClient {
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

主要基于SpringMVC的注解来声明远程调用的信息,

  服务名称:userserver

  请求方式:GET

  请求路径:/user/{id}

  请求参数:Long id

  返回值类型:User

4.server调用

package cn.itcast.order.service;

import cn.itcast.order.clients.UserClient;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;


    @Autowired
    private UserClient userClient;

    //基于Feign实现远程调用
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.用Feign远程调用
        User byId = userClient.findById(order.getUserId());
        //3.封装user到Order
        order.setUser(byId);
        // 4.返回
        return order;
    }
}

 

 

自定义Feign的配置

方式一:配置文件方式

1.全局生效

feign: #Feign日志 全局
  client:
    config:
      default: #局部 切换服务名称
        loggerLevel: FULL

2.局部生效

feign: #Feign日志 全局
  client:
    config:
      userserver: #局部 切换服务名称
        loggerLevel: FULL

 

方式二:java代码方式,需要先声明一个Bean:(创建包config)

public class DefaultFeignConfiguration {
    @Bean //配置日志
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC;
    }    
}

全局配置

 局部配置

 

Feign优化性能

Feign添加HttpClient的支持

引入依赖:

        <!-- 引入HttpClient依赖 -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

配置连接池:

feign: # Feign性能优化
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 #最大连接数
    max-connections-per-route: 50 #单个路径的最大连接数