作者:前度
时间:2022-1-9
参考:https://www.bilibili.com/video/BV1zm4y1Q7sT
01、SpringCloud与Alibaba
组件
微服务工程模块构建
步骤:
1:建module
2:改pom
3:写yml
4:主启动
5:业务类
02、创建maven聚合项目
父项目pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>qd-springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>qd-cloud-api8001</module>
</modules>
<!--统一管理jar包版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<lombok.version>1.18.20</lombok.version>
<log4j.version>1.2.17</log4j.version>
<mysql.version>8.0.26</mysql.version>
<druid.version>1.2.6</druid.version>
<mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version>
</properties>
<!--子模块继承,提供作用:锁定版本+子modlue不用写groupId与version-->
<!--父pom文件使用dependencyManagement能让所在在子项目中引用一个依赖不用显示的列出版本号 -->
<!--dependencyManagement只是声明依赖,并不实现引入,子项目需要显示的声明需要用到的依赖-->
<dependencyManagement>
<dependencies>
<!--spring boot 2.3.3-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR8-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--标配-->
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
注意:父pom中的依赖只是版本管理,子模块pom需引入相关需要依赖
03、服务注册中心–Nacos
官网:https://nacos.io/zh-cn/docs/quick-start.html
下载地址:https://github.com/alibaba/nacos/releases
相关命令查看官网
相关命令
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
4.服务注册&发现和配置管理
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
5.关闭服务器
Linux/Unix/Mac
sh shutdown.sh
Windows
shutdown.cmd
或者双击shutdown.cmd运行文件。
导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置Nacos
spring
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动类添加注解
@EnableDiscoveryClient
服务调用修改
在使用nacos之前,服务与服务之间的调用是通过http请求调用的如restTemplate、httpClient。。。
以前:
@Autowired
private RestTemplate restTemplate;
@GetMapping("/save")
public Object save(int id){
User user=restTemplate.getForObject("url",User.class);
//继续操作
}
现在配置:
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/save")
public Object save(int id){
//返回集群-负载均衡
List<ServiceInstance> list=discoveryClient.getInstances("需要调用的服务application-name");
//获取第一个节点
ServiceInstance serviceInstance=list.get(0);
serviceInstance.getHost();
serviceInstance.getport();
User user=restTemplate.getForObject("url拼接host与端口",User.class);
//继续操作
}
04、负载均衡组件–Ribbon
从软硬件角度负载均衡种类:
- 通过硬件解决,常见硬件:F5,Array等商用负载均衡器,比较昂贵
- 通过软件解决,常用软件:LVS,Nginx
从端的角度负载均衡种类:
- 服务端负载均衡
- 客户端负载均衡
常见的负载均衡策略:
1、节点轮询–按顺序分配到不同的服务器
2、权重配置–根据权重分配到后端服务器
3、固定分发–根据请求访问结果分配
4、随机分发、最短响应时间等
配置添加注解
Ribbon是一个客户端负载均衡工具,通过SpringCloud封装,默认为轮询策略
增加@Loadbalanced
注解
@Bean
@Loadbalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
调用实践
@Autowired
private RestTemplate restTemplate;
@GetMapping("/save")
public Object save(int id){
User user=restTemplate.getForObject("http://application-name/具体的请求地址",User.class);
//继续操作
}
负载均衡策略调整
调整配置
nacos服务名称(比如qd-order-service)(在其他服务中配置,不建议修改,没有要求默认即可)
qd-order-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
05、新负载均衡组件–OPen Feign
官网:https://spring.io/projects/spring-cloud-openfeign
子项目添加pom依赖
<!--
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类添加注解
@EnableFeignClients
编写接口
//service层增加接口,服务名称与Nacos保持一致 比如商品模块qd-goods-service
@FeifnClient(value="qd-goods-service")
public interface GoodsService(){
@GetMapping("/v1/goods/findById") //具体的请求地址
Goods findById(@requestParam("goodsId") int goodsId);
}
Controller层
@Autowired
private GoodsService goodsService;
@GetMapping("/findById")
public Object findById(int id){
goodsService.findById(id)
//继续操作
}
POST方式实现远程调用
注意:形参为对象的话需要加 @RequestBody 注解
//service层增加接口,服务名称与Nacos保持一致 比如商品模块qd-goods-service
@FeifnClient(value="qd-goods-service")
public interface GoodsService(){
@PostMapping("/v1/goods/save")
public Googds save(@RequestBody Goods goods);
}
//===============
controller层
@GetMapping("/save")
public Object findById(int id){
goodsService.save(@RequestBody Goods goods);
//继续操作
}
06、微服务架构容错方案
高并发下的容错方案:
1、限流
- 漏斗:不管流量多大,均匀流入容器,令牌桶算法,漏桶算法
2、熔断
- 保险丝:熔断服务,为了防止整个系统的故障,熔断风控服务
3、降级
- 抛弃一些非核心的接口与数据,返回兜底数据。(双十一期间禁止退款服务)
4、隔离
- 服务与服务之间进行隔离,不会因为某个服务的资源不足而影响另一个服务
07、流控防护组件–Sentinel
官网:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
官网:https://sentinelguard.io/zh-cn/
概念简介
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
核心概念:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
引入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
控制台搭建
官网:https://sentinelguard.io/zh-cn/docs/dashboard.html
Sentinel 控制台包含如下功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 规则管理和推送:统一管理推送规则。
- 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
注意:Sentinel 控制台目前仅支持单机部署。
启动控制台:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其中 -Dserver.port=8080
用于指定 Sentinel 控制台端口为 8080
。
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel
。注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
整合Sentinel
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 9999
#dashboard:8080 控制台端口
#port: 9999 本地启的端口,随机选个不能被占用的,与dashboard进行数据交互,会在应用对应的机器上启动一个HttpServer,#该server会与sentinel控制台做交互
#微服务注册上去后,由于Sentinel是懒加载模式,所以需要访问微服务后才会在控制台出现
08、Sentinel规则与实战
流量控制详细操作
1、基于统计并发线程数的流量控制
并发数控制用于保护业务线程不被耗尽
Sentinel 并发控制并不负责创建和管理线程池,只是简单统计当前请求上下文的线程数目,如果超出阈值,新的请求会被拒绝
2、基于统计QPS的流量控制
当QPS超出某个阈值的时候,采取流量控制
控制面板介绍
熔断规则操作
官网:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html
Sentinel 提供以下几种熔断策略:
- 慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。
- 比例阈值:为百分比
- 熔断时长:超过时间后尝试恢复
- 最小请求数:熔断触发的最小请求数,小于该请求数不会触发
- 异常比例 :当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
- 异常数 :当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
熔断状态与恢复
服务熔断分为3种:
- 熔断关闭(Closed)–服务没有故障,对调用方的调用不做任何限制
- 熔断开启(Open)–后续对该接口的调用不在经过网络
- 半熔断(Half-Open)–尝试恢复服务调用,允许有限的流量调用该服务并监控调用成功率
熔断恢复:
- 经过熔断时长后容器进入探测恢复状态尝试恢复服务调用,允许有限的流量调用该服务并监控调用成功率
- 如果成功率达标,则说明服务已经恢复,进入熔断关闭状态,如果成功率低,继续熔断
自定义异常信息
1、默认的降级、限流返回数据问题,并没有返回json信息,提示很不友好
2、AlibabaCloud升级到2.2.0后,不兼容问题。
自定义异常信息
异常种类:
FlowException //限流异常
DegradeException //降级异常
ParamFlowException //参数限流异常
SystemBlockException //授权异常
AuthorityException //系统负载异常
代码编写
@Component
public class QdBlockExceptionHandler implements BlockExceptionHandler{
public void handle(HttpServletRequest httpServletRequest,
HttpServlrtResponse httpServlrtResponse,
BlockException e) throws Exception{
Map<String,Object> info = new HashMap<>();
if(e instanceof FlowException){
info.put("code",50001);
info.put("msg","限流异常");
}else if(e instanceof DegradeException){
info.put("code",50002);
info.put("msg","降级异常");
}else if(e instanceof ParamFlowException){
info.put("code",50003);
info.put("msg","参数限流异常");
}else if(e instanceof SystemBlockException){
info.put("code",50004);
info.put("msg","授权异常");
}else{
info.put("code",50005);
info.put("msg","系统负载异常");
}
// 设置json格式
httpServlrtResponse.setStatus(200);
httpServlrtResponse.setHeader("content-type","application/json;charset=UTF-8");
httpServlrtResponse.getWriter().write(JSON.toJSONString(info));
}
}
Sentinel整合Open Feign
整合的意义:加入我们的服务挂掉了话,显示错误信息不是太友好,我们可以返回兜底的数据到前台显示,这就是整合的意义
添加依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
开启Feign对Sentinel的支持
feign:
sentinel:
enable: true
创建容错类,实现对应的服务接口
@Service
public class GoodsServiceFallback implements() GoodsService{
@Override
public Goods findById(int goodsId){
Goods goods = new Goods("这是熔断返回的数据");
return goods;
}
}
对应接口配置
//service层增加接口,服务名称与Nacos保持一致 比如商品模块qd-goods-service
//配置fallback参数,出错后,会自动调用重写的方法
@FeifnClient(value="qd-goods-service",fallback = GoodsServiceFallback.class)
public interface GoodsService(){
@GetMapping("/v1/goods/findById") //具体的请求地址
Goods findById(@requestParam("goodsId") int goodsId);
}
@FeifnClient(value="qd-goods-service",fallback = GoodsServiceFallback.class)
09、服务网关组件–Gateway
官网:https://spring.io/projects/spring-cloud-gateway
什么是微服务网关?
网关是系统的唯一对外的入口,介于客户端与服务端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、限流、缓存等
1、统一接入
- 智能路由
- 测试
- 负载均衡、容错处理
- 日志处理
2、流量监控
- 限流处理
- 服务降级
3、安全防护
- 鉴权处理
- 监控
- 机器隔离
新建模块
创建springboot项目
添加Getaway依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
yml配置
sever:
port: 88888
spring:
application:
name: api-gateway
cloud:
gateway:
routes: # 数组形式
- id: order-service #路由唯一标识
uri: https://example.org #想要转发的地址
order: 1 #优先级,数字越小优先级越高
predicates: #断言 数组形式
- Cookie=mycookie,mycookievalue
- Path=/order-sever/**
filter: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第一层前缀
整合Nacos
网关添加Nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类开启支持
@EnableDiscoveryClient
修改配置文件
sever:
port: 88888
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes: # 数组形式
- id: order-service #路由唯一标识
#uri: https://example.org #想要转发的地址
uri: lb://nacos面板服务名称 #从nacos进行转发
order: 1 #优先级,数字越小优先级越高
predicates: #断言 数组形式
- Cookie=mycookie,mycookievalue
- Path=/order-sever/**
filter: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第一层前缀
discovery:
locator:
enabled: true #开启网关拉取nacos的服务
断言规则配置
predicates: #断言 数组形式
- Cookie= #携带的cookie
- Path= #访问路径
- Method= #方法配置
- Header= #必须携带配置请求头
- Query= #必须携带配置参数
- Before= #当前时间超过配置时间禁止访问
过滤器配置
自定义Filter实现用户鉴权
步骤: 实现GlobalFilter
、Order
接口,重写方法
publica class UserLoginFilter implements GlobalFilter,Order{
}
ps:网关不要写太多的业务处理逻辑,否则会影响性能
10、链路追踪组件–Sleuth
官网:https://spring.io/projects/spring-cloud-sleuth
当前存在的问题:
微服务调用链路出现了问题怎么排查?
微服务调用链路耗时怎么定位是哪个服务?
解决:使用链路追踪将一次请求分布式调用,是雇佣GPS定位串起来,记录每个服务调用的时长,性能等,通过可视化工具展示出来。
maven依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
可视化追踪组件–Zipkin
官网:https://zipkin.io/
大规模分布式系统的APM工具,和Sleuth整合可以提供web界面分析调用链路耗时情况
安装包:https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec
启动:
docker pull openzipkin/zipkin:la
java -jar zipkin-server-2.23.16-exec.jar
## 访问
http://loaclhost:9411
sleuth整合Zipkin
- Sleuth收集信息通过http请求发送到Zipkin sever
- Zipkin sever进行信息跟踪以及提供api
- Zipkin UI展示数据信息,默认存储的地址是内存,可以用mysql或者noSQL存储
添加依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
修改yml
spring:
applcation:
name: api-gateway
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin地址
discovery-client-enabled: false #不用开启服务发现
sleuth:
sampler:
probability: 1.0 #采样百分比
#默认为0.1,即10%,这里配置1,是记录全部的sleuth信息,是为了收集到更多的数据〈仅供测试用)。在分布式系统中,过于频繁的采样会影响系统性能,所以这里配置需要采用一个合适的值。
11、分布式配置中心–Nacos
官网:https://github.com/alibaba/nacos-config
当前存在问题:
- 配置文件增多,不易维护
- 修改配置文件需要重新发布
什么是配置中心呢?
解释:统一管理配置,快速切换各个环境的配置
Ncaos既可以充当服务注册,也可以充当配置中心
添加依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
bootstrap.yml
不能使用原先的application.yml,需要添加bootstrap.yml文件
配置读取优先级:bootstrap.yml > application.yml
spring:
application:
name: qd-order-service
cloud:
nacos:
config:
server-addr: 127.0.0.1;8848 #nacos配置中心
file-extension: yaml #文件格式
profiles:
active: dev
面板操作:发布即可 (本地的application.yml可以注释或者删除)
验证配置是否成功
http://127.0.0.1:8848/nacos/v1/cs/config?dataId=qd-order-service-dev.yaml&group=DEFAULT_GROUP
Nacos动态刷新配置
当前存在问题:
在nacos更改配置后,需要重新启动服务才能获取最新配置,采用动态刷新即可解决这个问题
yml测试文件
qd:
name: 前度
controller
@Controller
@RefreshScope
public class HelloController{
@Value("${qd.name}")
private String name;
public String hello (){
return name;
}
}
这样配置之后,当我们改变配置文件的值,会自动获取最新的数据
要点:@RefreshScope
微服务Docker打包镜像讲解
父项目依赖修改
<properties>
<java.version>8</java.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.boot.version>2.5.4</spring.boot.version>
</properties>
子模块添加依赖
<!--配置前称-->
<properties>
<docker.image.prefix>qd-cloud</docker.image.prefix>
</properties>
<build>
<fileName>服务名称</fileName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<!--docker打包配置-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.buid.fileName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
DockerFile文件
在每个服务下新建 Dockerfile
文件
#FROM openjdk:8-jdk-alpine
FROM hub.c.163.com/dwyane/openjdk:8
MAINTAINER qinadu<邮箱地址>
EXPOSE 8080 # 对外暴露的端口
CMD ["--server.port:8080"] # 映射端口
CMD echo "---Docker容器环境配置成功,即将运行...---"
#copy *.jar /app.jar
ARG JAR_FILE
copy ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像
控制台进入到子模块下输入以下命令:
mvn install -Dmaven.test.skip=true dockerfile:build