佛山网站提升排名外贸公司怎么做

当前位置: 首页 > news >正文

佛山网站提升排名,外贸公司怎么做,网站建设报销属于什么会计科目,游戏开发课程前言 本文主要做一下OpenFeign的简单介绍和功能实操#xff0c;实操主要是OpenFeign的超时和重试#xff0c;在阅读本文章前#xff0c;请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign#xff…前言 本文主要做一下OpenFeign的简单介绍和功能实操实操主要是OpenFeign的超时和重试在阅读本文章前请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign是SpringCloud开发团队基于Feign开发的框架声明式Web服务客户端 Feign是一种声明式、模板化的HTTP客户端可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口可以实现简单和可重用的RPC调用。Feign实现了声明式调用允许程序员只需定义接口并作出一些小的注释就可以实现一个完整的客户端从而开发简单潜在的问题可以被检测出来程序的可维护性和可读性也更好。Feign支持动态服务发现可以在接口地址变更或服务重新发布后实现自动切换避免了因配置变更导致的杂乱代码更具有拓展性。Feign解决了服务之间依赖过于厚实的一种解决方案相比REST或RPCFeign可以减少大量不必要的代码。它基于可插拔修改的过滤链默认支持多种HTTP请求和响应。 OpenFeign功能升级 OpenFeign在Feign的基础上提供了增强和扩展功能 1、更好的集成SpringCloud其他组件可以和服务发现、负载均衡组件一起使用 2、支持FeignClient注解OpenFeign引入该注解作为Feign客户端标识可以方便地定义和使用远程服务调用 3、错误处理改进OpenFeign对异常进行了增强提供了更好的错误信息和异常处理机制让开发者更为准备的判断错误所在。 如OpenFeign提供的错误解码器DefaultErrorDecoder和回退策略当服务端返回错误响应或请求失败时OpenFeign会调用回退策略中的逻辑提供一个默认的处理结果。 4、更丰富的配置项可以对Feign客户端进行配置如超时时间、重传次数等 OpenFeign客户端 客户端与服务端的代码创建请前往Nacos 注册中心介绍与实操这篇文章上参考完成。 ① 要使用OpenFeign需要使用EnableFeignClients进行开启 SpringBootApplication EnableFeignClients public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);} }② 编写接口服务并使用FeginClient(name“xxxx”)来指定调用的服务站点 Service FeignClient(name nacos-provider) public interface UserService {RequestMapping(/user/getInfo)public String getInfo(RequestParam(name) String name); }③ 调用接口 RestController public class OrderController {private final UserService userService;Autowiredpublic OrderController(UserService userService) {this.userService userService;}RequestMapping(/order)public String getInfo(){if(userService null){return null;}return userService.getInfo( Spring Cloud);} }④ 最终结果 OpenFeign中的超时重试机制 众所周知在这个机器交互过程中网络是最为复杂和难以控制的而我们的微服务讲究的就是一个高并发高可用那么解决交互上存在的网络问题是十分必要的。 那么在OpenFeign中采用的方式就是超时重传和TCP协议中的超时重传机制一样链接或者消息在一定时间没有回应就会重新发送一次。 其实这很容易理解就像我们在平时打电话你沟通时过一会对面都没有回应你也会“喂喂听得见吗”的消息确认。 开启超时重传机制 OpenFeign在默认情况下是不会开启这个机制的需要我们人为去开启那么开启需要通过下面两个步骤 配置超时重传覆盖Retryer对象 1、配置 spring:cloud:openfeign:client:config:default: # 全局配置connect-timeout: 1000 # ms 链接超时时间read-timeout: 1000 # ms 读取超时时间2、覆盖 在消费者目录下的config包下构建并注入IOC容器 Configuration public class RetryerConfig {Beanpublic Retryer retryer(){return new Retryer.Default(1000, // 重试间隔时间1000, // 最大间隔时间3 // 最大重试次数);} }为了演示超时重传的触发我们在生产者代码上使用Thread.sleep(2000)来让线程睡眠并且在进打印调用的时刻这个睡眠时间超过配置中的read-time1000 RestController RequestMapping(/user) public class UserController {RequestMapping(/getInfo)public String getInfo(RequestParam(name) String name){System.out.println(provider.getInfo方法执行时间 LocalDateTime.now());try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}return producer name;} }生产者控制台信息 客户端结果 下面我们队这个结果进行一个简单的分析 ① 在consumer.getInfo()对provider.getInfo(“Spring Cloud”)进行调用的时候由于provider.getInfo(“Spring Cloud”)中进行了睡眠并且(sleep2000ms) (read-time1000ms)所以引发了超时现象 ② 超时后由于我们设置了超时重试次数那么OpenFeign将会按照这个Retryer中的规则进行重试再次调用了provider.getInfo(“Spring Cloud”)方法再次打印了方法执行时间 ③ 在重试了一定次数后我们的consumer.getInfo()都收不到回应那么就会导致客户端获取信息失败然后就报了500错误任务是服务端出错了。 以上就是超时重传的简单实操不过需要做一点简单的补充可能有同学已经发现了provider控制台打印的时间上有点和想象中的不一样 这里我们可以看到重试是两秒左右才进行的而我们connect-time 1000ms ||read-time1000ms都不为一秒啊为什么是两秒才调用而不是一秒呢 如果有以上问题的同学应该是忘记了Retryer中的一个参数重试间隔时间1000ms这就以为则如果我们出现了超时问题具体重传的时间还需要加上重试间隔时间才是真正调用服务的时间connect-time 1000 || read-time 1000 (period 1000) executetime 自定义超时重试机制 无敌的Spring Cloud肯定也思考到了灵活性所以也提供了自定义超时重试机制的方式分为下面两个步骤 自定义超时重试机制实现Retryer接口重写continueOrPropagate设置配置文件 三种自定义超时重试类 固定时间间隔也就是说每次重试开始时间间隔一样例如上面的实操例子增长性间隔例如第一次超时重试间隔1秒第二次2秒第三次3秒具体如何增长看业务实现的增长函数随机时间间隔重试间隔在一定范围内随机 自定义超时类实操 说明 :这个实操基于第一种自定义超时类来实现不需要注入IOC 1、自定义超时重试机制 public class MyRetryConfig implements Retryer {private final int maxAttempts; // 最大尝试次数private final long intervalTime;// 重试间隔时间private int attempt; // 当前尝试次数public MyRetryConfig() {this.maxAttempts 3;this.intervalTime 1000;this.attempt 0;}public MyRetryConfig(int maxAttempts, long intervalTime) {this.maxAttempts 3;this.intervalTime 1000;this.attempt 0;}Overridepublic void continueOrPropagate(RetryableException e) {// 假如当前尝试次数超过了最大尝试次数就抛出异常if(this.attempt this.maxAttempts){throw e;}long curInterval this.intervalTime;// 打印日志System.out.println(LocalDateTime.now() 执行了一次重试);try {Thread.sleep(curInterval);} catch (InterruptedException ex) {throw new RuntimeException(ex);}}/*** 克隆创建独立的实例* return*/Overridepublic Retryer clone() {// 克隆的间隔时间和重试次数当然要和被克隆对象一直所以有参构造更为正确return new MyRetryConfig(maxAttempts, intervalTime);} } 2、将自定义超时重传类声明到yml配置文件中 关键词retryer: com.example.consumer.config.MyRetryConfig spring:application:# 服务注册站点name: nacos-consumer #命名不能使用‘_’早期SpringCloud不支持cloud:nacos:# Nacos认证信息discovery:username: nacospassword: nacos# Nacos 服务发现与注册配置其中子属性server-addr指定Nacos服务器主机和端口server-addr: localhost:8848namespace: public # 注册到nacos的指定namespace默认publicregister-enabled: falseopenfeign:client:config:default: # 全局配置connect-timeout: 1000 # ms 链接超时时间read-timeout: 1000 # ms 读取超时时间retryer: com.example.consumer.config.MyRetryConfig server:port: 8080测试结果 超时重试底层原理 超时原理 超时原理其实很简单OpenFeign超时底层实现是通过配置HTTP客户端来实现通过你对配置文件的connect-timeout和read-timeout来底层进行设置 OpenFeign底层的HTTP客户端可以使用Apache HttpClient或者OK HttpClient来实现默认是ApacheHttpClient 重试原理 通过观察OpenFeign 的源码实现就可以了解重试功能的底层实现它的源码在 SynchronousMethodHandler 的 invoke 方法下如下所示 **public Object invoke(Object[] argv) throws Throwable {RequestTemplate template this.buildTemplateFromArgs.create(argv);Request.Options options this.findOptions(argv);Retryer retryer this.retryer.clone();// 一直重试while(true) {try {// 如果得到结果就return退出循环return this.executeAndDecode(template, options);} catch (RetryableException var9) {RetryableException e var9;try {// 如果遇到异常则调用Retryer的continueOrPropagateretryer.continueOrPropagate(e);} catch (RetryableException var8) {Throwable cause var8.getCause();if (this.propagationPolicy ExceptionPropagationPolicy.UNWRAP cause ! null) {throw cause;}throw var8;}if (this.logLevel ! Level.NONE) {this.logger.logRetry(this.metadata.configKey(), this.logLevel);}}}}Retryer的continueOrPropagate方法底层实现 public void continueOrPropagate(RetryableException e) {if (this.attempt this.maxAttempts) {throw e;} else {long interval;if (e.retryAfter() ! null) {interval e.retryAfter().getTime() - this.currentTimeMillis();if (interval this.maxPeriod) {interval this.maxPeriod;}if (interval 0L) {return;}} else {interval this.nextMaxInterval();}try {Thread.sleep(interval);} catch (InterruptedException var5) {Thread.currentThread().interrupt();throw e;}this.sleptForMillis interval;}}补充说明 OpenFeign实现原理 1.注解 2.动态代理实现—功能扩展 3.RestTemplate发送HTTP请求 4.HTTP框架来实现Web请求-Apache HttpClient或者OK HttpClient END 希望对你有帮助