范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

微服务的那些事(三),微服务的远程调用方式。RPC和HTTP

  2.远程调用方式
  无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?
  常见的远程调用方式有以下几种:RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。现在热门的Rest风格,就可以通过http协议来实现。
  2.1.认识RPC
  RPC,即 Remote Procedure Call(远程过程调用),是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。说得通俗一点就是:A计算机提供一个服务,B计算机可以像调用本地服务那样调用A计算机的服务。
  通过上面的概念,我们可以知道,实现RPC主要是做到两点:实现远程调用其他计算机的服务要实现远程调用,肯定是通过网络传输数据。A程序提供服务,B程序通过网络将请求参数传递给A,A本地执行后得到结果,再将结果返回给B程序。这里需要关注的有两点:1)采用何种网络通讯协议?现在比较流行的RPC框架,都会采用TCP作为底层传输协议2)数据传输的格式怎样?两个程序进行通讯,必须约定好数据传输格式。就好比两个人聊天,要用同一种语言,否则无法沟通。所以,我们必须定义好请求和响应的格式。另外,数据在网路中传输需要进行序列化,所以还需要约定统一的序列化的方式。像调用本地服务一样调用远程服务如果仅仅是远程调用,还不算是RPC,因为RPC强调的是过程调用,调用的过程对用户而言是应该是透明的,用户不应该关心调用的细节,可以像调用本地服务一样调用远程服务。所以RPC一定要对调用的过程进行封装
  RPC调用流程图:
  想要了解详细的RPC实现,给大家推荐一篇文章:自己动手实现RPChttps://legacy.gitbook.com/book/huge0612/tour-of-rpc/details
  2.2.认识Http
  Http协议:超文本传输协议,是一种应用层协议。规定了网络传输的请求格式、响应格式、资源定位和操作的方式等。但是底层采用什么网络传输协议,并没有规定,不过现在都是采用TCP协议作为底层传输协议。说到这里,大家可能觉得,Http与RPC的远程调用非常像,都是按照某种规定好的数据格式进行网络通信,有请求,有响应。没错,在这点来看,两者非常相似,但是还是有一些细微差别。RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。Http中还定义了资源定位的路径,RPC中并不需要最重要的一点:RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。Http协议没有这样的要求,因此请求、响应等细节需要我们自己去实现。优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境。
  例如我们通过浏览器访问网站,就是通过Http协议。只不过浏览器把请求封装,发起请求以及接收响应,解析响应的事情都帮我们做了。如果是不通过浏览器,那么这些事情都需要自己去完成。
  2.3.如何选择?
  既然两种方式都可以实现远程调用,我们该如何选择呢?速度来看,RPC要比http更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿,不过可以采用gzip压缩。难度来看,RPC实现较为复杂,http相对比较简单灵活性来看,http更胜一筹,因为它不关心实现细节,跨平台、跨语言。
  因此,两者都有不同的使用场景:如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。如果需要更加灵活,跨语言、跨平台,显然http更合适
  那么我们该怎么选择呢?
  微服务,更加强调的是独立、自治、灵活。而RPC方式的限制较多,因此微服务框架中,一般都会采用基于Http的Rest风格服务。3.Http客户端工具
  既然微服务选择了Http,那么我们就需要考虑自己来实现对请求和响应的处理。不过开源世界已经有很多的http客户端工具,能够帮助我们做这些事情,例如:HttpClientOKHttpURLConnection
  接下来,我们就一起了解一款比较流行的客户端工具:HttpClient
  3.1.HttpClient
  3.1.1.介绍
  HttpClient是Apache公司的产品,是Http Components下的一个组件。
  官网地址:http://hc.apache.org/index.html
  特点:基于标准、纯净的Java语言。实现了Http1.0和Http1.1以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)支持HTTPS协议。通过Http代理建立透明的连接。自动处理Set-Cookie中的Cookie。
  发起get请求:@Test public void testGet() throws IOException { HttpGet request = new HttpGet("http://www.baidu.com"); String response = this.httpClient.execute(request, new BasicResponseHandler()); System.out.println(response); }
  发起Post请求:@Test public void testPost() throws IOException { HttpPost request = new HttpPost("http://www.oschina.net/"); request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"); String response = this.httpClient.execute(request, new BasicResponseHandler()); System.out.println(response); }
  尝试访问接口:http://localhost/hello
  这个接口返回一个User对象@Test public void testGetPojo() throws IOException { HttpGet request = new HttpGet("http://localhost/hello"); String response = this.httpClient.execute(request, new BasicResponseHandler()); System.out.println(response); }
  我们实际得到的是一个json字符串:{ "id": 8, "userName": "liurushi", "password": "123456", "name": "柳如是", "age": 21, "sex": 2, "birthday": "1995-08-07T16:00:00.000+0000", "created": "2014-09-20T03:41:15.000+0000", "updated": "2014-09-20T03:41:15.000+0000", "note": "柳如是在秦淮河演奏琵琶" }
  如果想要得到对象,我们还需要手动进行Json反序列化,这一点比较麻烦。
  3.1.3.Json转换工具
  HttpClient请求数据后是json字符串,需要我们自己把Json字符串反序列化为对象,我们会使用JacksonJson工具来实现。
  JacksonJson是SpringMVC内置的json处理工具,其中有一个ObjectMapper类,可以方便的实现对json的处理:
  对象转json
  // json处理工具private ObjectMapper mapper = new ObjectMapper(); @Test public void testJson() throws JsonProcessingException { User user = new User(); user.setId(8L); user.setAge(21); user.setName("柳如是"); user.setUserName("liurushi"); // 序列化 String json = mapper.writeValueAsString(user); System.out.println("json = " + json); }
  结果。
  json转普通对象
  // json处理工具private ObjectMapper mapper = new ObjectMapper(); @Test public void testJson() throws IOException { User user = new User(); user.setId(8L); user.setAge(21); user.setName("柳岩"); user.setUserName("liuyan"); // 序列化 String json = mapper.writeValueAsString(user); // 反序列化,接收两个参数:json数据,反序列化的目标类字节码 User result = mapper.readValue(json, User.class); System.out.println("result = " + result); }
  结果:
  json转集合
  json转集合比较麻烦,因为你无法同时把集合的class和元素的class同时传递到一个参数。
  因此Jackson做了一个类型工厂,用来解决这个问题:
  // json处理工具private ObjectMapper mapper = new ObjectMapper(); @Test public void testJson() throws IOException { User user = new User(); user.setId(8L); user.setAge(21); user.setName("柳岩"); user.setUserName("liuyan"); // 序列化,得到对象集合的json字符串 String json = mapper.writeValueAsString(Arrays.asList(user, user)); // 反序列化,接收两个参数:json数据,反序列化的目标类字节码 List users = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, User.class)); for (User u : users) { System.out.println("u = " + u); } }
  结果.
  json转任意复杂类型
  当对象泛型关系复杂时,类型工厂也不好使了。这个时候Jackson提供了TypeReference来接收类型泛型,然后底层通过反射来获取泛型上的具体类型。实现数据转换。
  // json处理工具private ObjectMapper mapper = new ObjectMapper(); @Test public void testJson() throws IOException { User user = new User(); user.setId(8L); user.setAge(21); user.setName("柳岩"); user.setUserName("liuyan");
  // 序列化,得到对象集合的json字符串
  String json = mapper.writeValueAsString(Arrays.asList(user, user));
  // 反序列化,接收两个参数:json数据,反序列化的目标类字节码List users = mapper.readValue(json, new TypeReference>(){}); for (User u : users) { System.out.println("u = " + u); } }
  3.3.Spring的RestTemplate
  Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持:HttpClientOkHttpJDK原生的URLConnection(默认的)
  首先在项目中注册一个RestTemplate对象,可以在启动类位置注册:@SpringBootApplication public class HttpDemoApplication { public static void main(String[] args) { SpringApplication.run(HttpDemoApplication.class, args); } @Bean public RestTemplate restTemplate() { // 默认的RestTemplate,底层是走JDK的URLConnection方式。 return new RestTemplate(); } } 在测试类中直接@Autowired注入: @RunWith(SpringRunner.class) @SpringBootTest(classes = HttpDemoApplication.class) public class HttpDemoApplicationTests { @Autowired private RestTemplate restTemplate; @Test public void httpGet() { User user = this.restTemplate.getForObject("http://localhost/hello", User.class); System.out.println(user); } } 通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码,RestTemplate会自动发起请求,接收响应,并且帮我们对响应结果进行反序列化。题记
  微服务的相关的博文,我会将持续的更新下去。我们将陆续写出spring Cloud的各个组件的用法。你们觉得我写文章对你有帮助。请关注我,你的关注,是我持续创作的动力。

人民对美好生活的向往是我国经济发展的主脉络人民对美好生活的向往是我国以后一个时期经济发展的主脉络与巨大推动力。众所周知,拉动经济增长的三驾马车是投资,消费,出口。我国是一个有着14亿人口的消费大国。近期,中央财经委第十次会两个必须懂一个互联网,一个新零售,不懂互联网就是新时代文盲从五个方面解析华云数字!华云模式是东西方文化经济的博弈,华云代表的是人类历史上的一次商业性变革。华云数字带你看破未来100年经济趋势,华云模式是旧财团的掘墓人,华云模式是全民小康强长江经济带打造人民对美好生活向往的幸福大长廊9月2日,国家财政部出台关于全面推动长江经济带发展财税支持政策的方案,支持长江经济带成为我国生态优先绿色发展主战场,畅通国内国际双循环主动脉,引领经济高质量发展主力军。1。更好发挥上海对赌特斯拉论成功的政府商业性投资上海对赌特斯拉论成功的政府商业性投资。根据政府投资条例规定,政府投资原则上市场不能有效配置资源的公共领域,以非经营性项目为主。但我们也经常看到政府投资产业化经营性项目并大获成功的案万亿海航的落幕论我国当前经济发展的新常态新理念,新格局万亿海航集团的风云三十年论我国当前经济发展的新常态新理念,新格局。世间万物都是辩证式的存在,螺旋式的发展,盛极而衰否极泰来,阴阳替换,周而复始。大自然如此,经济社会发展亦是如此。下新星宇房子质量怎么样?新星宇之悦保障美好生活一天只有24小时,但新星宇能给你带来的美好远不只24种。新星宇房子质量怎么样?经过工作人员的日夜耕耘和共同努力,新星宇之悦将献给您一份名为美好生活的答卷。新星宇房子质量怎么样?新星空调行业新标准发布,海尔成空调推荐和空调排行榜常客尽管目前网络上有大量的空调推荐和空调排行榜这类的数据,但是消费者在购买空调的过程中,面对榜单中诸多的品牌依然不知道作何选择。近期国内空调行业首个具有森林风功能空调器的测试与评价团体一加9Pro一个月体验换ColorOS后真的难找出缺点提到一加手机你能想到什么?相信在2021年之前有不少人甚至都不知道国内有这样一个手机品牌,但在今年至少大部分人都会脱口而出哈苏胡歌周迅代言一类的吧。其实2年前一加7Pro大火时小编CNXSoftware博客为什么来中国?理由很简单近日,国际知名的科技自媒体博客CNXSoftware推出中文站,致力于为国内嵌入式工程师电子发烧友软件工程师及技术爱好者们提供有价值的信息。CNXSoftware博客为何创立中文网5G双全网通,联发科5G战车天玑900越级体验,刷新市场标准联发科发布全新天玑9005G移动芯片,高端市场迎来全新布局。此次这款全新旗舰级芯片采用台积电6nm制程CortexA78CPU架构,可支持LPDDR5内存和UFS3。1闪存,越级规放弃荣威RX5MAX,选北京X7无法拒绝的理由是什么?由于二胎政策的开放,很多家庭都在筹划着生二胎,多了一个人,对于车的空间要求也就更大了,假如再带上家里的老人,小汽车更显得很拥挤,坐着也不舒服,于是换一辆空间大的车已是刻不容缓了。过
发行商割韭菜7天内暴涨230000,一天雪崩几乎归零的加密货币韩剧鱿鱼游戏近来在全球爆红韩剧鱿鱼游戏近来在全球爆红,加密货币游戏平台鱿鱼游戏(SquidGameproject)抢搭热潮,推出同名的闯关游戏及加密货币鱿鱼币,玩家必须购买鱿鱼币才11。25午评简评国科微国科微就被列入实体清单,好久没看到这个实体清单了。为什么是国科微。很简单,因为华为的关系。美国大量收集数据,就是为了找出隐藏在华为背后的设备商,供应商。所以这个事情和国科微公司本身最近,大厂们都在忙着投哪些GP和赛道?对外进行股权投资,布局VCPE,似乎已成为大企业发展中的一种风向。以腾讯阿里字节小米等为代表的CVC投资机构正在崛起。过去几年,中国CVC机构发展迅猛,不仅是新经济领域的BATJ,为什么苹果一直没快充肯定会有人反驳说不是有pd18w快充吗?那是需要购买的,而且放在2021年随便一个厂商都不止18w。苹果不出高性能快充,应该是人他们在研发方面,有一些技术还没有解决吧,所以,苹果如巅峰对决!谷歌Pixel6ProVSGalaxyS21Ultra哪款安卓机皇获胜?哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您Pixel6Pro终于将Google带回了旗舰手机中,但三星的三星GalaxyS21Ultra可以说是当今Android硬件的家用打印机,喷墨,激光选哪种?家庭用打印机买激光的还是喷墨的?1激光打印机和喷墨打印机各有优劣,如果打印量比较大,且需要更快速度和一劳永逸,推荐购买激光打印机相反预算不足,也不介意使用期间需要更换墨盒,喷墨打印空间站舱内高清画面公开,王亚平真仙女,某品牌笔记本电脑出镜?在领略了中国空间站舱外1080P高清视频之后,最近,天和核心舱舱内的高清画面也正式公开了,王亚平像仙女一样在里面飞来飞去,3个大红苹果格外抢镜。与此同时,我们也可以看到许多有意思的国人为何不支持联想了?144Hz骁龙888芯片,降价1100也无人问津点击关注,每天精彩不断!导读国人为何不支持联想了?144Hz骁龙888芯片,降价1100也无人问津!随着移动互联网的快速发展,也极大地带动了国内科技产业的发展,最近这几十年在国内的马云跟任正非比,两者有可比性吗,你认为谁会更厉害一些?在阿里马云说的算在华为任正非只有决策权,财务人事任免方面他说的不算。举个例子捐款的时候,马云说捐5000万,阿里巴巴立马就会出公告阿里巴巴捐款5000万。任正非只能提个建议,然后由看书学习的意义究竟是什么?看书学习的意义是什么?这是一个月月日日时时的话题。虽如此,观点各异,没人统一。有圣人说,有哲人说,有长辈说,有领导说,有师者说,有懒说。圣人说读书可得美人得玉帛,可得大厦得黄金,可从6799跌至6539,鸿蒙OS麒麟90005G,可惜是减配版等到过去了2021年之后,华为手机的海思麒麟机型热度也就会更加降低一个档次,因为搭载4nm工艺的处理器已经在路上了。而华为旗下的麒麟9000处理器搭载是5nm工艺,面对全新的工艺,