HTTP和RPC的区别

严格来讲,HTTP和不是一个层面的东西。

● HTTP(Hypertext Transfer Protocol)是一种应用层协议,主要强调的是网络通信;

● RPC(Remote Procedure Call,远程过程调用)是一种用于分布式系统之间通信的协议,强调的是服务之间的远程调用。

一些RPC框架比如gRPC,底层传输协议其实也是用的HTTP2,包括Dubbo3,也兼容了gRPC,使用了HTTP2作为传输层的一层协议。

微服务同时调用多个服务需要使用线程池吗 两个微服务相互调用_HTTP


如果硬要说区别的话,如下:

微服务同时调用多个服务需要使用线程池吗 两个微服务相互调用_微服务同时调用多个服务需要使用线程池吗_02


在微服务体系里,基于HTTP风格的远程调用通常使用框架如Feign来实现,基于RPC的远程调用通常使用框架如Dubbo来实现。

Feign和Dubbo的区别

这两个才是适合拿来比较的东西:

微服务同时调用多个服务需要使用线程池吗 两个微服务相互调用_架构_03


需要注意的是,Feign和Dubbo并不是互斥的关系。实际上,Dubbo可以使用HTTP协议作为通信方式,而Feign也可以集成RPC协议进行远程调用。选择使用哪种远程调用方式取决于具体的业务需求和技术栈的选择。Fegin调用的实现

Feign是一个声明式的Web服务客户端,它简化了使用基于HTTP的远程服务的开发。

Feign是在RestTemplate 和 Ribbon的基础上进一步封装,使用RestTemplate实现Http调用,使用Ribbon实现负载均衡。

微服务同时调用多个服务需要使用线程池吗 两个微服务相互调用_HTTP_04


Feign的主要特点和功能包括:

  1. 声明式API:Feign允许开发者使用简单的注解来定义和描述对远程服务的访问。通过使用注解,开发者可以轻松地指定URL、HTTP方法、请求参数、请求头等信息,使得远程调用变得非常直观和易于理解。
1.  @FeignClient(name = “example”, url = “https://api.example.com”)
 public interface ExampleService {
 @GetMapping(“/endpoint”)
 String getEndpointData();
 }
  1. 集成负载均衡:Feign集成了Ribbon负载均衡器,可以自动实现客户端的负载均衡。它可以根据服务名和可用实例进行动态路由,并分发请求到不同的服务实例上,提高系统的可用性和可伸缩性。
  2. 容错机制:Feign支持集成Hystrix容错框架,可以在调用远程服务时提供容错和断路器功能。当远程服务不可用或响应时间过长时,Feign可以快速失败并返回预设的响应结果,避免对整个系统造成级联故障。

Feign第一次调用
Feign第一次调用耗时很长,主要原因是由于Ribbon的懒加载机制,当第一次调用发生时,Feign会触发Ribbon的加载过程,包括从服务注册中心获取服务列表、建立连接池等操作,这个加载过程会增加首次调用的耗时。

ribbon:
  eager-load:
    enabled: true
      clients: service-1

那怎么解决这个问题呢?
可以在应用启动时预热Feign客户端,自动触发一次无关紧要的调用,来提前加载Ribbon和其他相关组件。这样,就相当于提前进行了第一次调用。

Feign认证传递
比较常见的一个做法是,使用拦截器传递认证信息。可以通过实现RequestInterceptor接口来定义拦截器,在拦截器里,把认证信息添加到请求头中,然后将其注册到Feign的配置中。

@Configuration
public class FeignClientConfig {

    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                // 添加认证信息到请求头中
                template.header("Authorization", "Bearer " + getToken());
            }
        };
    }

    private String getToken() {
        // 获取认证信息的逻辑,可以从SecurityContext或其他地方获取
        // 返回认证信息的字符串形式
        return "your_token";
    }
}

以上是关于Feigen的调用与实现,如何实现负载均衡见下一篇。