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

OpenFeign要被HttpExchange替代了吗?

  前言
  Http是最常见的请求协议,每种编程语言都可发送Http请求。Java作为经典编程语言之一,发送Http请求的客户端更是不少,自己的内置的就有java.net.HttpURLConnection以及Java 11以后的java.net.http.HttpClient。在Java 11之前,HttpURLConnection很难用,因此市场上百花齐放出现了不少优秀的开源作品,典型代表为:Apache HttpClient(现最新为Http Component 5.x)OkHttp(现最新为OkHttp 4.x)
  作为老牌的Apache HttpClient凭借着各种优秀特征,似乎已成为了事实的标准;后起之秀OkHttp不带历史包袱的轻装上路,有着低网络延迟、更优秀的连接池性能,亦是一股不可轻视的力量。
  Spring不到万不得已之时,一般不会自己重复造轮子。在Http客户端这块一样借力打力,提供Http统一调用方式RestTemplate,屏蔽了细节,规范了开发者的使用,简化了开发门槛。
  PS:RestTemplate的底层实现依旧是Apache HttpClient、OkHttp、HttpURLConnection之一
  以上,都还是编程式Http客户端。随着Spring Boot的普及,Spring Cloud的出现,声明式编码变得越来越主流,因为声明式/面向元数据编码效率远高于编程式编码效率。因此,Feign出现了,迅速成为了主流。
  今年,随着划时代版本Spring Framework 6、Spring Boot 3、Spring Cloud 2022.0.0的发布,Spring团队自建了一套声明式Http客户端:@HttpExchange,目标直指OpenFeign。正文
  全新的声明式Http客户端由Spring Framework 6提供定义,Spring Boot 3提供实现,Spring Cloud 2022负责发扬光大。今天我们就来体验一把介绍一个免费的、在线的Rest Http服务
  由于我们需要一个提供Http Server来提供接口服务,为此先给你介绍一个免费的、24h在线的Rest Http服务,省去我们自己搭建的麻烦。
  地址:jsonplaceholder.typicode.com
  每月提供近20亿的请求,关键还是免费的、可公开访问的,好用得不要不要。
  发一个简单的Http请求,就能获取到数据。URL遵循Rest规范:
  不挑Http或者Https,比如使用浏览器访问这个URL得到的结果也是一样的:
  它提供多个Resources资源(以及多种Routes)供以访问,对这些资源进行增删改查的操作,你想要的绝大部分都能满足你。当然,若你需要mock data是符合自己的数据结构、业务逻辑的,可基于此项目做简单的修改即可,良心项目啊。具体详情自行去官方体验:https://jsonplaceholder.typicode.com。全新声明式Http客户端@HttpExchange
  环境声明:Spring Boot 3.0.x
  本文选用"albums"资源进行测试:https://jsonplaceholder.typicode.com/albums的请求结果结构如下:
  Feign代码示例
  略!Feign的使用,相信大家再熟悉不过了,笔者这里就不费周章。@HttpExchange代码示例
  ‍♀️按照albums的返回数据结构,写Java Bean:
  复制/*** 在此处添加备注信息** @author YourBatman* @since 0.0.1*/@Builder@GetterpublicclassAlbumsReq {     @NotNull@PositiveprivateLonguserId;     @NotBlankprivateStringtitle; } /*** 在此处添加备注信息** @author YourBatman* @since 0.0.1*/@Setter@ToStringpublicclassAlbumsResp {      privateLongid;     privateLonguserId;     privateStringtitle;  }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.
  顺带科普一个编码规范:请求体Req中get方法是必须的,set方法可选;响应体Resp中set方法是必须的,get方法可选;二者都需遵循Java Bean规范! 粗暴的做法是不管需求如何,get/set一把梭,可行,但作为程序员的你应该知道原由,理解要义。
  ‍♀️导入webflux包 此声明式客户端又Spring Framework 6提供,但由于其并未提供实现。Spring Boot 3为此提供了基于Reactive的Web实现,因此需要导入webflux包:
  复制org.springframework.bootspring-boot-starter-webflux1.2.3.4.
  ‍♀️编写Http客户端申明式接口。
  复制/*** 在此处添加备注信息** @author YourBatman* @since 0.0.1*/@HttpExchange("/albums") publicinterfaceAlbumsClient {      @GetExchangeListgetAll();      @GetExchange("/{id}")     AlbumsRespgetById(@PathVariableLongid);      @PostExchangeAlbumsRespadd(@RequestBody@ValidAlbumsReqreq);  }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.
  ‍♀️书写测试用例代码。
  复制@SpringBootTestclassApplicationTests {      @AutowiredprivateAlbumsClientalbumsClient;      @TestvoidcontextLoads(){         System.out.println("getAll size:"+albumsClient.getAll().size());          System.out.println("getById 1:"+albumsClient.getById(1L));          // 创建一个ObjectaddedResp=albumsClient.add(AlbumsReq.builder().userId(1L).title("diy add...").build());         System.out.println("创建的allAlbums对象为:"+addedResp+",现在总数为:"+albumsClient.getAll().size());     }  }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.
  ‍♀️运行测试代码,控制台输出:
  复制getAllsize:100getById1:AlbumsResp(id=1, userId=1, title=quidemmolestiaeenim) 创建的allAlbums对象为:AlbumsResp(id=101, userId=1, title=diyadd...),现在总数为:1001.2.3.
  完美!
  小细节:创建的时候并未制定id,发现id是自增的(id=101)。但这并不会保存在typicode.com的远端服务器了,不会引起总条数的变化。@HttpExchange声明式客户端简析
  @HttpExchange是Spring Framework 6新提供的声明式Http客户端,客户端的要素由注解的属性 + 方法签名来定义。先来看看这个注解:
  复制/*** Since: 6.0*/@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented@Mapping@Reflective(HttpExchangeReflectiveProcessor.class) public@interfaceHttpExchange {  @AliasFor("url")  Stringvalue() default"";  @AliasFor("value")  Stringurl() default"";  Stringmethod() default"";  StringcontentType() default"";  String[] accept() default {}; }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.
  和@RequestMapping参照对比:
  复制@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented@Mapping@Reflective(ControllerMappingReflectiveProcessor.class) public@interfaceRequestMapping {   Stringname() default"";  @AliasFor("path")  String[] value() default {};  @AliasFor("value")  String[] path() default {};  RequestMethod[] method() default {};  String[] params() default {};  String[] headers() default {};  String[] consumes() default {};  String[] produces() default {};  }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.
  不说一毛一样,也是基本一样。@HttpExchange注解可以标注在类上和方法上,最终的URL组合起来生效。大家都是使用过Feign、使用过Spring MVC的,这就不用过多介绍了。
  和@RequestMapping一样,@HttpExchange也有其派生注解:@GetExchange:GET请求。类似于于@GetMapping@PostExchange:Post请求。类似于于@PostMapping@PutExchange:Put请求。类似于于@PutMapping@DeleteExchange:Delete请求。类似于于@DeleteMapping@PatchExchange:Patch请求。类似于于@PatchMapping@HttpExchange声明式客户端前景展望
  通过interface这种声明式使用起来比RestTemplate,或者WebClient要简单很多,大大简化了开发步骤,对开发者更加友好。
  最新发布的Spirng Cloud 2022.0.0里描述得很明白:停止对OpenFeign的特征支持。言外之意:OpenFeign即将被Spring Cloud"淘汰",接棒的那必然是@HttpExchange喽。所以在可预见的将来,前景一片大好。
  但是,笔者认为它还不够成熟,主要有两点:还不能支持Spring-Web的注解(@RequestMapping体系),若能支持个人觉得会更为方便。目前还只有WebClient一套实现(由Spring Boot提供实现),而它属于Reactive Web体系,也就是必须引入webFlux相关技术,而webFlux在做业务开发时优势不明显,并非主流。因为若WebClient能从Reactive Web里剥离出来,笔者觉得就好很多了。总结
  谁能想到,OpenFeign竟然都快被淘汰了,Spring的大船滚滚向前,引领着整个潮流,逐渐暴露出了野心,或者说感受到了危机。
  先抄袭,再超越,Spring做到了。隐藏在全新的声明式客户端背后,其实还有Spring Framework 6背后对Web Mapping体系的重构,细心的你或许已有所发现。这些话题、新发现,留予笔者和你后续接着聊。
  原文链接:https://www.51cto.com/article/743079.html

非一般的年味!玉兔迎春多彩石家庄非遗过大年系列活动今日精彩开启!纵览客户端1月14日讯(呼延)2023年,玉兔迎春年来到!张灯结彩剪纸纳福舞龙舞狮敲锣打鼓乐享美食走亲看戏1月14日,由石家庄市文化广电和旅游局主办,河北新闻网承办,各县(市区)文玩转禅城南海花市!搭这60条公交线路就能逛!广府年味看花市,备受市民期待的迎春花市今年回归了。根据禅城南海多个镇街陆续发布的花市时间地点安排,巴士集团佛广集团合理调整60条公交线路,为市民前往禅城南海各镇街的迎春花市提供出行走进山东国际友城来意大利罗古市听歌剧看古迹每年6月,这个城市都会举行Tratti民间音乐节,众多意大利及外国艺术家参加表演,爵士乐蓝调乡村音乐民族音乐,并伴有现代作家的诗朗诵。历史悠久的罗西尼(Rossini)歌剧院同Si骑游在祖国的东部边疆(D02乌苏镇寒葱沟镇)2016年9月11日,早晨5点半出门,想迎接进入抚远的第一缕阳光。出门一看,日头已经升到一杆子多高了,不知道跑进内地几百公里了。一问旅店老板才知道,这里4点多天就放亮了,5点太阳就来晋过大年!欢乐中国年地道山西味五大精品游线路等你来!这个春节的惊喜是山西给你的,卯兔迎新晋彩山西年五大精品旅游线路,就是山西给你的惊喜之一,美食美景和各具特色的民俗风情,这一路的好风景没人能拒绝。主题路线一大展宏兔新年祈福游五台山悬消费者和业界人士的一致认可!FindN2叫好又叫座,这些升级是关键近日,在央视官方微博发布的向上吧,中国工程师节目中提到,中国在20年内培养了6000万名工程师,这些工程师深入各个产业链,然后对产品进行不断的更新迭代,国内的技术制造也在这个过程中太卷了!2023互联网大厂新年礼盒大比拼本文经BAT(idbatfun)授权转载编者按春节倒计时啦,你收到公司发的新年礼盒了没?最近的朋友圈可真是被互联网打工人晒的新年礼盒刷屏了。如何让员工在朋友圈晒图的时候感觉倍儿有面Django搭建个人博客BlogDay02配置文件的介绍dev。py(原来的setting。py文件)django的配置文件中的配置项是什么意思?importos导入模块Buildpathsinsidetheproject新一轮油价调整将于春节前开启,山东炼油厂报价今日1月14日截止到2023年1月14日,今年油价共调整1次(油价上涨1次,油价下跌0次,另加0次调价搁浅),汽油共上调250元吨,柴油共上调240元吨,折合升涨0。20元升0。24元升,加满5望岳谈黄河大集为何这么火杨润勤快过年了,黄河大集火了。1月14日,山东亮出又一张文化两创新名片黄河大集春节季启动。这一天正值农历的小年,小年意味着进入春节时间,黄河大集上氤氲的烟火气将更浓,春节的气氛将更大众日报5篇望岳谈网评,为你深读山东先行区三年行动计划建设绿色低碳高质量发展先行区,是当前和今后一个时期山东各项工作的总抓手。近日,山东省委省政府印发山东省建设绿色低碳高质量发展先行区三年行动计划(20232025年)。行动计划明确了
港股开盘恒生指数跌0。03富力地产跌超10金融界12月13日消息今日港股各指数多数低开,恒生指数跌0。03,报19458。02点,恒生科技指数跌0。6,报4167。7点,国企指数跌0。09,报6622。53点,红筹指数涨0开盘A股三大指数涨跌不一,互联网医疗概念领涨金融界12月13日消息今日A股三大指数开盘涨跌不一,沪指涨0。01,报3179。44点,深成指平开,报11398。84点,创业板指涨0。09,报2403。74点科创50指数跌0。211月金融数据值得关注的四大信号1M2和M1明显背离11月M2增速高达12。4,但M1却不增反降下行到了4。6,M1和M2的增速明显背离。为什么会这样呢?我们认为主要原因是疫情导致预防性储蓄上升2制造业和基建投资不解释,一切交给时间听过这样一句话走过半生,才知道,侃侃而谈是表象,默默无言才是人生常态。年轻的时候,总想把自己内心的所有情感告诉全世界,渴望被认同希望被理解。随着岁月的积淀,才发现,成长始于沉默,而快递查询工具,批量查询多个快递快递单号的物流状态签收时间最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快奥美拉唑,什么时间吃?能长期吃吗?5块钱和95块的,有何区别?这种药相信很多人都知道,有的人可能最近正在吃。它是治疗胃病的,而现在胃不好的人很多,不管是年轻人还是老年人。但是对于这种药,很多人都认识并不正确,有的则是片面的,药吃对了能治病,但格力再发55亿大红包,董明珠独享4448万!有股民称,分了2年红还亏一百万中新经纬12月13日电(熊思怡)55亿元!格力电器再次大手笔分红,董明珠将获分4448万元。股东人均赚一台iPhone14Plus12日晚间,格力电器发布2022年中期利润分配预案充电桩行业专题研究交流桩重渠道品牌,直流桩看中国制造业红利(报告出品方作者天风证券,孙潇雅)核心观点一与中国相比,为什么欧美充电桩需求增长空间更大,增速更快?1美欧的保有量加速向上,客观需要建设更多的桩。美国新能源车渗透率低,销量加速向上国内首部上市公司ESG指数报告发布ES两指数呈上升趋势本报记者石健北京报道近日,上交所和深交所分别制定了新一轮推动提高沪市上市公司质量三年行动计划中央企业综合服务三年行动计划落实推动提高上市公司质量三年行动方案(20222025)工作王者荣耀新版本时间已定!本月三款皮肤上线,S30新增三大功能王者荣耀等待上线的皮肤可不少,因为目前在世冠期间,还有两款传说皮肤将在本月登场,第一款是吕布FMVP,第二款是世冠专属传说。除此之外,还有一款永宁纪系列限定皮肤将至,该皮肤也属于长A股复盘必读猪肉旅游预制菜等大消费板块活跃,以岭药业股价走低但成交额居首大盘行情上证指数收报3176。33点,跌0。09,成交额3335亿元。深证成指收报11323。70点,跌0。66,成交额4802亿元。创业板指收报2376。20点,跌1。05,成交