2026/5/21 15:31:30
网站建设
项目流程
网站建设公司排行杭州,电子商务网站建设jsp考卷,苏州哪个公司做门户网站,如何将一个网页生成链接点击上方“程序员蜗牛g”#xff0c;选择“设为星标”跟蜗牛哥一起#xff0c;每天进步一点点程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点33篇原创内容公众号首先要了解Feign是如何进行远程调用的#xff0c;这里面包括#xff0c;注册中心、负载均衡、FeignClie…点击上方“程序员蜗牛g”选择“设为星标”跟蜗牛哥一起每天进步一点点程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点33篇原创内容公众号首先要了解Feign是如何进行远程调用的这里面包括注册中心、负载均衡、FeignClient之间的关系微服务通过不论是eureka、nacos也好注册到服务端Feign是靠Ribbon做负载的而Ribbon需要拿到注册中心的服务列表将服务进行负载缓存到本地然后FeignClient客户端在进行调用大概就是这么一个过程。Ribbon是如何进行负载的首先我们要清楚Ribbon是如何进行负载的也就是如何获取nacos、eureka的服务列表这个很关键。RibbonClientConfigurationRibbonClientConfiguration类中通过LoadBalancer我们知道ribbon是靠LoadBalancer做负载的无非就是ILoadBalancer接口的方法依次是添加新的服务、在负载均衡里选择一个服务、markServerDown服务下线、获取服务列表、获取存活的服务器、获取所有服务器包括健康和不健康的ZoneAwareLoadBalancerloadBalancer默认的是ZoneAwareLoadBalancer负载均衡器通过继承父类DynamicServerListLoadBalancer的restOfInit方法里面比较重要的两个方法enableAndInitLearnNewServersFeature和updateListOfServers方法enableAndInitLearnNewServersFeature方法里面LOGGER.info(Using serverListUpdater {}, serverListUpdater.getClass().getSimpleName()); serverListUpdater.start(updateAction);让我们看ServerListUpdater.start方法的实现通过自定义线程去拿这就是获取服务列表Ribbon负载均衡策略服务列表获取说了当然负载均衡的策略这块也有必要讲一下主要有七种RoundRobinRule轮询策略按照服务顺序依次循环调用WeightedResponseTimeRule权重比策略优先选择权重比高的服务也就是服务响应时间比较短的响应时间越长权重比越低RandomRule随机策略服务提供者列表随机选择一个服务BestAvailableRule最小连接数策略获取服务列表中连接数最小的服务实例RetryRule重试策略重试获取已经失效的服务指定时间没有获取到返回NULLAvailabilityFilteringRule可用性敏感策略过滤非健康服务实例选择lianjiZoneAvoidanceRule区域敏感策略Ribbon-eager-load饥饿加载模式Ribbon对于负载Client是在服务启动后发生调用的时候才会去创建Client所以在第一次发生http请求调用的时候不光要算上http的请求时间还要算上Client的创建时间所以第一次调用的时候才会很慢写个方法调用下;System 服务调用System2服务GetMapping(/requestSystem2Api) public String requestSystem2Api(){ long startTime System.currentTimeMillis(); RString stringR iTestServiceClient.testRequestMethod(); if (null !stringR){ log.info(接口返回stringR.getMsg()); } long needTime System.currentTimeMillis() - startTime; log.info(接口调用需要的时间needTime); return ; }从调用日志可以看出第一次调用System2服务Ribbon的DynamicServerListLoadBalancer会将feign客户端进行负载然后进行调用第一次调用的时间就是会长一些第二次调用直接进行请求可以看到调用时间很快。开启Ribbon饥饿加载ribbon: nacos: enabled:true# 开启naocos轮询 eager-load: enabled:true# 开启Ribbon的饥饿加载模式(防止第一次请求超时的问题) clients:Lxlxxx-system2# 指定需要开启的服务(需要开启Ribbon的饥饿加载模式) ReadTimeout:10000 ConnectTimeout:10000 MaxAutoRetries:0 MaxAutoRetriesNextServer:1 OkToRetryOnAllOperations:false在项目启动的时候可以从日志看到已经把Lxlxxx-system2服务进行加载从而避免了第一次请求超时的情况总结其实这种饥饿加载模式类似于“客户端负载预热”的一个操作项目启动的时候进行加载防止服务之间调用可以因为数据量、业务逻辑处理复杂性导致接口超时如果你的服务之间调用业务处理比较复杂、且慢不妨可以试试这种解决方式。如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。关注公众号woniuxgg在公众号中回复笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利