java 服务之间调用(rpc)

RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:

应用级的服务框架: Dubbo、Google gRPC、Spring Boot/Spring Cloud。

远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。

通信框架: Netty,MINA等。


基于 HTTP 协议的 RPC 调用

底层http请求

HttpURLConnection

JDK 自带的 HttpURLConnection 标准库,是一个多用途、轻量级的http客户端,我们能更容易的扩展和优化的HttpURLConnection。HttpURLConnection继承URLConnection,底层socket,最原始通信。


HttpClient

是apache的一个项目,封装了很多底层细节。HttpClient 是Apache的一个三方网络框架,网络请求做了完善的封装,api众多,用起来比较方便,开发快。但是我们很难再不破坏兼容性的情况下对其进行扩展。


OkHttp

OkHttp 是 Square 公司开源的针对 Java 和 Android 程序,封装的一个高性能 http 请求库。


基于Rest的封装之RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端。使用restTemplate访问restful接口非常的简单粗暴无脑。其灵活可扩展:手动指定转换器(HttpMessageConverter),设置底层连接方式,设置拦截器,Ribbon+RestTemplate。

手动指定转换器(HttpMessageConverter)

我们知道,调用reseful接口传递的数据内容是json格式的字符串,返回的响应也是json格式的字符串,你可以可以调整自己的返回格式,指定对应的转换器。

设置底层连接方式

刚才上面说过真正发起http请求的还是底层组件:HttpURLConnection,HttpClient,OkHttp,可以通过设置指定基于什么发起请求,如果想用连接池可以用HttpClient。

设置拦截器

有时候我们需要对请求做一些通用的拦截设置,这就可以使用拦截器进行处理,比如写一个在header中根据请求内容和地址添加令牌的拦截器。

Ribbon+RestTemplate

如果请求的同一个服务有多个节点,这个时候可以用ribbon负载均衡,Ribbon是一个负载均衡的工具,提供各种负载均衡算法,Ribbon是一个http客户端,它具备了负载均衡,失败重试等功能。

具体关系如下图:

更便捷的方式Feign

Feign是一个声明式的web服务客户端,使用Feign编写web服务客户端更加容易。

底层请求选择:HttpURLConnection,HttpClient,OkHttp

多节点负载与重试等机制:手动方式,Ribbon 和 Eureka。

熔断机制:Hystrix。

feign的使用方式

方式一 手动方式

UserAction action = Feign.builder()

.decoder(new StringDecoder())

.options(new Request.Options(2000, 5500))

.retryer(new Retryer.Default(3000, 3000, 3))

.target(UserAction.class,"http://localhost:8081/");


方式二 注解方式

@FeignClient(name="producer")

public interface FeignTestClient {

@RequestMapping(value = "/getuser/{id}")

public User getUser(@PathVariable("id") String id);

}


@RestController

public class FeignTestController {


@Autowired

private FeignTestClient feignTestClient;

}

相关文章

java 方法定义与调用、以及调试技巧

一、方法定义与调用1.1 方法基础public class MethodDemo { // 无返回值方法 public static void sayHello() {...

如何使用Java的反射机制以及调用构造方法?

关于如何使用Java的反射机制,兆隆IT云学院的java高级实用技术的课本中是这样的描述的:1、获取想要操作类的java.lang.Class对象。每个类被加载后,系统就会为该类生成一个对应的Clas...

字节架构师:来说说Java异步调用的几种方式你都搞懂了吗?

日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结果就对原服务进行返回。这里就涉及的Java异步调用的一个知识。下面本文尝试将Java异步调用的多种方式进行...

Java中实现接口的三种方式您造吗?

本文介绍了Java中实现接口的三种方式:常规实现方式、匿名内部类和 Lambda表达式实现方式。希望已经了解的同学可以重新温习一下,不了解的同学则从中受益!Java中接口最常规的实现方式同学们都会知道...

java实现调用http请求的几种常见方式

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。一、概述在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的...