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

再见Feign!推荐一款微服务间调用神器,跟SpringCloud绝配

  在微服务项目中,如果我们想实现服务间调用,一般会选择Feign。之前介绍过一款HTTP客户端工具  Retrofit  ,配合SpringBoot非常好用!其实 Retrofit  不仅支持普通的HTTP调用,还能支持微服务间的调用,负载均衡和熔断限流都能实现。今天我们来介绍下 Retrofit  在Spring Cloud Alibaba下的使用,希望对大家有所帮助! 前置知识
  本文主要介绍Retrofit在Spring Cloud Alibaba下的使用,需要用到Nacos和Sentinel,对这些技术不太熟悉的朋友可以先参考下之前的文章。  Spring Cloud Alibaba:Nacos 作为注册中心和配置中心使用 Spring Cloud Alibaba:Sentinel实现熔断与限流 还在用HttpUtil?试试这款优雅的HTTP客户端工具吧,跟SpringBoot绝配! 搭建
  在使用之前我们需要先搭建Nacos和Sentinel,再准备一个被调用的服务,使用之前的  nacos-user-service  即可。 首先从官网下载Nacos,这里下载的是 nacos-server-1.3.0.zip 文件,下载地址:https://github.com/alibaba/nacos/releases
  解压安装包到指定目录,直接运行 bin 目录下的startup.cmd ,运行成功后访问Nacos,账号密码均为nacos ,访问地址:http://localhost:8848/nacos
  接下来从官网下载Sentinel,这里下载的是 sentinel-dashboard-1.6.3.jar 文件,下载地址:https://github.com/alibaba/Sentinel/releases
  下载完成后输入如下命令运行Sentinel控制台; java -jar sentinel-dashboard-1.6.3.jar Sentinel控制台默认运行在 8080 端口上,登录账号密码均为sentinel ,通过如下地址可以进行访问:http://localhost:8080
  接下来启动 nacos-user-service 服务,该服务中包含了对User对象的CRUD操作接口,启动成功后它将会在Nacos中注册。/**  * Created by macro on 2019/8/29.  */ @RestController @RequestMapping("/user") public class UserController {      private Logger LOGGER = LoggerFactory.getLogger(this.getClass());      @Autowired     private UserService userService;      @PostMapping("/create")     public CommonResult create(@RequestBody User user) {         userService.create(user);         return new CommonResult("操作成功", 200);     }      @GetMapping("/{id}")     public CommonResult getUser(@PathVariable Long id) {         User user = userService.getUser(id);         LOGGER.info("根据id获取用户信息,用户名称为:{}",user.getUsername());         return new CommonResult<>(user);     }      @GetMapping("/getUserByIds")     public CommonResult> getUserByIds(@RequestParam List ids) {         List userList= userService.getUserByIds(ids);         LOGGER.info("根据ids获取用户信息,用户列表为:{}",userList);         return new CommonResult<>(userList);     }      @GetMapping("/getByUsername")     public CommonResult getByUsername(@RequestParam String username) {         User user = userService.getByUsername(username);         return new CommonResult<>(user);     }      @PostMapping("/update")     public CommonResult update(@RequestBody User user) {         userService.update(user);         return new CommonResult("操作成功", 200);     }      @PostMapping("/delete/{id}")     public CommonResult delete(@PathVariable Long id) {         userService.delete(id);         return new CommonResult("操作成功", 200);     } } 使用
  接下来我们来介绍下Retrofit的基本使用,包括服务间调用、服务限流和熔断降级。  集成与配置首先在 pom.xml 中添加Nacos、Sentinel和Retrofit相关依赖;                     com.alibaba.cloud          spring-cloud-starter-alibaba-nacos-discovery                           com.alibaba.cloud          spring-cloud-starter-alibaba-sentinel                            com.github.lianjiatech          retrofit-spring-boot-starter          2.2.18         然后在 application.yml 中对Nacos、Sentinel和Retrofit进行配置,Retrofit配置下日志和开启熔断降级即可;server:   port: 8402 spring:   application:     name: nacos-retrofit-service   cloud:     nacos:       discovery:         server-addr: localhost:8848 #配置Nacos地址     sentinel:       transport:         dashboard: localhost:8080 #配置sentinel dashboard地址         port: 8719 retrofit:   log:     # 启用日志打印     enable: true     # 日志打印拦截器     logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor     # 全局日志打印级别     global-log-level: info     # 全局日志打印策略     global-log-strategy: body   # 熔断降级配置   degrade:     # 是否启用熔断降级     enable: true     # 熔断降级实现方式     degrade-type: sentinel     # 熔断资源名称解析器     resource-name-parser: com.github.lianjiatech.retrofit.spring.boot.degrade.DefaultResourceNameParser 再添加一个Retrofit的Java配置,配置好选择服务实例的Bean即可。 /**  * Retrofit相关配置  * Created by macro on 2022/1/26.  */ @Configuration public class RetrofitConfig {      @Bean     @Autowired     public ServiceInstanceChooser serviceInstanceChooser(LoadBalancerClient loadBalancerClient) {         return new SpringCloudServiceInstanceChooser(loadBalancerClient);     } } 服务间调用使用Retrofit实现微服务间调用非常简单,直接使用 @RetrofitClient 注解,通过设置serviceId 为需要调用服务的ID即可;/**  * 定义Http接口,用于调用远程的User服务  * Created by macro on 2019/9/5.  */ @RetrofitClient(serviceId = "nacos-user-service", fallback = UserFallbackService.class) public interface UserService {     @POST("/user/create")     CommonResult create(@Body User user);      @GET("/user/{id}")     CommonResult getUser(@Path("id") Long id);      @GET("/user/getByUsername")     CommonResult getByUsername(@Query("username") String username);      @POST("/user/update")     CommonResult update(@Body User user);      @POST("/user/delete/{id}")     CommonResult delete(@Path("id") Long id); } 我们可以启动2个 nacos-user-service 服务和1个nacos-retrofit-service 服务,此时Nacos注册中心显示如下;
  然后通过Swagger进行测试,调用下获取用户详情的接口,发现可以成功返回远程数据,访问地址:http://localhost:8402/swagger-ui/
  查看 nacos-retrofit-service 服务打印的日志,两个实例的请求调用交替打印,我们可以发现Retrofit通过配置serviceId 即可实现微服务间调用和负载均衡。
  服务限流Retrofit的限流功能基本依赖Sentinel,和直接使用Sentinel并无区别,我们创建一个测试类 RateLimitController 来试下它的限流功能;/**  * 限流功能  * Created by macro on 2019/11/7.  */ @Api(tags = "RateLimitController",description = "限流功能") @RestController @RequestMapping("/rateLimit") public class RateLimitController {      @ApiOperation("按资源名称限流,需要指定限流处理逻辑")     @GetMapping("/byResource")     @SentinelResource(value = "byResource",blockHandler = "handleException")     public CommonResult byResource() {         return new CommonResult("按资源名称限流", 200);     }      @ApiOperation("按URL限流,有默认的限流处理逻辑")     @GetMapping("/byUrl")     @SentinelResource(value = "byUrl",blockHandler = "handleException")     public CommonResult byUrl() {         return new CommonResult("按url限流", 200);     }      @ApiOperation("自定义通用的限流处理逻辑")     @GetMapping("/customBlockHandler")     @SentinelResource(value = "customBlockHandler", blockHandler = "handleException",blockHandlerClass = CustomBlockHandler.class)     public CommonResult blockHandler() {         return new CommonResult("限流成功", 200);     }      public CommonResult handleException(BlockException exception){         return new CommonResult(exception.getClass().getCanonicalName(),200);     }  } 接下来在Sentinel控制台创建一个根据 资源名称 进行限流的规则;
  之后我们以较快速度访问该接口时,就会触发限流,返回如下信息。
  熔断降级Retrofit的熔断降级功能也基本依赖于Sentinel,我们创建一个测试类 CircleBreakerController 来试下它的熔断降级功能;/**  * 熔断降级  * Created by macro on 2019/11/7.  */ @Api(tags = "CircleBreakerController",description = "熔断降级") @RestController @RequestMapping("/breaker") public class CircleBreakerController {      private Logger LOGGER = LoggerFactory.getLogger(CircleBreakerController.class);     @Autowired     private UserService userService;      @ApiOperation("熔断降级")     @RequestMapping(value = "/fallback/{id}",method = RequestMethod.GET)     @SentinelResource(value = "fallback",fallback = "handleFallback")     public CommonResult fallback(@PathVariable Long id) {         return userService.getUser(id);     }      @ApiOperation("忽略异常进行熔断降级")     @RequestMapping(value = "/fallbackException/{id}",method = RequestMethod.GET)     @SentinelResource(value = "fallbackException",fallback = "handleFallback2", exceptionsToIgnore = {NullPointerException.class})     public CommonResult fallbackException(@PathVariable Long id) {         if (id == 1) {             throw new IndexOutOfBoundsException();         } else if (id == 2) {             throw new NullPointerException();         }         return userService.getUser(id);     }      public CommonResult handleFallback(Long id) {         User defaultUser = new User(-1L, "defaultUser", "123456");         return new CommonResult<>(defaultUser,"服务降级返回",200);     }      public CommonResult handleFallback2(@PathVariable Long id, Throwable e) {         LOGGER.error("handleFallback2 id:{},throwable class:{}", id, e.getClass());         User defaultUser = new User(-2L, "defaultUser2", "123456");         return new CommonResult<>(defaultUser,"服务降级返回",200);     } } 由于我们并没有在 nacos-user-service 中定义id为4 的用户,调用过程中会产生异常,所以访问如下接口会返回服务降级结果,返回我们默认的用户信息。
  总结
  Retrofit给了我们除Feign和Dubbo之外的第三种微服务间调用选择,使用起来还是非常方便的。记得之前在使用Feign的过程中,实现方的Controller经常要抽出一个接口来,方便调用方来实现调用,接口实现方和调用方的耦合度很高。如果当时使用的是Retrofit的话,这种情况会大大改善。总的来说,Retrofit给我们提供了更加优雅的HTTP调用方式,不仅是在单体应用中,在微服务应用中也一样! 参考资料
  官方文档:https://github.com/LianjiaTech/retrofit-spring-boot-starter 项目源码地址
  https://github.com/macrozheng/springcloud-learning

