最近几天要把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包
如果有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配置。
另查阅资料说
四、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项目难免走很多弯路,希望能帮到大家少走弯路,技术水平有限,经验不足,难免有不恰当的地方,欢迎指正。