美文网首页spring cloud / spring boot 专题
Docker+Spring cloud访问报错Whitelabe

Docker+Spring cloud访问报错Whitelabe

作者: 王大千_xMol_西摩尔 | 来源:发表于2019-01-31 16:15 被阅读103次

    三台测试服务器:10.167.200.75、10.167.200.76、10.167.200.77
    两个项目:question-service(8861)、question-views(8862)、question-center(8761)
    spring cloud 、 Docker 、 nginx

    service、views项目通过center的注册中心,将服务注册到注册中心,然后由注册中心进行分配消费。
    docker 启动容器的命令:

    docker run -d -p 8861:8861 --name question-service-c question-service-i
    docker run -d -p 8862:8862 --name question-view-c question-view-i
    

    使用docker命令启动项目都能正常启动,但是通过view项目验证页面的时候,浏览器报出下面错误:

    Whitelabel Error Page

    This application has no explicit mapping for /error, so you are seeing this as a fallback.

    Thu May 24 00:55:01 EDT 2018
    There was an unexpected error (type=Internal Server Error, status=500).
    Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers

    后台日志报错如下错误:

    2018-05-24 00:53:25.182 [http-nio-8862-exec-8] ERROR org.thymeleaf.TemplateEngine - [THYMELEAF][http-nio-8862-exec-8] Exception processing template "initTelCheck": Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers
    org.thymeleaf.exceptions.TemplateInputException: Error resolving template "initTelCheck", template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:870)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)

    因为项目用到了thymeleaf模板,以为是模板问题。但是经过分析和猜想,其实是view项目通过注册中心访问service项目的时候,无法访问到service项目的地址。(实在是没想明白为什么会报模板的错误??)

    既然找到了问题所在,就要找什么原因导致的。
    其实单独75、76、77三台机器访问service的地址,都是可以访问的(也就是说明service项目是启动起来了)
    但是为什么view找不到service地址呢? 原因是容器启动的时候,都会有容器自己的命名空间,分配属于容器独立的IP,在注册中心这里,service项目会将容器的独立IP注册到注册中心上,这样注册中心注册的映射IP不是真实可访问的IP(比如75这台机器,正常访问service项目应该是http://10.167.200.75:8861/service, 但是注册中心上的注册信息的IP却是0.0.0.0 而非10.167.200.75),这就导致view通过注册中心请求service项目时,注册中心就映射错误的地址(http://0.0.0.0:8861/service

    问题的症结就找到了,那么该如何解决呢?
    既然是service的注册IP有问题,那就应该想办法将正确的IP注册到center(注册中心)中。 怎么做呢?
    通过修改 创建容器的命令就可以做到:

    docker run -d -p 8861:8861 --name question-service-c question-service-i
    

    修改为

    docker run -d -p 8861:8861 --net=host --name telrobot-question-service-c-test telrobot-question-service-i
    

    是的,增加一个启动参数 --net=host 什么意思呢?
    这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。
    如此一来,service项目在注册中心注册的IP地址就成了宿主的实际IP(75/76/77)。

    问题解决!
    仅此记录!

    相关文章

      网友评论

        本文标题:Docker+Spring cloud访问报错Whitelabe

        本文链接:https://www.haomeiwen.com/subject/ufxlsqtx.html