Ruta de aprendizaje de SpringCloud (6) - cliente HTTP de llamada remota Fingir

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.

inserte la descripción de la imagen aquí
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})

Supongo que te gusta

Origin blog.csdn.net/Zain_horse/article/details/131811525
Recomendado
Clasificación