springcloud项目(eureka服务发现+zuul网关)部署至docker中tomcat

最近几天要把springcloud部署至测试服务器docker上,docker也是第一次用。以下是一些部署的心得及部分错误解决办法,以免遗忘。

一.首先springcloud项目,部署至tomcat需要做些修改:

       1.修改pom文件中的tomcat引入,增加servlet的jar包。另,如果pom文件中有jetty的引用,注释或删掉它。修改打包类型为war包。

       2.Application这个启动类,要做修改。如果使用@ComponentScan注解,建议直接修改application启动类。

       3.如果项目中没有数据库链接,application 启动类的@SpringBootApplication要添加参数,即@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})

      做好这3点基本上就可以打包部署了。

      具体如下:

      1.由于spring-boot-start-web中内置了tomcat,需要排除tomcat引用,另添加servlet的jar包

<dependency>  
         <groupId>org.springframework.boot</groupId>  
       <artifactId>spring-boot-starter-web</artifactId>  
         <exclusions>  
             <exclusion>  
               <groupId>org.springframework.boot</groupId>  
               <artifactId>spring-boot-starter-tomcat</artifactId>  
             </exclusion>  
         </exclusions>  
    </dependency>  
    <dependency>  
           <groupId>javax.servlet</groupId>  
           <artifactId>javax.servlet-api</artifactId>  
        </dependency> 

           如果有jetty的引用,需要注释或删掉。

      2.Application启动类,可以直接继承SpringBootServletInitializer 并重写configure方法

@SpringBootApplication
@EnableEurekaServer
public class UserApplication extends SpringBootServletInitializer{



@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(UserApplication.class);
}

public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}

     3. 如果项目中未配置数据库链接,需要把@SpringBootApplication的参数加上,即

       @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
@EnableEurekaServer
public class DiscoveryApplication extends SpringBootServletInitializer{



@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DiscoveryApplication.class);
}

public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}

        至此项目就可以打包部署至tomcat了。

二,eureka服务发现部署,需要特别注意访问地址

       开发过程中,eureka-service地址一般为(以8001为例):http://localhost:8001/eureka, eureka-client配置文件中为:eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka,如果eureka-service配置中spring.application.name不为空(以discovery为例)即spring.application.name=discovery,那么eureka-client的eureka.client.serviceUrl.defaultZone路径要配置为:http://localhost:8001/discovery/eureka。

即 eureka-service配置为:

spring.application.name=discovery
server.port=8001
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka

   eureka-client 配置要为:

  spring.cloud.config.discovery.enabled=true
eureka.instance.prefer-ip-address=true
eureka.client.serviceUrl.defaultZone=http://localhost:8001
/discovery/eureka

至此,eureka 服务发现才能发现服务。


三、zuul项目部署时要注意配置

server.port=8000
server.contextPath=/mall
spring.application.name=api
eureka.client.serviceUrl.defaultZone=http://localhost:8001/discovery/eureka

endpoints.restart.enabled=true
endpoints.shutdown.enabled=true

spring.zipkin.enabled=false

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 10000
ribbon.ConnectTimeout= 1000000
ribbon.ReadTimeout= 1000000

ribbon.MaxAutoRetries= 0
ribbon.MaxAutoRetriesNextServer= 0
ribbon.OkToRetryOnAllOperations= false

eureka.instance.prefer-ip-address=true

zuul.semaphore.max-semaphores=10000
zuul.host.maxTotalConnections=10000
zuul.host.max-per-route-connections=1000

# routes to serviceId
zuul.routes.user-srv.path=/user/**
zuul.routes.user-srv.service-id=user

zuul.routes.user-srv.stripPrefix=false

  如果配置中使用server.contextPath在开发中没有问题,但是部署到tomcat时,会有问题。建议直接去掉server.contextPath配置。

另查阅资料说

  1. #当stripPrefix=true的时候 (http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/user/list)  
  2. #当stripPrefix=false的时候(http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/api/user/list)
    (查阅资料地址:http://www.cnblogs.com/xd03122049/p/6036318.html)
     但在我项目中不起作用。项目中zuul.routes.user-srv.stripPrefix=false 这条必须加上,不然还是访问不到。

        

四、docker 部署项目

首先安装docker,拉去tomcat镜像。

其次,要在服务器创建放置war包的文件夹,把改地址指定到docker tomcat实例的webapps目录,这样项目才会启动

具体命令如下:docker run --name user -p 8020:8080 -v /Java/webapp/user/:/usr/local/tomcat/webapps -d tomcat

其中 --name是本次实例的name 可以通过它操作 实例,查看日志,重启等

-p 是指定服务器端口对应docker实例端口, 前面的是 服务器端口,后面的是 docker tomcat端口

-v指定本地war包地址对应的tomcat所在地址 前面的是服务器文件夹后面的是docker.tomcat文件夹

        -d 指定启动的镜像,如果镜像比较多,可以在 -d tomcat;版本号   指定版本号 不加默认使用最新版本




五、常见错误:

1.项目配置链接数据源,Application 的注解需要改为 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})

可解决此问题

Error starting ApplicationContext. Todisplay the auto-configuration report re-run your application with 'debug'enabled.

2017-08-08 02:04:40.102 ERROR 1 ---[ost-startStop-1] o.s.b.d.LoggingFailureAnalysisReporter   :

***************************

APPLICATION FAILED TO START

***************************

Description:

Cannot determine embedded database driverclass for database type NONE

Action:

If you want an embedded database please puta supported one on the classpath. If you have database settings to be loadedfrom a particular profile you may need to active it (the profiles"native" are currently active).

08-Aug-2017 02:04:40.102 SEVERE[localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternalContainerBase.addChild: start:

 org.apache.catalina.LifecycleException: Failedto start component[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/config-srv]]

       atorg.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

       atorg.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)

       atorg.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)

       atorg.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)

       atorg.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:988)

       atorg.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1860)

       atjava.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

       atjava.util.concurrent.FutureTask.run(FutureTask.java:266)

       atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

       atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

       atjava.lang.Thread.run(Thread.java:748)

2.服务发现zuul问题,可以参考第二,第三亲测没问题。

3.数据源转换异常,这个是我把HikariDataSource 数据源替换为DataSource 数据源解决

java.lang.ClassCastException: org.apache.tomcat.jdbc.pool.DataSource cannot be cast to com.zaxxer.hikari.HikariDataSource



第一次使用docker部署,第一次部署 springcloud项目难免走很多弯路,希望能帮到大家少走弯路,技术水平有限,经验不足,难免有不恰当的地方,欢迎指正。

猜你喜欢

转载自blog.csdn.net/litianquan/article/details/80551252