Simulación dinámica y métodos de interfaz genéricos

¡Acostúmbrate a escribir juntos! Este es el día 12 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

Feign, En el marco de microservicios, la invocación directa del servicio se vuelve muy concisa y simple, y no hay necesidad de 编写Java Httpllamar a la interfaz de otros microservicios.

simulación dinámica

Para llamadas fingir, nuestro uso general es 微服务crear una feignclientinterfaz correspondiente para cada uno y luego controllerescribir el método correspondiente para cada interfaz de microservicio uno por uno para llamar a la interfaz de microservicio correspondiente.

Por ejemplo lo siguiente:

//system
@FeignClient(name = "system")
public interface SystemClient {
    @GetMapping("/system/test1")
    JsonResult test1(String test1);
    
    @GetMapping("/system/test2")
    JsonResult test2(String test2);
    
    ....
}

//user
@FeignClient(name = "user")
public interface UserClient {
    @GetMapping("/user/test1")
    JsonResult test1(String test1);
    
    @GetMapping("/user/test2")
    JsonResult test2(String test2);
    
    ....
}
复制代码

Si está escrito de esta manera, puede haber algunos 累赘, entonces podemos crear uno 动态的feign; al llamar sytem微服务, pasar uno feignclientpara nameentrar system, y luego definir uno 通用的方法, especificar el llamado, urly pasarlo 参数, ¿y eso es todo?

¡La respuesta es sí! ! ! ^_^

imagen.png

  • Definir una interfaz genérica, get genérico, métodos de publicación
public interface DynamicService {
    
    @PostMapping("{url}")
    Object executePostApi(@PathVariable("url") String url, @RequestBody Object params);

    @GetMapping("{url}")
    Object executeGetApi(@PathVariable("url") String url, @SpringQueryMap Object params);
}
复制代码

ejecutarPostApi: (método de publicación)

url, indicando que desea llamar a la url de la interfaz del microservicio, en general, controllerla url de la interfaz correspondiente;

params, los parámetros pasados ​​para llamar a la interfaz se agregan aquí @RequestBody, y la controllerinterfaz correspondiente, los parámetros de recepción también deben agregar esta anotación.

  • definir una dinámicafeignclient
@Component
public class DynamicClient {

    @Autowired
    private DynamicFeignClientFactory<DynamicService> dynamicFeignClientFactory;

    public Object executePostApi(String feignName, String url, Object params) {
        DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.class, feignName);
        return dynamicService.executePostApi(url, params);
    }

    public Object executeGetApi(String feignName, String url, Object params) {
        DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.class, feignName);
        return dynamicService.executeGetApi(url, params);
    }
}
复制代码

ejecutarPostApi: (método de publicación)

fingeName, que indica el nombre del microservicio a llamar, generalmente corresponde a application.name, por ejemplo:system

url, indicando que desea llamar a la url de la interfaz del microservicio, en general, controllerla url de la interfaz correspondiente;

params, los parámetros pasados ​​para llamar a la interfaz se agregan aquí @RequestBody, y la controllerinterfaz correspondiente, los parámetros de recepción también deben agregar esta anotación.

  • Definir una feignclientclase de fábrica dinámica
@Component
public class DynamicFeignClientFactory<T> {

    private FeignClientBuilder feignClientBuilder;

    public DynamicFeignClientFactory(ApplicationContext appContext) {
        this.feignClientBuilder = new FeignClientBuilder(appContext);
    }

    public T getFeignClient(final Class<T> type, String serviceId) {
        return this.feignClientBuilder.forType(type, serviceId).build();
    }
}
复制代码

La función principal: es ayudarnos a crear dinámicamente un feignclientobjeto

Bueno, específicamente 操作步骤, ¡eso es lo que dije arriba! ! ! ¿Es demasiado 通用? ^_^

Universal es universal, entonces, ¿cómo jugar ( 如何使用)?

imagen.png

La forma de usarlo también es muy sencilla: ^_^

DynamicClient dynamicClient = SpringUtil.getBean(DynamicClient.class);
Object result = dynamicClient.executePostApi("system", "/system/test", new HashMap<>());
System.out.println("==========>"+JSONObject.toJSONString(result));
复制代码

Obtenga el DynamicClientobjeto primero, luego llame al executePostApimétodo directamente

"sistema", que indica el nombre del microservicio que llama, que generalmente corresponde aapplication.name

"/sistema/prueba", lo que significa que el llamadourl

new HashMap<>(), el parámetro que debe pasarse

Bueno, esto ha implementado una versión general feignclient, ¡entonces podemos escribir código felizmente! ! ! ^_^

imagen.png

Supongo que te gusta

Origin juejin.im/post/7085661725881696293
Recomendado
Clasificación