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

微服务的那些事(三),微服务的远程调用方式。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的各个组件的用法。你们觉得我写文章对你有帮助。请关注我,你的关注,是我持续创作的动力。

各品牌最值得买的手机都有谁?这7款机型性能强劲,价格还很良心快乐的春节已经到了,在这个节日期间,相信很多朋友都愿意更换一款新手机,为新的一年带来好运,整个2021年,各家手机厂商推出了很多体验很好的机型,其中有五六千元的旗舰机型,三四千元的年轻人喜欢滚筒的,老人更爱波轮的,两种洗衣机哪个好?今年过年回家时把家里用了六年多的空调和洗衣机换掉了,空调早早已经决定换成立式的了,但是选择洗衣机时却拿不定主意,原因就是因为家里老人说波轮好,而我们年轻的又更喜欢滚筒的,一下子就僵葡萄牙为加密货币提供零税收政策,2022年的币圈春天是否真的来临葡萄牙为加密货币提供零税收政策,2022年的币圈春天是否真的来临消息面分析2月7日消息,比特币一家人对于过去5年一直在周游世界的荷兰比特币一家人来说,安顿下来是一件大事。现在,作为你们网贷,花呗,借呗,京东,美团,信用卡都欠多少钱?说出来?小赢卡贷30000元你我贷16000元小象优品7000元同程旅行提钱游5000元从去年七月底被骗以后就开始逾期了,目前偶尔会收到电话或者短信催收,通讯录也已经爆了,就因为这个过年都如果婴儿出生后在体内安全植入微型GPS芯片,能否遏制儿童失踪?当然可以啊。好像美国有吧。高官和富豪,植入点只有自己人才知道。最关键是GPS的供电问题。芯片很简单,皮下植入物也很简单,对人无任何副作用这些都很安全和简单,关键是电池技术目前我国没联发科天玑12001100冲入安兔兔年度口碑最好的旗舰芯片TOP5今天,安兔兔在微博平台公布了年度口碑最好的旗舰级SoC排名,联发科强势拿下TOP5中的两个席位,骁龙870居首位,天玑1200力压骁龙888Plus拿下次席,天玑1100作为天玑1华为Mate50蓄势待发麒麟9000鸿蒙3。0可惜产能问题依旧无法解决近日,华为一款新机的入网引起了不少网友的关注,从入网信息得知,该华为新机支持5G,虽然没有详细描述该5G新机将搭载哪款芯片,但是从其他信息上我们可以查询到一些蛛丝马迹。我们可以看到这或许是短期内最便宜的骁龙8和888了,带你回顾摩托罗拉发布会摩托罗拉王炸发布会给我们带来两款狠手机。我们来逐一看一下。motoeageX30全球首发骁龙8Gen1,或许是短期内最便宜的骁龙8Gen1外观方面,采用跑道式摄像模组,纵向排列三摄掌趣科技商誉减值致亏背后游戏行业分化加速,研发价值回归1月26日晚,掌趣科技(300315)发布2021年度业绩预告,预计归属于上市公司股东的净利润亏损在10亿元14亿元之间,上年同期公司盈利3。17亿元。扣非净利亏损9。7亿元14亿贾跃亭案告诉你中介机构不是那么好做的26日晚的突发事件,震动证券界!多家中介机构被立案调查,IPO大面积中止!坊间对于一些中介机构将被立案调查早有传闻,业内人士讳莫如深,一些当事者矢口否认。但是这个传闻这回坐实了。因最大胆的换机苹果胜在流畅,小米12这些功能让我没有后悔最近把手上的iPhone换成了小米,没什么特别的原因,就是有几年没用过国产手机和系统了,要是实在不好用走个二手也不会亏很多。这次我换的新机是小米12,买新不买旧也算是我换机的一个原
麒麟芯片库存见底华为Mate50将转投高通平台!5G问题有望明年解决7月29号,华为才终于发布了多次延期的P50系列。但这款机器却并没有能带给我们足够的惊喜,最重要的原因之一就是它并不支持5G,全系均为4G版本!可能就是有很多人因为这一点而转投Ma7月,抖音电商上哪些新品火了?官方榜单速览今年6月的时候,我们发了一个新品英雄榜,获得了各商家达人服务商的好评。有商家说,这个榜单有效帮助他们定位适合在抖音电商上售卖的货品,调整货品结构之后,GMV迅速起量。有达人说,这个iPhone13将推4款机型,抢食华为5G份额,富士康扩产招工奖励近万元本文来源时代周报作者杨玲玲不要着急入手iPhone12,因为王守义说十三香。iPhone12系列发布时,网友如是调侃道。如今,iPhone13的发布日期已渐近。8月5日,有苹果产业华为Mate40pro鸿蒙HarmonyOS2。0。0。165更新多机位拍摄等IT之家8月7日消息感谢IT之家网友的热心线索投递,华为Mate40Pro手机开始推送鸿蒙HarmonyOS2。0。0。165更新,大小0。94GB。本次更新相机将新增多机位拍摄模雷军连续晨跑打卡,成国产跑鞋最强代言人作为小米公司的董事长和首席执行官,雷军经常在微博上发布小米的各种产品信息,对于广大网民来说,早已是司空见惯,可是在最近,雷军的连续微博更新国产跑鞋,直接为各大品牌站台,瞬间成为了跑腾讯正式启用QQ。中国域名据中国互联网络信息中心官网,腾讯公司今年陆续开通解析了QQ。中国与腾讯。中国两个域名。其中,QQ。中国解析到腾讯网,腾讯。中国解析到腾讯官网。现在在浏览器中,可以直接输入QQ。中国这可能是目前全网最专业的一款投屏软件了最近很多朋友问我有没有好用的投屏软件?注意好用这个词很关键!目前市面上流传的手机投屏软件居多,很容易让我们挑的眼花缭乱。首先我给不懂投屏的朋友科普一下什么是投屏?(可以拿出你的笔开性侵门拷问阿里价值观,涉事部门淘鲜达上月刚拆分风眼1。有阿里巴巴员工表示,得知此事第一感觉是气愤,同时感到无力。员工自发建群声援被侵犯女员工。2。阿里巴巴客户第一,员工第二,股东第三的价值观面临动摇。3。上个月阿里刚刚宣布新的组织苹果5g时代什么时候来,价格会降吗?苹果在5G智能手机时代大获全胜,iphone12为其庞大的用户群提供了向最新无线标准过渡的理由。数据显示,自2020年第四季度以来,这家iPhone制造商一直位居5G智能手机销量排iPhone13被进一步确认,外观价格皆传出新消息,下个月正式发布正常情况下国产手机品牌们不太愿意在9月份发布旗舰新机,因为苹果公司的秋季新品发布会几乎一直都在9月份,虽然部分国产手机厂商的热度在国内可以比肩苹果,但是没有手机厂商愿意冒这个风险,苏炳添成为小米品牌代言人!雷军他说喜欢小米雷军发布微博称,热烈欢迎小米品牌代言人,苏炳添中国飞人,他以9秒83的成绩刷新男子100米的亚洲纪录,跑进了男子百米决赛,他是中国的骄傲。雷军称,8月1日晚,全网沸腾了苏炳添,9秒