HTTP协议和RPC协议:之间调用问题?


前言

当被问及到HTTP协议和RPC协议时,被问到,当一个系统支持HTTP协议,另一个系统支持RPC协议,在不限定语言的情况下两个系统能否实现调用:
1、HTTP协议的系统调用RPC协议的系统怎么调用
2、RPC协议的系统调用HTTP协议的系统怎么调用
应该怎么回答

我的回答是无脑


提示:以下是本篇文章正文内容,下面案例可供参考

一、能否实现

答案是必然的,在程序员的角度里边没有干不了的事情

1、HTTP协议的系统调用RPC协议的系统

HTTP协议的系统调用RPC协议的系统时,由于HTTP是一个通用的、无状态的协议,通常用于Web服务之间的通信,而RPC则是针对远程过程调用的协议,更专注于服务之间的方法调用。要实现HTTP系统调用RPC系统,通常需要通过一个中间层或代理来实现。

调用前提:

  • RPC系统需要提供一个API网关或HTTP接口,以便HTTP系统可以通过HTTP请求进行调用。
  • RPC系统需要有一个客户端库,用于在HTTP系统中进行RPC调用。

方法一:HTTP API网关

  • HTTP API网关:在RPC系统之前部署一个HTTP API网关。这个网关负责接收HTTP请求,将其转换为RPC请求,并发送给RPC系统。同样,当RPC系统返回响应时,网关再将RPC响应转换为HTTP响应返回给HTTP客户端。

  • 实现:

    • 网关需要理解HTTP请求和RPC请求之间的映射关系。
    • 网关需要知道如何与RPC系统进行通信(例如,通过某个RPC框架的客户端库)。
    • 网关可能还需要处理安全性、身份验证、限流、熔断等功能。

方法二:编写适配器

  • 适配器模式:在HTTP系统中编写一个适配器,该适配器负责将HTTP请求转换为RPC请求,并调用RPC系统的客户端库来发送请求。
  • 实现:
    • 适配器需要理解HTTP请求的结构和RPC请求的结构。
    • 适配器需要包含RPC系统的客户端库作为依赖项。
    • 适配器需要处理RPC调用的异常,并将其转换为HTTP响应中的错误信息。

2、RPC协议的系统调用HTTP协议的系统

RPC协议的系统调用HTTP协议的系统时,同样需要一个中间层或代理来实现。

调用前提:

  • HTTP系统需要提供RESTful API或其他HTTP接口供RPC系统调用。
  • RPC系统需要有一个HTTP客户端库,用于发送HTTP请求到HTTP系统。

方法一:RPC客户端适配器

  • RPC客户端适配器:在RPC系统中编写一个客户端适配器,该适配器负责将RPC调用转换为HTTP请求,并使用HTTP客户端库发送请求到HTTP系统。
  • 实现:
    • 适配器需要理解RPC请求的结构和HTTP请求的结构。
    • 适配器需要包含HTTP客户端库作为依赖项。
    • 适配器需要处理HTTP响应,并将其转换为RPC调用的结果或异常。

方法二:HTTP API客户端

  • 直接使用HTTP API客户端:在RPC系统中直接使用某个HTTP客户端库(如Apache HttpClient、OkHttp等)来发送HTTP请求到HTTP系统。
  • 实现:
    • RPC系统需要知道HTTP系统的URL和API端点。
    • RPC系统需要构建符合HTTP系统要求的HTTP请求(包括请求头、请求体等)。
    • RPC系统需要处理HTTP响应,并将其转换为RPC调用的结果或异常。

总结:

  1. 在不限定语言的情况下,只要两个系统都提供了相应的接口和协议支持,HTTP协议的系统和RPC协议的系统是可以实现调用的。
  2. 通常需要一个中间层或适配器来实现协议之间的转换和通信。
  3. 在实现过程中,需要考虑安全性、性能、错误处理等方面的问题。
  4. 选择合适的方法取决于具体的需求和场景,例如系统的复杂性、对性能的要求、对安全性的要求等。

二、使用步骤-Java环境结合Dubbo

Dubbo调用HTTP

在Dubbo服务中调用HTTP服务,你需要使用Java的HTTP客户端库,如Apache HttpClient、OkHttp或Spring的RestTemplate。以下是一个使用RestTemplate的示例:

1、添加依赖(如果你使用Maven):

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
</dependency>

2、在Dubbo服务中实现HTTP调用:

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.http.ResponseEntity;  
import org.springframework.stereotype.Service;  
import org.springframework.web.client.RestTemplate;  
  
@Service  
public class DubboService {  
  
    @Autowired  
    private RestTemplate restTemplate;  
  
    public Double callHttpServiceForDouble() {  
        String url = "http://your-http-service/api/double?value=2.0";  
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);  
        if (response.getStatusCode().is2xxSuccessful()) {  
            // 假设HTTP服务返回的是一个Double值的字符串表示  
            return Double.parseDouble(response.getBody());  
        } else {  
            // 处理错误  
            throw new RuntimeException("Failed to call HTTP service");  
        }  
    }  
}

总结

我写到这里其实不想写了,我感觉这个就是个屁话,MD为啥不能直接用中间件解决,用RocketMQ、Kafka等等都可以,但是为啥我会写这个呢?
就是被问到,那个人用卡夫卡做了个开发能实现当一个服务不论是HTTP协议还是RPC协议都能通过卡夫卡调用,我感觉有点扯,但是这里经验研究发现这个是有问题的。
但是呢我对kafka还不是很熟悉,就知道他是一个中间件,实现两个系统之间的关系调用。还望有哪位高人指点一二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值