天天看點

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項目難免走很多彎路,希望能幫到大家少走彎路,技術水準有限,經驗不足,難免有不恰當的地方,歡迎指正。