现场爆满,TMGM2021悉尼全球投资论坛圆满成功大悉尼最近两周的洪水与暴雨都阻挡不了大家来参加活动的热情,上座率爆棚,这到底是什么逆天活动?在六星级的CrownSydney,由TMGM主办的2021金融投资论坛顺利举行!活动现场2020在线交易用户结构和行为分析报告即将发布2020年,新冠疫情爆发,世界各地持续封国封城金融市场上,美股数次熔断后触底反弹,原油跌至负值逐渐企稳,货币大宗市场波动剧烈。高波动性带来了很多交易机会,加之人们以居家为主,外出活互联网科技圈人生导师的幻灭项羽说,富贵不还乡,如衣锦夜行,谁知之者。人性有一个弱点,一旦成功发达了容易心理膨胀。心理膨胀的表现有很多种,不同人群对应的不一样。暴发户心理膨胀得很简单,就是炫耀我有钱,怎么着贵实力赢得荣誉,ATFX获最佳金融科技外汇经纪商等奖项提名ATFX动态奖项荣誉是对企业的综合实力,服务与体验的多方位评价。企业孰胜孰优,单个奖项荣誉说明不了什么问题,但量变引发质变,所获荣誉众多,体现的不仅是企业价值,更重要的是客户对企业缺芯少屏!华为密集拜访清北等顶尖学府,产学研共谋核心技术突破2020年是华为艰难的一年。面对美国的制限制,缺芯少屏再一次的伤华为如此之深。尽管华为早已有未雨绸缪之举,但在美国掌握的诸多核心关键技术,成熟的国际产业链控制力下,一切仍然显得那么物美价廉,华为5G出海的底气!掌握核心技术就掌握设备定价权2020年是华为艰难的一年。面对西方国家鹰派势力的围追堵截,华为百折不挠,敢于斗争。面对打压,求生存成为华为的主线。但是,放眼全球,我们可以看到,一些国家正在积极的欢迎华为的入场。据说这是一只会反低俗的狗子,然而它好像只是来卖萌的狗是人类忠诚的朋友,聪明的狗能学会各种神奇的技能,比如导盲犬警犬军犬等等。本文要说的是一只高雅的狗,能识别出互联网低俗内容的狗。这只狗被称为灵犬,人类已经训练了它好些年了,但是,小阿里巴巴的张勇时代,一开局便是如此的艰难市场监管总局根据举报,依法对阿里巴巴集团控股有限公司实施二选一等涉嫌垄断行为立案调查。这个新闻今天始终站在各大传媒平台的热榜之上。网友们当然都是看热闹不嫌事大,拍手称快的围观。在这全新高尔夫报价12。98万起,以数冠名,数在哪里新一轮科技变革方兴未艾,智能汽车网联汽车自动驾驶等词汇早已传遍街头巷尾。数字化已然是汽车产业发展的大势。对于传统汽车不论是研发还是销售,其重心在于车辆的机械架构性能,例如动力总成底张柏芝浪姐蝶变,镁光灯下四十岁轻熟风韵浓,惊艳了时光12年前,你或许看过张柏芝的清纯与性感。这是张柏芝职业生涯中最艰难的一年。本是私密,却被曝光在众多屏幕之前。互联网的传播能量将她和她们推向舆论的深渊。所有的美好化为曾经,网络的恶意俄罗斯的军魂红场阅兵的C位T34坦克传奇再现T34,卓越功勋的老式坦克!俄罗斯纪念卫国战争胜利75周年红场阅兵的头阵,C位的王者,俄罗斯的军魂。当俄罗斯人民回望历史,钢铁洪流般的T34坦克,在世界反法西斯战争中留下了浓墨重彩
中国电商规模世界第一,电商这么好,为何外国普遍不扶持电商?大家都知道,我国电商行业蓬勃发展。根据中国互联网信息中心发布的第47次中国互联网发展统计报告显示,到2020年,中国网民规模已达9。89亿,占全球网民的15。互联网普及率达到70。5G车联网应用的发展及趋势2022中国车联网市场发展前景预测分析5G因高带宽低时延大容量数据传输特性,被视为未来物联网车联网等万物互联的基础。而车联网则是实现自动驾驶乃至无人驾驶的重要组成部分,也是未来智能交通系统的核心组成部分。车联网不是简单骁龙持续领先的秘密在哪里?全面解读全新一代骁龙8移动平台在全球缺芯的大背景下,移动芯片对于手机产业至关重要。每一次高通旗舰移动平台的发布,对于手机等移动硬件产业的发展都有着重要的意义。在2021骁龙技术峰会上,高通发布了最新的骁龙旗舰S上市3年,麒麟980手机还能再战多久?华为手机让你印象最深刻的是哪一款手机呢?不少网友肯定会提到Mate20系列和P30系列,当年Mate20系列凭借麒麟980处理器以及出色的硬件配置,刚上市就成为爆款供不应求,而P3为什么有人说电商破坏了整个商业生态,你怎么看?电商在整个商业生态里本身就是寄生虫般的在!为什么说电商破坏了整个商业生态?能认知到电商破坏了商业生态的人只是少数人,大多数的人认为电商让他省了十块,但却忽略了受电商影响让他少挣了一聚焦手机生态京东与vivoiQOO签署战略合作协议在5G时代来临和手机市场趋于更高级别竞争的当下,手机市场又迎来了新的战略签约。12月14日,vivoiQOO与京东达成战略合作,签署了为期三年的战略合作协议,从产品服务营销渠道和用印度航天宣布与中企合作后,印度有人接受不了中国肯定嘲笑我们自去年6月中印边境冲突后,印度政府一直找各种理由打压中企和中方投资,前前后后禁封了几百个中方应用软件,而且还专门出台法案,对中方投资重新审核。不仅如此,还以提振印度制造为由,在印度印度国家航天机构与中国手机品牌合作,媒体炸锅中国会嘲笑我们前几天,印度国家航天机构印度空间研究组织(ISRO)在推特上发文,宣布与中国手机品牌OPPO展开合作,双方已经签署了谅解备忘录。根据双方的合作协议,OPPO手机将使用印度国产印度区使用gorm。DefaultTableNameHandler可能存在的问题业务背景有这样的业务场景,线上一个表tablea,线上环境还有一个镜像表tableamirror,你需要当请求中有一些tag标识的时候,访问tableamirror表先安装sqli电商不灭,实体不兴今天看到头条里关于电商应该如何发展的话题,电商的好处列了一大堆,比如消灭了二道贩子,让消费者买东西更便宜,更便捷,让实体工厂可以更低成本构建线上销售渠道,直接获得订单和销量,提高了分手吧Excel我有Python了前言越来越多开发者表示,自从用了PythonPandas,Excel都没有打开过了,用Python来处理与可视化表格就是四个字非常快速!下面我来举几个明显的例子1。删除重复行和空行