Linux 服务器部署 Spring Boot 项目-Eureka

2021年03月11日 23:03 · 阅读(512) ·

开发环境

名称 版本
操作系统 Windows 10 X64
JDK 1.8(jdk-8u151-windows-x64)
IntelliJ IDEA ULTIMATE 2018.3
Maven 3.6.0
VMware® Workstation 12 Pro 12.0.0 build-2985596
CentOS7 CentOS Linux release 7.8.2003 (Core)
Linux 3.10.0-1127.el7.x86_64

对应项目部署在虚拟机 Linux 下,IP 是 192.168.114.128

参考

Linux下启动java程序的通用脚本

相关内容

IntelliJ IDEA 2018.3 创建 Maven 多模块(Module)项目+负载均衡【持续更新】

Maven 相关错误总结【持续更新】

8.Spring Boot打包

项目结构

Eureka 项目代码

1.enta-parent.pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <!-- <parent>-->
  6. <!-- <groupId>org.springframework.boot</groupId>-->
  7. <!-- <artifactId>spring-boot-dependencies</artifactId>-->
  8. <!-- <version>2.1.9.RELEASE</version>-->
  9. <!-- </parent>-->
  10. <groupId>com.demo.enta</groupId>
  11. <artifactId>enta-parent</artifactId>
  12. <version>1.0.3.RELEASE</version>
  13. <name>enta-parent</name>
  14. <packaging>pom</packaging>
  15. <description>
  16. enta基本库,负责引入公共开源lib库版本定义、maven发布配置、环境配置等职责
  17. -----这个版本主要解决以下问题------
  18. 漏洞描述:
  19. VMware Tanzu发布安全公告,在Spring Framework版本5.2.0-5.2.8、5.1.0-5.1.17、5.0.0-5.0.18、4.3.0-4.3.28和较旧的不受支持的版本中,公布了一个存在于Spring Framework中的反射型文件下载(Reflected File Download,RFD)漏洞CVE-2020-5421。
  20. CVE-2020-5421 可通过jsessionid路径参数,绕过防御RFD攻击的保护。攻击者通过向用户发送带有批处理脚本扩展名的URL,使用户下载并执行文件,从而危害用户系统。VMware Tanzu官方已发布修复漏洞的新版本。
  21. Spring Framework是 Java 平台的一个开源全栈应用程序框架和控制反转容器实现,一般被直接称为 Spring。
  22. 漏洞等级:高危
  23. 受影响的版本:
  24. Spring Framework
  25. 5.2.0 - 5.2.8
  26. 5.1.0 - 5.1.17
  27. 5.0.0 - 5.0.18
  28. 4.3.0 - 4.3.28
  29. 及更早期的版本
  30. 安全版本:
  31. Spring Framework
  32. 5.2.9
  33. 5.1.18
  34. 5.0.19
  35. 4.3.29
  36. 下载链接:
  37. https://github.com/spring-projects/spring-framework/releases
  38. fastJson : 1.2.67 -> 1.2.69 版本
  39. xstream: 1.4.10 -> 1.4.11 版本
  40. </description>
  41. <properties>
  42. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  43. <project.repofastjsonrting.outputEncoding>UTF-8</project.repofastjsonrting.outputEncoding>
  44. <java.version>1.8</java.version>
  45. <resource.delimiter>@</resource.delimiter>
  46. <maven.compiler.source>${java.version}</maven.compiler.source>
  47. <maven.compiler.target>${java.version}</maven.compiler.target>
  48. <maven.compiler.compilerVersion>${java.version}</maven.compiler.compilerVersion>
  49. <spring.boot.version>2.1.9.RELEASE</spring.boot.version>
  50. <spring.cloud.version>Greenwich.RELEASE</spring.cloud.version>
  51. <mybatis-plus-spring-boot-starter.version>3.1.0</mybatis-plus-spring-boot-starter.version>
  52. <mybatisplus.version>3.1.0</mybatisplus.version>
  53. <fastjson.version>1.2.69</fastjson.version>
  54. <swagger.version>2.7.0</swagger.version>
  55. <swagger-ui.version>2.7.0</swagger-ui.version>
  56. <swagger-bootstrap-ui.version>1.9.2</swagger-bootstrap-ui.version>
  57. <commons-codec.version>1.10</commons-codec.version>
  58. <commons-lang3.version>3.6</commons-lang3.version>
  59. <commons-io.version>2.5</commons-io.version>
  60. <commons-text.version>1.7</commons-text.version>
  61. <commons-httpclient.version>3.1</commons-httpclient.version>
  62. <HikariCP.version>3.3.1</HikariCP.version>
  63. <velocity.version>1.7</velocity.version>
  64. <jjwt.version>0.8.0</jjwt.version>
  65. <jjwt.version2>3.4.1</jjwt.version2>
  66. <hutool.version>4.5.1</hutool.version>
  67. <lombok.version>1.18.8</lombok.version>
  68. <gson.version>2.8.5</gson.version>
  69. <guava.version>23.0</guava.version>
  70. <security-oauth2.version>2.3.6.RELEASE</security-oauth2.version>
  71. <p6spy.version>3.8.5</p6spy.version>
  72. <druid.version>1.1.20</druid.version>
  73. <druid.starter.version>1.1.20</druid.starter.version>
  74. <feign-okhttp.version>10.5.1</feign-okhttp.version>
  75. <spring.boot.admin.server.version>2.1.6</spring.boot.admin.server.version>
  76. <dec.version>0.1.2</dec.version>
  77. <spring.version>5.1.18.RELEASE</spring.version>
  78. <spring-framework.version>${spring.version}</spring-framework.version>
  79. <xstream.version>1.4.11</xstream.version>
  80. </properties>
  81. <!--Spring Cloud 版本序列配置-->
  82. <dependencyManagement>
  83. <dependencies>
  84. <!-- Override springframework release train provided by Spring Boot -->
  85. <!--https://www.cnblogs.com/zhangjianbin/p/10076427.html-->
  86. <dependency>
  87. <groupId>org.springframework</groupId>
  88. <artifactId>spring-core</artifactId>
  89. <version>${spring-framework.version}</version>
  90. <scope>import</scope>
  91. <type>pom</type>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.springframework</groupId>
  95. <artifactId>spring-framework-bom</artifactId>
  96. <version>${spring-framework.version}</version>
  97. <type>pom</type>
  98. <scope>import</scope>
  99. </dependency>
  100. <dependency>
  101. <groupId>org.springframework.boot</groupId>
  102. <artifactId>spring-boot-dependencies</artifactId>
  103. <version>${spring.boot.version}</version>
  104. <type>pom</type>
  105. <scope>import</scope>
  106. </dependency>
  107. <dependency>
  108. <groupId>com.thoughtworks.xstream</groupId>
  109. <artifactId>xstream</artifactId>
  110. <version>${xstream.version}</version>
  111. <scope>import</scope>
  112. <type>pom</type>
  113. </dependency>
  114. <dependency>
  115. <groupId>org.springframework.cloud</groupId>
  116. <artifactId>spring-cloud-dependencies</artifactId>
  117. <version>${spring.cloud.version}</version>
  118. <type>pom</type>
  119. <scope>import</scope>
  120. <exclusions>
  121. <exclusion>
  122. <groupId>redis.clients</groupId>
  123. <artifactId>jedis</artifactId>
  124. </exclusion>
  125. </exclusions>
  126. </dependency>
  127. <!-- 用于日志切面中,以 json 格式打印出入参(本来使用阿里的 FASTJSON, 但是对于文件上传的接口,打印参数会报错,换为 Gson) -->
  128. <dependency>
  129. <groupId>com.google.code.gson</groupId>
  130. <artifactId>gson</artifactId>
  131. <version>${gson.version}</version>
  132. </dependency>
  133. <!--lombok start-->
  134. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  135. <dependency>
  136. <groupId>org.projectlombok</groupId>
  137. <artifactId>lombok</artifactId>
  138. <version>${lombok.version}</version>
  139. </dependency>
  140. <!--lombok end-->
  141. <!--fastJson start-->
  142. <dependency>
  143. <groupId>com.alibaba</groupId>
  144. <artifactId>fastjson</artifactId>
  145. <version>${fastjson.version}</version>
  146. </dependency>
  147. <!--fastJson end-->
  148. <dependency>
  149. <groupId>com.alibaba</groupId>
  150. <artifactId>druid-spring-boot-starter</artifactId>
  151. <version>${druid.starter.version}</version>
  152. </dependency>
  153. <!--swagger start-->
  154. <dependency>
  155. <groupId>io.springfox</groupId>
  156. <artifactId>springfox-swagger2</artifactId>
  157. <version>${swagger.version}</version>
  158. </dependency>
  159. <dependency>
  160. <groupId>io.springfox</groupId>
  161. <artifactId>springfox-swagger-ui</artifactId>
  162. <version>${swagger-ui.version}</version>
  163. </dependency>
  164. <dependency>
  165. <groupId>com.github.xiaoymin</groupId>
  166. <artifactId>swagger-bootstrap-ui</artifactId>
  167. <version>${swagger-bootstrap-ui.version}</version>
  168. </dependency>
  169. <!--swagger end-->
  170. <dependency>
  171. <groupId>com.google.guava</groupId>
  172. <artifactId>guava</artifactId>
  173. <version>${guava.version}</version>
  174. </dependency>
  175. <!--jwt start-->
  176. <dependency>
  177. <groupId>io.jsonwebtoken</groupId>
  178. <artifactId>jjwt</artifactId>
  179. <version>${jjwt.version}</version>
  180. </dependency>
  181. <!--jwt end-->
  182. <dependency>
  183. <groupId>com.auth0</groupId>
  184. <artifactId>java-jwt</artifactId>
  185. <version>${jjwt.version2}</version>
  186. </dependency>
  187. <dependency>
  188. <groupId>commons-io</groupId>
  189. <artifactId>commons-io</artifactId>
  190. <version>${commons-io.version}</version>
  191. </dependency>
  192. <dependency>
  193. <groupId>cn.hutool</groupId>
  194. <artifactId>hutool-all</artifactId>
  195. <version>${hutool.version}</version>
  196. </dependency>
  197. <dependency>
  198. <groupId>org.apache.commons</groupId>
  199. <artifactId>commons-text</artifactId>
  200. <version>${commons-text.version}</version>
  201. </dependency>
  202. <dependency>
  203. <groupId>org.springframework.security.oauth</groupId>
  204. <artifactId>spring-security-oauth2</artifactId>
  205. <version>${security-oauth2.version}</version>
  206. </dependency>
  207. <dependency>
  208. <groupId>com.baomidou</groupId>
  209. <artifactId>mybatis-plus-boot-starter</artifactId>
  210. <version>${mybatis-plus-spring-boot-starter.version}</version>
  211. </dependency>
  212. <dependency>
  213. <groupId>com.baomidou</groupId>
  214. <artifactId>mybatis-plus</artifactId>
  215. <version>${mybatisplus.version}</version>
  216. </dependency>
  217. <dependency>
  218. <groupId>io.github.openfeign</groupId>
  219. <artifactId>feign-okhttp</artifactId>
  220. <version>${feign-okhttp.version}</version>
  221. </dependency>
  222. <dependency>
  223. <groupId>de.codecentric</groupId>
  224. <artifactId>spring-boot-admin-starter-server</artifactId>
  225. <version>${spring.boot.admin.server.version}</version>
  226. </dependency>
  227. <!-- https://mvnrepository.com/artifact/org.brotli/dec -->
  228. <dependency>
  229. <groupId>org.brotli</groupId>
  230. <artifactId>dec</artifactId>
  231. <version>${dec.version}</version>
  232. </dependency>
  233. </dependencies>
  234. </dependencyManagement>
  235. <!--注意:这里必须要添加,否则各种依赖有问题-->
  236. <!--<repositories>-->
  237. <!--<repository>-->
  238. <!--<id>spring-milestones</id>-->
  239. <!--<name>Spring Milestones</name>-->
  240. <!--<url>https://repo.spring.io/libs-milestone</url>-->
  241. <!--<snapshots>-->
  242. <!--<enabled>false</enabled>-->
  243. <!--</snapshots>-->
  244. <!--</repository>-->
  245. <!--</repositories>-->
  246. <distributionManagement>
  247. <!--<repository>-->
  248. <!--<id>internal.releases</id>-->
  249. <!--<name>internal repository for releases</name>-->
  250. <!--<url>http://maven.oa.com/nexus/content/repositories/thirdparty/</url>-->
  251. <!--</repository>-->
  252. <!--<snapshotRepository>-->
  253. <!--<id>internal.snapshots</id>-->
  254. <!--<name>internal repository for snapshots</name>-->
  255. <!--<url>http://maven.oa.com/nexus/content/repositories/thirdparty-snapshots/</url>-->
  256. <!--</snapshotRepository>-->
  257. </distributionManagement>
  258. </project>

