1. Fingir reemplaza RestTemplate
Ejemplo de RestTemplate
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
Defectos de RestTemplate:
- La legibilidad del código es deficiente y la experiencia de codificación no es uniforme.
- Las URL con parámetros complejos son difíciles de mantener
(1) El concepto de Fegin
Fegin es un cliente http declarativo. El sitio web oficial: https://github.com/OpenFeign/feign se
utiliza para ayudar a simplificar el envío de solicitudes http.
(2) Uso básico de Fegin
1. Introducir dependencias
<dependency>
<groupId>org.springframework.cloud</gourpId>
<artifactId>spring.cloud.starter.openfeign</artifactId>
</dependency>
2. Agregue anotaciones a la clase de inicio para iniciar Fegin
@EnableFeignClients //启动Fegin客户端
@MapperScan("xxx.xxx.xxx.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
3. Definir el cliente Fegin
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
Se basa principalmente en anotaciones SpringMVC para declarar información de llamadas remotas, como:
- Nombre del servicio: servicio de usuario
- Método de solicitud: OBTENER
- Ruta de solicitud: /usuario/{id}
- Parámetro de solicitud: identificación larga
- Valor devuelto: Usuario
3. El servicio utiliza el cliente Fingir
@Service
public class OrderService {
@Autowired
private OrderMapper mapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
Order order = orderMapper.findById(orderId);
User user = userClient.getById(order.getUserId());
order.setUser(user);
return order;
}
}
2. Configuración personalizada
Una tabla de configuración que se puede modificar.
tipo | efecto | ilustrar |
---|---|---|
fingir.Logger.Level | Modificar nivel de registro (común) |
Contiene cuatro niveles: NINGUNO, BÁSICO, ENCABEZADOS, COMPLETO
|
fegin.codec.Decodificador | Analizador de resultados de respuesta |
Analice los resultados de las llamadas remotas http, como analizar JSON
|
fegin.codec.Encoder | Solicitar formato de codificación de parámetros |
Codifique los parámetros de la solicitud para facilitar el envío de solicitudes http
|
fingir.Contrato | Formatos de anotación admitidos |
El valor predeterminado son las anotaciones de SpringMVC.
|
contento.reintentar | Mecanismo de reintento fallido |
El mecanismo de reintento en caso de falla de la solicitud, el valor predeterminado es no, pero se usará el reintento de Ribbon
|
(1) Realización de la modificación de la configuración
Método 1: método del archivo de configuración
fegin:
client:
config:
default: #设置全局配置,若是直接写服务名称,则是针对某一个微服务的配置
loggerLevel: FULL #全日志级别
Método 2: personalizar la configuración de Fingir
Clase de configuración FeignClientConfiguration
//配置注解选择一种即可
//全局配置:在启动类上加上该注解
//@EnableFeginClients(defaultConfiguration = FeignClientConfiguration.class)
//局部配置:具体Client类上加该注解
//@FeginClient(value = "userservice", configuration = FeignClientConfiguration.class)
public class FeignClientConfiguration {
@Bean
public Logger.Level.feignLogLevel(){
return Logger.Level.BASIC;
}
}
3. Fingir optimización
(1) Implementación del cliente subyacente de Fingir (tres modos)
- URLConnection: implementado de forma predeterminada, no admite la agrupación de conexiones (JDK viene con él)
- Apache HttpClient: admite la agrupación de conexiones
- OKHttp: grupo de conexiones de soporte
(2) Optimización del rendimiento de Fegin
- 1. Use el grupo de conexiones en lugar de URLConnection
- 2. Nivel de registro, preferiblemente configurado como BÁSICO o NINGUNO
(3) Configure el grupo de conexiones en lugar de URLConnection
1. Introducir la dependencia de HttpClient
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2. Configurar el grupo de conexiones
feign:
client:
config:
default: #全局配置
loggerLevel: BASIC #日志级别,打印最基本的请求和响应信息
httpclient:
enabled: true #开启feign对httpclient的支持
max-connections: 200 #最大连接数
max-connections-per-route: 50 #每个路径的最大连接数
Cuarto, la experiencia de implementar FeignClient resumida en la práctica
(1) Método 1 (herencia): defina una interfaz principal unificada para el FeignClient del consumidor y el controlador del proveedor como estándar.
1. Date cuenta:
interfaz principal
public interface UserAPI{
@GetMapping("/user/{
id})
User findById(@PathVariable("id") Long id);
}
UserClient hereda la interfaz principal
@FeignClient(value = "userservice")
public interface UserClient extends UserAPI{
}
UserController implementa la interfaz principal
@RestController
public class UserController implements UserAPI {
public User findById(@PathVariable("id") Long id) {
//...实现业务
}
}
2. Defectos de este método
- Servicios estrechamente acoplados
- La asignación de la lista de parámetros de la interfaz principal no se heredará
(2) Método 2 (extracción): extraiga FeignClient como un módulo independiente y coloque el POJO relacionado con la interfaz y la configuración predeterminada de Feign en este módulo para que lo usen todos los consumidores.
1. Date cuenta
(1) Creación de módulos
Cree un módulo, llamado fingir-api, e introduzca la dependencia inicial de fingir
(2) Extracción de clase de función de módulo
Coloque la clase que debe extraerse en el módulo fingir-api.
(3) Usar fingir-api
El servicio al consumidor introduce la dependencia de fingir-api
(4) Fingir-api de importación de servicios al consumidor
2. Posibles problemas
UserClient no se crea como un objeto Bean por Spring
-
Motivo: FeginClient está fuera del alcance de la exploración del paquete de servicios del consumidor, por lo que no se introducen instancias.
-
solución:
Método 1: Especificar FeignClient para sentarse en el paquete
@EnableFeignClients(basePackages = "xxx.xxx.xxx.clients")
Método 2: especificar el código de bytes de FeignClient
@EnableFeignClients(clients= {
UserClient.class})