同服务间http请求处理

362 阅读2分钟

这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

背景

​ 在微服务的背景下,若出现资源紧张,不得已的情况下需要合并部分微服务,但又需要保证在某些条件允许下也能拆分各个业务模块,即某些业务服务在使用时技能合并为一个服务启动使用,也能拆分为独立服务运行使用。这时就涉及到一个问题,将这些业务服务通过模块化的方式进行合并后,每个业务服务之间为了保证依赖的独立性,怎么使得模块间的http调用减少请求资源。

分析

​ 比如在一个服务X内合并了ABC,三个模块,且三个模块之间又相互独立不进行相互引用,那么这三个模块间若需要进行相互之间的调用,该如何处理。实际上最简单的做法,将这个服务X注册到注册中心中,这里这三个模块对应的http请求实际上也都注册到了注册中心,这时如果出现了相互之间的调用,通过feign就可以达到相互访问的目的。但是如果通过这种方式会存在增加了http的请求。所以如何做到本服务内的feign请求不进行http访问,而是通过本地接口进行请求。

1.可以通过设置feign的优先级,将需要进行本地调用的http转为本地接口调用。

// 设置primary=false
@FeignClient(name="server",path ="xxServer", contextId = "server",primary = false)
public interface ServerFeignClient {

    String getStudentName(String id);
}

2.创建类实现改接口,因为虽然有三个模块,但是所有的bean对象都会注入到同一个容器中,这里是可以获取到不用模块的bean对象。所以这里注入Controller对应的对象,就可以模拟原来的http请求进行调用,这种方式也不会丢失掉原业务中如果存在的一些拦截、动态代理等特性。

public class ServerProxyClient implements ServerFeignClient{

    String getStudentName(String id){
        //进行本地调用的业务逻辑
    }
}

3.客户端调用

private void getStudentName(){
  Symtem.out.print(serverFeignClient.getStudentName("1");
}

总结

​ 通过这种方式进行同服务间不同模块的本地调用,在某些情况下可以减少服务间的http请求而导致的资源消耗,都是通过本地直接调用,提高服务模块间调用的性能。