2.pom.xml【demo-framework】

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>enta-parent</artifactId>
  7. <groupId>com.demo.enta</groupId>
  8. <version>1.0.3.RELEASE</version>
  9. <relativePath>enta-parent.pom.xml</relativePath>
  10. </parent>
  11. <name>demo-framework</name>
  12. <modelVersion>4.0.0</modelVersion>
  13. <groupId>com.demo.framework</groupId>
  14. <artifactId>demo.framework</artifactId>
  15. <version>1.0-SNAPSHOT</version>
  16. <!--在父级项目中的 pom.xml 文件使用的 packaging 配置一定为 pom。-->
  17. <!--父级的 pom 文件只作项目的子模块的整合-->
  18. <!--在 maven install 时不会生成 jar/war 压缩包-->
  19. <packaging>pom</packaging>
  20. <modules>
  21. <module>demo-eureka</module>
  22. </modules>
  23. <!--基础配置-->
  24. <properties>
  25. <java.version>1.8</java.version>
  26. <!--项目统一字符集编码-->
  27. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  28. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  29. </properties>
  30. <dependencies>
  31. <!--Spring Boot 执行器组件-->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-actuator</artifactId>
  35. </dependency>
  36. <!--Spring Cloud 基础-->
  37. <dependency>
  38. <groupId>org.springframework.cloud</groupId>
  39. <artifactId>spring-cloud-starter</artifactId>
  40. </dependency>
  41. <!--Spring Cloud 服务注册组件-->
  42. <dependency>
  43. <groupId>org.springframework.cloud</groupId>
  44. <!--此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-eureka-server-->
  45. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  46. </dependency>
  47. <!--Spring Boot Web组件-->
  48. <dependency>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-starter-web</artifactId>
  51. </dependency>
  52. <!-- 参数校验信息 -->
  53. <dependency>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-starter-validation</artifactId>
  56. <version>2.1.9.RELEASE</version>
  57. </dependency>
  58. <!-- spring aop start -->
  59. <dependency>
  60. <groupId>org.springframework.boot</groupId>
  61. <artifactId>spring-boot-starter-aop</artifactId>
  62. </dependency>
  63. <!-- spring aop end -->
  64. <!--Spring Boot 测试组件-->
  65. <dependency>
  66. <groupId>org.springframework.boot</groupId>
  67. <artifactId>spring-boot-starter-test</artifactId>
  68. <scope>test</scope>
  69. </dependency>
  70. <dependency>
  71. <groupId>org.json</groupId>
  72. <artifactId>json</artifactId>
  73. <version>20200518</version>
  74. </dependency>
  75. </dependencies>
  76. </project>

