springCloud-Alibaba

作者:前度

时间: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实现用户鉴权

步骤: 实现GlobalFilterOrder接口,重写方法

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值