rpc外部调用(hpross-java)

描述

在企业级的项目中我们通常是由多个子项目组合而成,为了降低子项目之间的耦合性,从而产生了rpc这个东东
当然关于使用rpc除了降低代码的耦合性我认为还有一个比较好的地方就是后端版本发布的问题,各子项目分开,然后使用rpc可单独对某个功能进行升级,避免了因发版而让整个服务不可用(当然动态发布的时候是不需要考虑这个问题的)

技术描述

hprose

本文章使用的是hprose的tcp协议,通过监听端口,然后从接口中根据方法名进行方法的调用

注意:
关于hpross这个框架需要注意的一点就是若是python使用的话不可以使用tcp协议,到文章的书写时间,python版本的hprose暂时不支持

示例代码

添加依赖
<dependency>
    <groupId>org.hprose</groupId>
    <artifactId>hprose-java</artifactId>
    <version>2.0.33</version>
</dependency>

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

服务端

服务端分为以下几个步骤

  1. 构建service层的代码
  2. 对外暴露rpc
  1. service代码
public interface RpcService {
    String rpcMethod();
}


@Service
public class RpcServiceImpl implements RpcService {
    @Override
    public String rpcMethod() {
        System.out.println("这是通过rpc调用的服务");
        return "rpcv服务返回的内容信息";
    }
}
  1. 对外暴露接口
@Component
@Slf4j
public class RpcTcpServiceImpl {
	//这里qingbuyao0使用硬编码的方式进行书写,请使用
    private String port = "9091";
    private final String threadName = "MyTcpHprose";

    @Autowired
    private RpcService rpcService;

    @PostConstruct
    public void init() {
        String uri = String.format("tcp://0.0.0.0:%s", port);
        log.info("begin init hprose");
        HproseTcpServer server = null;
        try {
            server = new HproseTcpServer(uri);
            //设置执行线程池;
            ThreadPoolExecutor executor = new ThreadPoolExecutor(
                    5, 50, 1000, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<>(100),
                    new ThreadFactoryBuilder().setNameFormat(threadName + "-%d").build(),
                    new ThreadPoolExecutor.CallerRunsPolicy()
            );
            server.setThreadPool(executor);
            server.setThreadPoolEnabled(true);
            server.setReactorThreads(20);
            //这里将你通过rpc对外暴露的方法,这样方便对外调用
            server.add("rpcMethod", rpcService);
            server.start();
            log.info("finished init hprose tcp server");
        } catch (URISyntaxException | IOException e) {
            log.warn("failure init hprose tcp server, {}", e.getMessage(), e);
        }
    }
}

通过以上两步,对服务端的对外暴露就完成啦

请求端
  1. 构建要请求的服务
  2. 使用返回内容
  1. 构建请求的服务
@Service
public class MyRpcService {
	// 这个接口就是写你要需要的接口
	//todo暂时未测试对同一个服务端的不同服务类;诶是否可以写在同一个接口内
    interface RpcService{
        String rpcMethod();

    }
    //具体的调用,若是有参数请在传递参数
    public String rpcMethod(){
        HproseTcpClient hproseTcpClient = new HproseTcpClient("tcp://localhost:9091/");
        RpcService myService = hproseTcpClient.useService(RpcService.class);
        return myService.rpcMethod();
    }
}

  1. 使用
@Resource
private MyRpcService rpcService;

@Test
public void testRpc(){
    System.out.println(rpcService.rpcMethod());
}

结语

在springboot中也可以使用webselvert来实现,这里就不多做介绍了,使用hprose还有一个好处就是在分布式的时候可以有效的接入到注册中心等,避免请求不到的问题等

有任何问题欢迎大家指出,(小白一枚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中使用sslKey文件调用JSON-RPC 2.0接口,可以按照以下步骤进行操作: 1. 导入必要的库 需要导入以下库: - org.apache.http.client.HttpClient - org.apache.http.client.methods.HttpPost - org.apache.http.entity.StringEntity - org.apache.http.impl.client.HttpClients - org.apache.http.util.EntityUtils - org.json.JSONObject - java.security.KeyStore - javax.net.ssl.SSLContext - javax.net.ssl.TrustManagerFactory - javax.net.ssl.KeyManagerFactory 2. 加载sslKey文件 使用Java的KeyStore类加载sslKey文件,例如: KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream fis = new FileInputStream("sslKey.p12"); keyStore.load(fis, "password".toCharArray()); 3. 创建SSLContext 使用KeyManagerFactory和TrustManagerFactory创建SSLContext,例如: KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, "password".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 4. 创建HttpClient 使用HttpClients.createDefault()创建HttpClient,并使用刚刚创建的SSLContext设置其SSL socket factory,例如: HttpClient httpClient = HttpClients.createDefault(); HttpClient httpClient = HttpClients.custom() .setSSLContext(sslContext) .build(); 5. 发送POST请求 使用HttpPost类创建POST请求,并将请求体设置为JSON-RPC 2.0请求体,例如: HttpPost request = new HttpPost("https://example.com/api"); request.setHeader("Content-type", "application/json"); String json = "{\"jsonrpc\":\"2.0\",\"method\":\"getUser\",\"params\":[\"user123\"],\"id\":1}"; request.setEntity(new StringEntity(json)); 6. 解析响应 执行请求并获取响应,然后解析JSON格式的响应体,例如: HttpResponse response = httpClient.execute(request); String responseString = EntityUtils.toString(response.getEntity(), "UTF-8"); JSONObject jsonResponse = new JSONObject(responseString); if (jsonResponse.has("result")) { JSONObject result = jsonResponse.getJSONObject("result"); // do something with result } else if (jsonResponse.has("error")) { JSONObject error = jsonResponse.getJSONObject("error"); // handle error } 以上就是使用sslKey文件调用JSON-RPC 2.0接口的步骤,需要注意的是,要根据实际情况替换示例中的URL、请求体和响应体解析逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值