3.pom.xml【demo-eureka】

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>demo.framework</artifactId>
  7. <groupId>com.demo.framework</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <name>demo-eureka</name>
  11. <modelVersion>4.0.0</modelVersion>
  12. <artifactId>demo-eureka</artifactId>
  13. <!--使用 jar 方式打包-->
  14. <packaging>jar</packaging>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  17. </properties>
  18. <dependencies>
  19. <!-- 引入此jar会有版本冲突问题
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-netflix-eureka-server</artifactId>
  23. <version>2.1.0.RC2</version>
  24. </dependency>-->
  25. <!--虽然 enta-parent.pom.xml 引用了这个组件,但是这里不引用,程序还是会报错"程序包 lombok.extern.slf4j不存在"-->
  26. <dependency>
  27. <groupId>org.projectlombok</groupId>
  28. <artifactId>lombok</artifactId>
  29. <version>1.18.8</version>
  30. </dependency>
  31. </dependencies>
  32. <build>
  33. <finalName>${project.artifactId}</finalName>
  34. <plugins>
  35. <plugin>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-maven-plugin</artifactId>
  38. <executions>
  39. <execution>
  40. <goals>
  41. <!--如果要访问info接口想获取maven中的属性内容请记得添加如下内容-->
  42. <goal>build-info</goal>
  43. <goal>repackage</goal>
  44. </goals>
  45. </execution>
  46. </executions>
  47. <!-- 构建不包含lib的jar包-->
  48. <configuration>
  49. <layout>ZIP</layout>
  50. <includes>
  51. <include>
  52. <groupId>non-exists</groupId>
  53. <artifactId>non-exists</artifactId>
  54. </include>
  55. </includes>
  56. </configuration>
  57. </plugin>
  58. <plugin>
  59. <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
  60. <groupId>org.apache.maven.plugins</groupId>
  61. <artifactId>maven-compiler-plugin</artifactId>
  62. <version>3.1</version>
  63. <configuration>
  64. <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->
  65. <source>1.8</source> <!-- 源代码使用的JDK版本 -->
  66. <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
  67. <encoding>UTF-8</encoding><!-- 字符集编码 -->
  68. </configuration>
  69. </plugin>
  70. <plugin>
  71. <groupId>org.sonarsource.scanner.maven</groupId>
  72. <artifactId>sonar-maven-plugin</artifactId>
  73. <version>3.5.0.1254</version>
  74. </plugin>
  75. <!-- 打包跳过TEST -->
  76. <plugin>
  77. <groupId>org.apache.maven.plugins</groupId>
  78. <artifactId>maven-surefire-plugin</artifactId>
  79. <version>2.18.1</version>
  80. <configuration>
  81. <!--true跳过测试 -->
  82. <skipTests>true</skipTests>
  83. </configuration>
  84. </plugin>
  85. <!-- 打jar包不包含yml文件 -->
  86. <plugin>
  87. <groupId>org.apache.maven.plugins</groupId>
  88. <artifactId>maven-jar-plugin</artifactId>
  89. <configuration>
  90. <!-- 排除配置文件 -->
  91. <excludes>
  92. <exclude>*.yml</exclude>
  93. <exclude>*.xml</exclude>
  94. </excludes>
  95. </configuration>
  96. </plugin>
  97. <!-- 配置文件打包到conf目录下 -->
  98. <plugin>
  99. <artifactId>maven-resources-plugin</artifactId>
  100. <executions>
  101. <execution>
  102. <id>copy-sources</id>
  103. <phase>process-sources</phase>
  104. <goals>
  105. <goal>copy-resources</goal>
  106. </goals>
  107. <configuration>
  108. <outputDirectory>${project.build.directory}/conf</outputDirectory>
  109. <resources>
  110. <resource>
  111. <directory>src/main/resources</directory>
  112. <includes>
  113. <include>*.yml</include>
  114. <include>*.xml</include>
  115. </includes>
  116. </resource>
  117. </resources>
  118. </configuration>
  119. </execution>
  120. </executions>
  121. </plugin>
  122. <!-- 依赖包到lib目录下 -->
  123. <plugin>
  124. <groupId>org.apache.maven.plugins</groupId>
  125. <artifactId>maven-dependency-plugin</artifactId>
  126. <executions>
  127. <execution>
  128. <id>copy-dependencies</id>
  129. <phase>package</phase>
  130. <goals>
  131. <goal>copy-dependencies</goal>
  132. </goals>
  133. <configuration>
  134. <outputDirectory>${project.build.directory}/lib</outputDirectory>
  135. <useBaseVersion>true</useBaseVersion>
  136. </configuration>
  137. </execution>
  138. </executions>
  139. </plugin>
  140. </plugins>
  141. <resources>
  142. <resource>
  143. <directory>src/main/resources</directory>
  144. <includes>
  145. <include>**/*</include>
  146. </includes>
  147. <filtering>false</filtering>
  148. </resource>
  149. </resources>
  150. </build>
  151. </project>

4.application.yml

  1. spring:
  2. application:
  3. name: demo-eureka
  4. server:
  5. port: 8771
  6. # 配置Eureka Server 信息
  7. eureka:
  8. client:
  9. # 不进行注册(当服务注册中心是单点而非高可用时的配置方式)
  10. registerWithEureka: false
  11. # 不获取注册信息(当服务注册中心是单点而非高可用时的配置方式)
  12. fetchRegistry: false
  13. service-url:
  14. defaultZone: http://localhost:${server.port}/eureka/
  15. # 自定义实例编号
  16. instance:
  17. # 优先使用IP地址方式进行注册服务
  18. prefer-ip-address: true
  19. # 配置使用指定IP
  20. ip-address: 127.0.0.1
  21. instance-id: ${eureka.instance.ip-address}:${server.port}
  22. # 配置使用主机名注册服务
  23. #hostname: peer1
  24. logging:
  25. config: classpath:logback-dev.xml
  26. #path: /data/DATA_DIR/logs/demo/demo-eureka

5.bootstrap.properties

  1. #由于 logback-spring.xml 的加载在 application.properties之前,所以之前的配置 logback-spring.xml无法获取到 spring.application.name属性,因此这里将该属性移动到最先加载的 bootstrap.properties配置文件中。
  2. #https://cloud.tencent.com/developer/article/1067431
  3. spring.application.name=eureka-ha

6.logback-dev.xml

  1. <!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
  2. <configuration scan="true" scanPeriod="10 seconds">
  3. <!--继承spring boot提供的logback配置-->
  4. <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
  5. <!--设置系统日志目录-->
  6. <property name="APP_DIR" value="demo-eureka" />
  7. <!-- 彩色日志 -->
  8. <!-- 彩色日志依赖的渲染类 -->
  9. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  10. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  11. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  12. <!-- 彩色日志格式 -->
  13. <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  14. <!-- 控制台输出 -->
  15. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  16. <encoder>
  17. <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
  18. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  19. </encoder>
  20. <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
  21. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  22. <level>info</level>
  23. </filter>
  24. </appender>
  25. <!-- 时间滚动输出 level为 DEBUG 日志 -->
  26. <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  27. <!-- 正在记录的日志文件的路径及文件名 -->
  28. <file>${LOG_PATH}/log_debug.log</file>
  29. <!--日志文件输出格式-->
  30. <encoder>
  31. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  32. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  33. </encoder>
  34. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  35. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  36. <!--
  37. 归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  38. 而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
  39. -->
  40. <fileNamePattern>${LOG_PATH}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  41. <!--
  42. 除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
  43. 命名日志文件,例如log-error-2017-04-26.0.log
  44. -->
  45. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  46. <maxFileSize>500MB</maxFileSize>
  47. </timeBasedFileNamingAndTriggeringPolicy>
  48. <!--日志文件保留天数-->
  49. <maxHistory>30</maxHistory>
  50. </rollingPolicy>
  51. <!-- 此日志文件只记录debug级别的 -->
  52. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  53. <level>debug</level>
  54. <onMatch>ACCEPT</onMatch>
  55. <onMismatch>DENY</onMismatch>
  56. </filter>
  57. </appender>
  58. <!-- 时间滚动输出 level为 INFO 日志 -->
  59. <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  60. <!-- 正在记录的日志文件的路径及文件名 -->
  61. <file>${LOG_PATH}/log_info.log</file>
  62. <!--日志文件输出格式-->
  63. <encoder>
  64. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  65. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  66. </encoder>
  67. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  68. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  69. <!--
  70. 归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  71. 而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
  72. -->
  73. <fileNamePattern>${LOG_PATH}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  74. <!--
  75. 除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
  76. 命名日志文件,例如log-error-2017-04-26.0.log
  77. -->
  78. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  79. <maxFileSize>500MB</maxFileSize>
  80. </timeBasedFileNamingAndTriggeringPolicy>
  81. <!--日志文件保留天数-->
  82. <maxHistory>30</maxHistory>
  83. </rollingPolicy>
  84. <!-- 此日志文件只记录info级别的 -->
  85. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  86. <level>info</level>
  87. <onMatch>ACCEPT</onMatch>
  88. <onMismatch>DENY</onMismatch>
  89. </filter>
  90. </appender>
  91. <!-- 时间滚动输出 level为 WARN 日志 -->
  92. <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  93. <!-- 正在记录的日志文件的路径及文件名 -->
  94. <file>${LOG_PATH}/log_warn.log</file>
  95. <!--日志文件输出格式-->
  96. <encoder>
  97. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  98. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  99. </encoder>
  100. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  101. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  102. <!--
  103. 归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  104. 而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
  105. -->
  106. <fileNamePattern>${LOG_PATH}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  107. <!--
  108. 除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
  109. 命名日志文件,例如log-error-2017-04-26.0.log
  110. -->
  111. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  112. <maxFileSize>500MB</maxFileSize>
  113. </timeBasedFileNamingAndTriggeringPolicy>
  114. <!--日志文件保留天数-->
  115. <maxHistory>30</maxHistory>
  116. </rollingPolicy>
  117. <!-- 此日志文件只记录warn级别的 -->
  118. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  119. <level>warn</level>
  120. <onMatch>ACCEPT</onMatch>
  121. <onMismatch>DENY</onMismatch>
  122. </filter>
  123. </appender>
  124. <!-- 时间滚动输出 level为 ERROR 日志 -->
  125. <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  126. <!-- 正在记录的日志文件的路径及文件名 -->
  127. <file>${LOG_PATH}/log_error.log</file>
  128. <!--日志文件输出格式-->
  129. <encoder>
  130. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  131. <charset>UTF-8</charset> <!-- 此处设置字符集 -->
  132. </encoder>
  133. <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  134. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  135. <!--
  136. 归档的日志文件的路径,例如今天是2017-04-26日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
  137. 而2017-04-26的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引
  138. -->
  139. <fileNamePattern>${LOG_PATH}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  140. <!--
  141. 除按日志记录之外,还配置了日志文件不能超过500M,若超过500M,日志文件会以索引0开始,
  142. 命名日志文件,例如log-error-2017-04-26.0.log
  143. -->
  144. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  145. <maxFileSize>500MB</maxFileSize>
  146. </timeBasedFileNamingAndTriggeringPolicy>
  147. <!--日志文件保留天数-->
  148. <maxHistory>30</maxHistory>
  149. </rollingPolicy>
  150. <!-- 此日志文件只记录ERROR级别的 -->
  151. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  152. <level>error</level>
  153. <onMatch>ACCEPT</onMatch>
  154. <onMismatch>DENY</onMismatch>
  155. </filter>
  156. </appender>
  157. <logger name="org.springframework.web" level="info"/>
  158. <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
  159. <!--name的属性值一定要是当前工程的java代码的完整目录,因为mybatis打印的日志级别是debug级别的,因此需要配置debug级别日志扫描的目录-->
  160. <logger name="com.demo.eureka" level="debug"/>
  161. <!--开发环境:打印控制台-->
  162. <!--<springProfile name="dev">-->
  163. <root level="info">
  164. <appender-ref ref="CONSOLE" />
  165. <appender-ref ref="DEBUG_FILE" />
  166. <appender-ref ref="INFO_FILE" />
  167. <appender-ref ref="WARN_FILE" />
  168. <appender-ref ref="ERROR_FILE" />
  169. </root>
  170. <!--</springProfile>-->
  171. <!--测试环境:打印控制台和输出到文件-->
  172. <springProfile name="test">
  173. <root level="info">
  174. <appender-ref ref="CONSOLE" />
  175. <appender-ref ref="INFO_FILE" />
  176. <appender-ref ref="WARN_FILE" />
  177. <appender-ref ref="ERROR_FILE" />
  178. </root>
  179. </springProfile>
  180. <!--生产环境:输出到文件-->
  181. <springProfile name="prod">
  182. <root level="info">
  183. <appender-ref ref="DEBUG_FILE" />
  184. <appender-ref ref="INFO_FILE" />
  185. <appender-ref ref="ERROR_FILE" />
  186. </root>
  187. </springProfile>
  188. </configuration>

7.EureKaHaApplication

  1. package com.demo.eureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
  5. import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  6. import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
  7. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  8. import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
  9. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  10. //排除掉数据库配置项目
  11. @SpringBootApplication( exclude = {
  12. DataSourceAutoConfiguration.class,
  13. DataSourceTransactionManagerAutoConfiguration.class,
  14. RedisAutoConfiguration.class,
  15. RedisRepositoriesAutoConfiguration.class,
  16. RabbitAutoConfiguration.class
  17. })
  18. @EnableEurekaServer
  19. public class EureKaHaApplication {
  20. public static void main(String[] args) {
  21. SpringApplication.run(EureKaHaApplication.class, args);
  22. }
  23. }

8.EurekaStateChangeListener

  1. package com.demo.eureka;
  2. import com.netflix.appinfo.InstanceInfo;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.cloud.netflix.eureka.server.event.*;
  5. import org.springframework.context.event.EventListener;
  6. import org.springframework.stereotype.Component;
  7. @Slf4j
  8. @Component
  9. public class EurekaStateChangeListener {
  10. @EventListener
  11. public void listen(EurekaInstanceCanceledEvent event) {
  12. log.info(event.getServerId() + "\t" + event.getAppName() + " 服务下线");
  13. }
  14. @EventListener
  15. public void listen(EurekaInstanceRegisteredEvent event) {
  16. InstanceInfo instanceInfo = event.getInstanceInfo();
  17. log.info(instanceInfo.getAppName() + "进行注册");
  18. }
  19. @EventListener
  20. public void listen(EurekaInstanceRenewedEvent event) {
  21. log.info(event.getServerId() + "\t" + event.getAppName() + " 服务进行续约");
  22. }
  23. @EventListener
  24. public void listen(EurekaRegistryAvailableEvent event) {
  25. log.info("注册中心 启动");
  26. }
  27. @EventListener
  28. public void listen(EurekaServerStartedEvent event) {
  29. log.info("Eureka Server 启动");
  30. }
  31. }

9.本地先运行项目并测试通过

运行 EureKaHaApplication main() ,访问 http://127.0.0.1:8771/

Eureka 项目打包

1.父项目 clear

Maven-demo-framework-Lifecyle-clean

查看控制台,最后出现成功的提示即可

  1. [INFO] demo-framework ..................................... SUCCESS [ 0.453 s]
  2. [INFO] demo-eureka ........................................ SUCCESS [ 0.361 s]
  3. [INFO] ------------------------------------------------------------------------
  4. [INFO] BUILD SUCCESS
  5. [INFO] ------------------------------------------------------------------------
  6. [INFO] Total time: 2.856 s
  7. [INFO] Finished at: 2021-03-14T09:18:01+08:00
  8. [INFO] ------------------------------------------------------------------------
  9. 进程已结束,退出代码 0

2.父项目 install

Maven-demo-framework-Lifecyle-install

查看控制台,最后出现成功的提示即可

  1. [INFO] demo-framework ..................................... SUCCESS [ 0.870 s]
  2. [INFO] demo-eureka ........................................ SUCCESS [ 21.390 s]
  3. [INFO] ------------------------------------------------------------------------
  4. [INFO] BUILD SUCCESS
  5. [INFO] ------------------------------------------------------------------------
  6. [INFO] Total time: 23.711 s
  7. [INFO] Finished at: 2021-03-14T22:24:23+08:00
  8. [INFO] ------------------------------------------------------------------------
  9. 进程已结束,退出代码 0

3.eureka 项目 clear

Maven-demo-eureka-Lifecyle-clean

查看控制台,最后出现成功的提示即可

  1. [INFO] -------------------< com.demo.framework:demo-eureka >-------------------
  2. [INFO] Building demo-eureka 1.0-SNAPSHOT
  3. [INFO] --------------------------------[ jar ]---------------------------------
  4. [INFO]
  5. [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ demo-eureka ---
  6. [INFO] Deleting D:\Java\demo-framework\demo-eureka\target
  7. [INFO] ------------------------------------------------------------------------
  8. [INFO] BUILD SUCCESS
  9. [INFO] ------------------------------------------------------------------------
  10. [INFO] Total time: 0.904 s
  11. [INFO] Finished at: 2021-03-14T22:27:42+08:00
  12. [INFO] ------------------------------------------------------------------------
  13. 进程已结束,退出代码 0

4.eureka 项目 package

Maven-demo-eureka-Lifecyle-package

查看控制台,最后出现成功的提示即可

  1. [INFO] --- maven-install-plugin:2.4:install (default-install) @ demo-eureka ---
  2. [INFO] Installing D:\Java\demo-framework\demo-eureka\target\demo-eureka.jar to D:\Program Files\Maven\Repository\com\demo\framework\demo-eureka\1.0-SNAPSHOT\demo-eureka-1.0-SNAPSHOT.jar
  3. [INFO] Installing D:\Java\demo-framework\demo-eureka\pom.xml to D:\Program Files\Maven\Repository\com\demo\framework\demo-eureka\1.0-SNAPSHOT\demo-eureka-1.0-SNAPSHOT.pom
  4. [INFO] ------------------------------------------------------------------------
  5. [INFO] BUILD SUCCESS
  6. [INFO] ------------------------------------------------------------------------
  7. [INFO] Total time: 6.308 s
  8. [INFO] Finished at: 2021-03-14T22:29:10+08:00
  9. [INFO] ------------------------------------------------------------------------
  10. 进程已结束,退出代码 0

查看发布包

D:\Java\demo-framework\demo-eureka\target

Eureka 部署到 Linux 服务器

1.创建项目目录和拷贝文件

创建项目目录

  1. mkdir -p /data/USERS/luoma/applications/demo-eureka

其它的文件也是类似的方法,对应文件目录结构如下,需要拷贝打包好的发布包相关内容到对应文件夹

  1. ├── conf
  2. ├── application.yml
  3. └── logback-dev.xml
  4. ├── demo-eureka.jar
  5. ├── deploy.sh
  6. ├── lib
  7. ├── 相关 jar 文件

2.application.yml

测试环境 yml 文件和环境有一些细小的差异

  1. server:
  2. port: 8771
  3. # 配置Eureka Server 信息
  4. eureka:
  5. client:
  6. # 不进行注册(当服务注册中心是单点而非高可用时的配置方式)
  7. registerWithEureka: false
  8. # 不获取注册信息(当服务注册中心是单点而非高可用时的配置方式)
  9. fetchRegistry: false
  10. service-url:
  11. defaultZone: http://localhost:${server.port}/eureka/
  12. # 自定义实例编号
  13. instance:
  14. # 优先使用IP地址方式进行注册服务
  15. prefer-ip-address: true
  16. # 配置使用指定IP
  17. ip-address: 127.0.0.1
  18. instance-id: ${eureka.instance.ip-address}:${server.port}
  19. # 配置使用主机名注册服务
  20. #hostname: peer1
  21. logging:
  22. config: conf/logback-dev.xml
  23. path: /data/USERS/luoma/applications/demo-eureka/logs
  24. management:
  25. #暴露所有端点
  26. endpoints:
  27. web:
  28. exposure:
  29. include: "*"
  30. #详细信息显示给所有用户
  31. endpoint:
  32. health:
  33. show-details: ALWAYS
  34. server:
  35. port: 5001

3.服务启动文件 deploy.sh

  1. #!/bin/sh
  2. # 服务名称
  3. SERVER_NAME=demo-eureka.jar
  4. # 全局变量,程序的在系统中的 id
  5. server_pid=0
  6. # 判断程序是否已经启动,若已启动,则初始化全局 server_pid,方便下面停止程序时使用
  7. check_pid(){
  8. javaps=`ps -ef | grep $SERVER_NAME |grep -v grep `
  9. if [ -n "$javaps" ]; then
  10. server_pid=`echo $javaps | awk '{print $2}'`
  11. else
  12. server_pid=0
  13. fi
  14. }
  15. ###################################
  16. # 启动程序
  17. # 说明:
  18. # 1.首先判断程序是否已经启动
  19. # 2.已启动,则提示用户;未启动,则执行命令启动程序
  20. # 3.最后输出启动启动程序的结果
  21. ###################################
  22. start(){
  23. check_pid
  24. if [ $server_pid -ne 0 ]; then
  25. echo "================================"
  26. echo "warn:$SERVER_NAME already started! (pid=$server_pid)"
  27. echo "================================"
  28. else
  29. echo -n "Starting $SERVER_NAME..."
  30. java -Xms2048m -Xmx2048m -Dserver.port=8771 -Dloader.path=./lib/ -jar $SERVER_NAME --spring.config.location=/data/USERS/luoma/applications/demo-eureka/conf/application.yml >/dev/null 2>&1 &
  31. check_pid
  32. if [ $server_pid -ne 0 ]; then
  33. echo "(pid=$server_pid) [OK]"
  34. else
  35. echo "[Failed]"
  36. fi
  37. fi
  38. }
  39. ###################################
  40. #停止程序
  41. # 说明:
  42. # 1. 首先调用 checkpid 函数,刷新 $server_pid 全局变量
  43. # 2. 如果程序已经启动($server_pid 不等于0),则开始执行停止,否则,提示程序未运行
  44. # 3. 使用 kill 命令进行强制杀死进程
  45. # 4. 执行 kill 命令行紧接其后,马上查看上一句命令的返回值: $?
  46. # 5. 如果步骤 4 的结果 $? 等于 0,则打印 [OK],否则打印 [Failed]
  47. # 6. 为了防止 java 程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用 stop)。
  48. # 注意: echo -n 表示打印字符后,不换行
  49. # 注意: 在 shell 编程中,"$?" 表示上一句命令或者一个函数的返回值
  50. ###################################
  51. stop(){
  52. check_pid
  53. if [ $server_pid -ne 0 ]; then
  54. echo -n "Stopping $SERVER_NAME...(pid=$server_pid) "
  55. kill $server_pid
  56. sleep 2
  57. if [ $? -eq 0 ];then
  58. echo "[OK]"
  59. else
  60. echo "[Failed]"
  61. fi
  62. check_pid
  63. if [ $server_pid -ne 0 ]; then
  64. stop
  65. fi
  66. else
  67. echo "================================"
  68. echo "warn:$SERVER_NAME is not running"
  69. echo "================================"
  70. fi
  71. }
  72. ###################################
  73. # 检查程序运行状态
  74. # 说明:
  75. # 1. 首先调用 checkpid 函数,刷新 $server_pid 全局变量
  76. # 2. 如果程序已经启动($server_pid 不等于 0),则提示正在运行并表示出 server_pid
  77. # 3. 否则,提示程序未运行
  78. ###################################
  79. status(){
  80. check_pid
  81. if [ $server_pid -ne 0 ]; then
  82. echo "$SERVER_NAME is running! (pid=$server_pid)"
  83. else
  84. echo "$SERVER_NAME is not running"
  85. fi
  86. }
  87. ###################################
  88. #读取脚本的第一个参数($1),进行判断
  89. #参数取值范围:{start|debug|stop|restart|status|info|log}
  90. #如参数不在指定范围之内,则打印帮助信息
  91. ###################################
  92. case "$1" in
  93. 'start')
  94. start
  95. ;;
  96. 'stop')
  97. stop
  98. ;;
  99. 'restart')
  100. stop
  101. start
  102. ;;
  103. 'status')
  104. status
  105. ;;
  106. *)
  107. echo "Usage: $0 {start|stop|restart|status}"
  108. exit 1
  109. esac
  110. exit 0

其它文件和开发环境一致

4.启动 Eureka 项目

进入目录 cd /data/USERS/luoma/applications/demo-eureka

启动项目 ./deploy.sh start

  1. [root@luoma demo-eureka]# ./deploy.sh start
  2. Starting demo-eureka.jar...(pid=3347) [OK]

相关问题总结

1.deploy.sh: 权限不够

进入目录 cd /data/USERS/luoma/applications/demo-eureka,启动项目,报错

  1. [root@luoma demo-eureka]# ./deploy.sh start
  2. -bash: ./deploy.sh: 权限不够

解决办法

https://blog.csdn.net/wugenqiang/article/details/81285517

chmod 命令对 shell 脚本赋予权限

  1. chmod 777 ./deploy.sh

2.坏的解释器: 没有那个文件或目录

  1. [root@luoma demo-eureka]# ./deploy.sh start
  2. -bash: ./deploy.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录

原因是 deploy.sh 文件在 Windows 下编辑过,Linux 下的换行符和 Windows 的不一样,所以需要转换一下

https://blog.csdn.net/qing_mei_xiu/article/details/53995233

  1. sed -i 's/\r$//' deploy.sh

3.拒绝连接

启动后访问 http://127.0.0.1:8771

报错

  1. [root@luoma demo-eureka]# curl 127.0.0.1:8771
  2. curl: (7) Failed connect to 127.0.0.1:8771; 拒绝连接

解决办法,检查相关 yml 配置文件 application.yml 和启动文件 deploy.sh 中相关配置是否正确

5.运行测试

在 Windows 下打开浏览器,访问 Linux 服务器对应项目地址 http://192.168.114.128:8771/

部署成功。

项目源码下载

demo-framework-eureka.zip