Cuando llamamos entre los dos servicios antes, usamos restTemplate, pero hay muchos problemas al llamar de esta manera
String url = "http://userservice/user/" + order.getUserId();
- Mala legibilidad del código y experiencia de codificación inconsistente
- Las URL con parámetros complejos son difíciles de mantener
Así que lanzamos vigorosamente a nuestro protagonista hoy -- Fegin
Feign es un cliente http declarativo, su función es ayudarnos a enviar solicitudes http con elegancia y resolver los problemas anteriores.
Definir y usar el cliente Fegin
1. Introducir dependencias
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. Agregue anotaciones a la clase de inicio del servicio A para habilitar la función de Figin
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients//Feign的客户端
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3. Escriba el cliente de Fingir:
@FeignClient(value = "userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
/*
基于SpringMVC的注解来声明远程调用的信息
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
*/
4. Use el cliente Fegin en lugar de RestTemplate
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.用Feign远程调用
User user = userClient.findById(order.getUserId());
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
Pasos para usar Fegin :
- Introducir dependencias
- Agregue la anotación @EnableFeginClient
- Escribir interfaz FeginClient
- Use métodos definidos en FeginClient en lugar de RestTemplate
Personalice la configuración para anular la configuración predeterminada, que se puede modificar como:
tipo | efecto | ilustrar |
fegin.Logger.Decodificador | Modificar nivel de registro | Contiene cuatro niveles diferentes: NINGUNO, BÁSICO, ENCABEZADOS, COMPLETO |
fingir.códec.Decodificador |
Analizador del resultado de la respuesta |
Analizar los resultados de llamadas remotas http , como analizar cadenas json en objetos java |
fingir.códec.codificador |
codificación de parámetros de solicitud |
Codifique los parámetros de solicitud para enviar a través de solicitudes http |
fingir. Contrato |
Formatos de anotación admitidos |
El valor predeterminado es la anotación de SpringMVC. |
fingir. reintentador |
Mecanismo de reintento fallido |
El mecanismo de reintento para falla de solicitud, el valor predeterminado es no, pero se usará el reintento de Ribbon |
Personaliza la configuración de Fegin
En general, hay dos formas de configurar los registros de Fegin:
método uno:
1. Entra en vigor a nivel mundial:
feign:
client:
config:
default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL #日志级别
2. Efecto parcial
feign:
client:
config:
userservice: #这里userseervice就是局部变量
loggerLevel: FULL #日志级别
Método 2 (método de código Java):
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
1. Si es una configuración global, póngala en la anotación @EnableFeginClients:
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeign
2. Si es una configuración parcial, póngala en la anotación @FeginClient:
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
Optimización del rendimiento de Fegin
Implementación del cliente subyacente de Fegin:
- URLConnection: implementación predeterminada, no es compatible con el grupo de conexiones
- Apache HttpClient: grupo de conexiones de soporte
- OKHttp: grupo de conexiones de soporte
La optimización del rendimiento de Fegin incluye principalmente:
- Use un grupo de conexiones en lugar de la URLConnection predeterminada
- Nivel de registro, preferiblemente básico o ninguno
Fegin agrega compatibilidad con FttpClient:
Dependencias de importación:
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
Configure el grupo de conexiones:
feign:
client:
config:
default: #这里default就是全局变量,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL #日志级别
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
Mejores prácticas de Fegin
@EnableFeignClients(clients ="com.ffyc.fegin.clients")
Si el cliente de Fegin se separa de acuerdo con el segundo método, estos clientes de Fegin no se pueden usar al iniciar el rango de paquetes de escaneo de SpringBootAppliaction, por lo que debemos resolver este problema.
Método 1 (especifique el paquete donde se encuentra FeginClient):
@EnableFeignClients(clients ="ffyc.com.fegin.clients")
Método 2 (especifique el código de bytes de FeginClient):
@EnableFeignClients(clients ={ UserClient.class})