SpringCloud踩坑记录

本人也是springcloud小白一个,把平时工作中遇到的问题整理出来方便日后查看也方便大家遇到同样的问题能有个解决方案。

1.feign做调用服务的客户端时,设置超时时间和ribbon的超时时间。

主要解决某些需要长时间响应的接口,不至于到了超时时间而进入fallback方法。

ribbon.ReadTimeout=5000(默认)

服务名.ribbon.ReadTimeout 指定服务设置

hystrix.command.类名#方法名(参数类型).execution.isolation.thread.timeoutInMilliseconds  来设置某个方法的超时时间。

确保Hystrix超时时间配置为长于配置的Ribbon超时时间

2.feign客户端在部署时若有contextpath应该设置 path="/***"来匹配你的服务名。
@FeignClient(name = "demoservice", path = "/demoservice", fallbackFactory = FallbackFactory.class)
public interface DemoService {

    @RequestMapping(method = RequestMethod.GET, value = "/user/{id}")
    String getUser(@PathVariable("id") String id);

    @Component
    class FeignClientFallbackFactory implements FallbackFactory<DemoService> {
        private static final Logger LOGGER = LoggerFactory.getLogger(FeignClientFallbackFactory.class);

        @Override
        public DemoService create(final Throwable cause) {
            return new DemoService() {

                @Override
                public String getUser(String id) {
                    LOGGER.error("fallback reason was:", cause);
                    Map<String, Object> map = new HashMap<>();
                    map.put("msg", "请求服务端接口失败,执行fallback方法");
                    return JSON.toJSONString(map);
                }

            };
        }
    }
}

我们正常把注册中心,服务提供方和服务调用方启起来,在本地测试可以通过,在docker里就访问不到调用不到提供方的服务了。我们通过日志可以分析出fallback的原因是404没有这个服务,说明我们的路径有问题,查看FeignClient源码可以看到。

/**
 * Path prefix to be used by all method-level mappings. Can be used with  or without
 * <code>@RibbonClient</code>.
 */
 String path() default "";

设置上path这个属性,我们就可以正常调用到提供方的服务了。

3.zuul组件路由有contextpath的服务时,应添加strip-prefix。
zuul.routes.portal.path=/portal/**
zuul.routes.portal.strip-prefix=false

portal是一个微服务应用,要通过zuul进行反向代理且有contextpath,就可以这么来配置。官方文档中也有提及,大家可以自行查阅。

4.zuul集成hystrix不显示线程池信息的解决办法。

zuul集成hystrix默认使用的是信号量隔离,不是线程隔离。
源码中可以看到默认是信号隔离的方式

private ExecutionIsolationStrategy ribbonIsolationStrategy = SEMAPHORE;
   /**
     * Isolation strategy to use when executing a {@link HystrixCommand}.
     * <p>
     * <ul>
     * <li>THREAD: Execute the {@link HystrixCommand#run()} method on a separate thread and restrict concurrent executions using the thread-pool size.</li>
     * <li>SEMAPHORE: Execute the {@link HystrixCommand#run()} method on the calling thread and restrict concurrent executions using the semaphore permit count.</li>
     * </ul>
     */
    public static enum ExecutionIsolationStrategy {
        THREAD, SEMAPHORE
    }

zuul.ribbon-isolation-strategy=THREAD 修改为线程隔离方式

推薦閱讀更多精彩內容