容器部署Spring Cloud项目

部署eureka和config

最后我们在rancher上部署eureka和config项目,首先我们需要在本地创建这两个项目的docker镜像,然后推送到网易云镜像仓库上。

关于使用Docker部署项目以及Rancher的安装及使用,可以参考我另外两篇文章,本文则不再赘述了:

在eureka项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:

FROM hub.c.163.com/library/java:8-alpine

MAINTAINER zeroJun [email protected]

ADD target/*.jar app.jar

EXPOSE 8761

ENTRYPOINT ["java", "-jar", "/app.jar"]

然后push到git仓库上,接着到服务器上,克隆这个仓库,并且登录你的网易云镜像仓库账户:

[[email protected] ~]# cd /tmp
[[email protected] /tmp]# git clone [email protected]:Zero-One/eureka.git
...
[[email protected] /tmp]# cd eureka/
[[email protected] /tmp/eureka]# docker login -u {登录账号} -p {你的网易云密码} hub.c.163.com
[[email protected] /tmp/eureka]#

注:由于windows下不太方便使用docker,所以我将项目上传到远程的git仓库,然后在一台CentOS服务器上完成这些操作。

编写一个简单的shell脚本来完成build镜像的工作:

[[email protected] /tmp/eureka]# vim build_eureka.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/eureka .
docker push hub.c.163.com/zerojun/eureka
[[email protected] /tmp/eureka]# 

运行脚本:

[[email protected] /tmp/eureka]# sh ./build_eureka.sh

脚本执行完成后,到镜像仓库上可以看到镜像已经成功push上来了:



完成eureka镜像的build后,我们使用同样的套路build config项目的docker镜像。同样的,在config项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:

FROM hub.c.163.com/library/java:8-alpine

MAINTAINER zeroJun [email protected]

ADD target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

并且修改配置文件中eureka的地址为服务名称,如下:

eureka:
  client:
    service-url:
      defaultZone: http://eureka:8761/eureka/  # 修改为rancher上的服务名称

然后push到git仓库上,接着到服务器上,克隆这个仓库,由于之前已经登录过网易云镜像仓库账户,所以不用登录了:

[[email protected] /tmp]# git clone [email protected]:Zero-One/config.git
...
[[email protected] /tmp]# cd config/
[[email protected] /tmp/config]# 

同样编写一个简单的shell脚本来完成build镜像的工作:

[[email protected] /tmp/config]# vim build_config.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/config .
docker push hub.c.163.com/zerojun/config
[[email protected] /tmp/config]# 

运行脚本:

[[email protected] /tmp/config]# sh ./build_config.sh


脚本执行完成后,此时镜像仓库上就有eureka和config的镜像了:

默认push的镜像都是私有的访问权限,我们需要设置为公开的,否则无法被外部访问:

点击镜像可以查看到镜像仓库详情,复制镜像的下载地址:

到rancher上部署工作负载:

部署完成:

使用浏览器看看是否能访问到eureka的信息面板:

eureka部署成功后,使用同样的方式去部署config:

不过我这里部署config失败,错误日志如下,提示无法启动内嵌的Tomcat:

尝试多次更改配置后,最后发现原来在pom.xml中,需要增加如下依赖(然而我本地没这个依赖运行却是正常的):

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

并且需要修改配置文件如下:

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/Zero-One/config-repo
          username: username
          password: password
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: username
    password: password
eureka:
  client:
    service-url:
      defaultZone: http://192.168.190.130/eureka/  # 修改为主机ip
  instance:
    prefer-ip-address: true  # 让eureka上的地址能够跳转到实例的ip地址
management:
  endpoints:
    web:
      exposure:
        include: "*" 

修改之后,需要重新push代码并build镜像,接着再到rancher上重新部署,这次就部署成功了:

也成功在注册中心注册上了:

但是我在浏览器上尝试去访问配置文件的时候无法访问,错误提示无法克隆仓库:

Cannot clone or checkout repository: https://gitee.com/Zero-One/config-repo

浏览器返回的信息如下:

经过一番排查后,发现是这个容器内无法ping通外网,所以无法克隆远程的仓库。确定问题后,马上查找不能ping通外网的原因。发现是因为Alpine系统使用了musl libc,与其他Linux发行版使用的glibc实现会有所不同,即musl实现的DNS服务不会使用resolv.conf文件中的search和domain两个配置。于是进入到容器中手动配置一下DNS解析,如下:

# vi /etc/resolv.conf
nameserver 218.2.135.1
nameserver 202.102.24.35

另一个方法是到rancher上修改容器的网络设置,这种方式会方便一些,因为容器会经常销毁、重建,每次都手动去配置DNS比较麻烦。如下:

注:使用这种方法会导致无法使用rancher的服务发现功能,也就是不能配置rancher里的服务名了,只能配置主机的ip地址

问题解决后,这时终于能够成功访问到配置文件了:


构建eureka高可用服务

在上一小节中,我们完成了eureka和config服务的部署,也解决了一些坑,但是还有个问题,就是目前eureka是单点的。eureka作为整个服务的注册中心,必然是需要高可用的,所以本小节我们来看看如何构建eureka高可用服务。首先创建application-eureka1.yml和application-eureka2.yml两个配置文件,如下:

application-eureka1.yml内容如下:

eureka:
  client:
    service-url:
      defaultZone: http://eureka2:8762/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8761

application-eureka2.yml内容如下:

eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8762

application.yml文件内容如下,默认选择eureka1:

spring:
  profiles:
    active: eureka1

然后push这些改动到远程的git仓库上,然后到服务器上拉取代码并重新build镜像:

[[email protected] ~]# cd /tmp/eureka/
[[email protected] /tmp/eureka]# git pull origin master
...
[[email protected] /tmp/eureka]# sh ./build_eureka.sh
[[email protected] /tmp/eureka]#

镜像制作完成并推送到仓库上后,到rancher上删除之前的eureka,然后部署eureka1:

接着部署eureka2:

相对的,config也需要修改一下配置文件,需要增加eureka节点,如下:

eureka:
  client:
    service-url:
      defaultZone: http://192.168.190.130:8761/eureka/,http://192.168.190.130:8762/eureka/
  instance:
    prefer-ip-address: true

修改完之后,也需要重新build,重新部署一下:

至于config的高可用这里就不演示了,因为config也属于一个服务,只需要部署多个config注册到eureka上就可以实现高可用了


构建product服务

这一小节我们来部署product服务,首先需要修改配置文件,将mysql、rabbitmq的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则product服务是启动不了的。修改bootstrap.yml文件内容如下:

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev
  application:
    name: product
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
  instance:
    prefer-ip-address: true

修改远程git仓库上的product-dev.yml文件内容如下:

spring:
  application:
    name: product
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: password
    url: jdbc:mysql://192.168.190.129:3306/springcloud_sell?characterEncoding=utf-8&useSSL=false
  jpa:
    show-sql: true
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: username
    password: password

与之前的过程类似,在product项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:

FROM hub.c.163.com/library/java:8-alpine

MAINTAINER zeroJun [email protected]

ADD sell_product-server/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

然后将代码push到git仓库上,到服务器上,拉取代码并编写shell脚本build 及上传docker镜像:

[[email protected] ~]# cd /tmp
[[email protected] /tmp]# git clone [email protected]:Zero-One/product.git
...
[[email protected] /tmp]# cd product/
# 因为order服务需要用到product服务里的client模块所以需要安装一下
[[email protected] /tmp/product]# mvn clean package -Dmaven.test.skip=true install
[[email protected] /tmp/product]# vim build_product.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/product .
docker push hub.c.163.com/zerojun/product
[[email protected] /tmp/product]# sh ./build_product.sh
...
[[email protected] /tmp/product]# 

镜像推送完成后,记得需要将访问权限设置为公开的,如下:

镜像准备好后,到rancher上,部署服务:

如果你的product服务,需要通过域名访问外网服务的话,记得进入容器中手动配置一下DNS解析地址:

# vi /etc/network/resolv.conf
nameserver 218.2.135.1
nameserver 202.102.24.35

或设置容器的网络:

部署成功:

通过浏览器测试接口成功:


构建order服务

构建完product服务后,这一小节我们来部署order服务,首先需要修改配置文件,将mysql、rabbitmq、zipkin的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则order服务是启动不了的。修改bootstrap.yml文件内容如下:

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev
  application:
    name: order
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
  instance:
    prefer-ip-address: true

修改远程git仓库上的product-dev.yml文件内容如下:

spring:
  application:
    name: order
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: password
    url: jdbc:mysql://192.168.190.130:3306/springcloud_sell?characterEncoding=utf-8&useSSL=false
  jpa:
    show-sql: true
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: username
    password: password
  redis:
    port: 6379
    host: 127.0.0.1
    stream:
      bindings:
        myMessageOutput:
          group: order
          content-type: application/json
  zipkin:
    base-url: http://127.0.0.1:9411/
    sender:
      type: web
  sleuth:
    sampler:
      probability: 1

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
      circuitBreaker:
        enabled: true
        requestVolumeThreshold: 10
        sleepWindowInMilliseconds: 10000
        errorThresholdPercentage: 60

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
  hystrix:
    enabled: true

logging:
  level:
    org.springframework.cloud.openfeign: debug

env:
  dev

在order项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:

FROM hub.c.163.com/library/java:8-alpine

MAINTAINER zeroJun [email protected]

ADD sell_order-server/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

然后将代码push到git仓库上,到服务器上,拉取代码并编写shell脚本build 及上传docker镜像:

[[email protected] ~]# cd /tmp/
[[email protected] /tmp]# git clone [email protected]:Zero-One/order.git
...
[[email protected] /tmp]# cd order/
[[email protected] /tmp/order]# vim build_order.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/order .
docker push hub.c.163.com/zerojun/order
[[email protected] /tmp/order]# sh ./build_product.sh
...
[[email protected] /tmp/order]# 

镜像推送完成后,记得需要将访问权限设置为公开的,如下:

镜像准备好后,到rancher上,部署order服务:

部署成功:

通过postman测试接口成功:


构建api-gateway

构建完order服务后,最后我们来部署api-gateway服务,首先需要修改配置文件,将redis、rabbitmq的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则api-gateway服务是启动不了的。修改bootstrap.yml文件内容如下:

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev
  application:
    name: api-gateway
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
  instance:
    prefer-ip-address: true

修改远程git仓库上的api-gateway-dev.yml文件内容如下:

spring:
  application:
    name: api-gateway
  redis:
    port: 6379
    host: 127.0.0.1
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: username
    password: password
zuul:
  # 全局忽略敏感头
  sensitive-headers:
  host:
    connect-timeout-millis: 10000
    socket-timeout-millis: 60000
  routes:
    yourProduct:
      path: /myProduct/**
      serviceId: product
  ignored-patterns:
    - /**/buyer/product/listForOrder

ribbon:
  ReadTimeout: 30000
  SocketTimeout: 30000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 62000

在api-gateway项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:

FROM hub.c.163.com/library/java:8-alpine

MAINTAINER zeroJun [email protected]

ADD target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]
[[email protected] ~]# cd /tmp/
[[email protected] /tmp]# git clone [email protected]:Zero-One/api-gateway.git
...
[[email protected] /tmp]# cd api-gateway/
[[email protected] /tmp/api-gateway]# vim build_aip-gateway.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/api-gateway .
docker push hub.c.163.com/zerojun/api-gateway
[[email protected] /tmp/api-gateway]# sh ./build_aip-gateway.sh
...
[[email protected] /tmp/api-gateway]# 

镜像推送完成后,记得需要将访问权限设置为公开的,如下:

镜像准备好后,到rancher上,部署api-gateway服务:

部署成功:

测试接口成功:

到此为止,我们就通过Docker和Rancher完成了整个微服务项目的部署。

原文地址:http://blog.51cto.com/zero01/2173489

时间: 2024-08-30 16:19:37

容器部署Spring Cloud项目的相关文章

SpringCloud教程 | 第十一篇: docker部署spring cloud项目

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/article/details/70198649 目录(?)[+] 转载请标明出处: http://blog.csdn.net/forezp/article/details/70198649 本文出自方志朋的博客 一.docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可

利用Docker部署Spring Cloud项目

1.按照创建server的方式创建一个项目,可以参照https://www.cnblogs.com/SakerLiu/p/9743577.html 2.在pom.xml文件中添加插件,代码如下所示 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifact

使用docker部署spring cloud项目详细步骤

准备工作JDK1.8.Docker1.12.1.CentOS7.0 1.CentOS7.0下JDK1.8的安装 (1)到Oracle官网下载好 jdk-8u181-linux-x64.tar.gz 备用 (2)卸载系统自带的java java -version # 如果有结果出来,则说明自带了javarpm -qa|grep java # 查询出已经安装的javayum -y remove [上面查出来的东西,多个用空格分隔](3)安装jdk cd /usr #进入到要安装jdk的目录mkdir

Linux上GitLab+Jenkins实现Vue、Spring Cloud项目的自动部署

一. 相关插件安装 1.安装GitLab相关插件 2.NodeJS插件 3.Maven 插件 4.手动安装插件 网络或者其他原因,可能导致插件安装失败. 可以采用手动安装的方式. 手动下载jenkins插件:jenkins插件下载地址:http://mirror.xmission.com/jenkins/plugins/ ,一般下载下来后缀为hpi,如下载下来是zip的,记得把后缀修改为hpi 打开jenkins,点击 系统管理-->插件管理-->高级,选择本地文件,点击提交. 二.Jenki

Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集群中去.这个才是我们最终的目标.众所周知,k8s 是目前最火的容器编排项目,很多公司都使用它来构建和管理自己容器集群,可以用来做机器学习训练以及 DevOps 等一系列的事情. 在这里,我们聚焦 CI/CD,针对于 Spring Boot 项目,借助 Gitlab CI 完成流水线的任务配置,最终部

kubernetes部署spring cloud微服务项目

微服务架构是一项在云中部署应用和服务的新技术.大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点. 微服务可以在"自己的程序"中运行,并通过"轻量级设备与HTTP型API进行沟通".关键在于该服务可以在自己的程序中运行.通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来.在服务公开中,许多服务都可以被内部独立进程所限制.如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围.在微服务架构中

docker部署spring boot项目在服务器上

IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得有一个spring boot的项目[集成了jpa+mybatis的spring boot 例子:https://github.com/AngelSXD/swapping] 第二步:项目打包为jar包 install成功以后 找到项目根目录下的target目录,这里面的jar就是打包好可以部署的jar

十分钟快速创建 Spring Cloud 项目

一般来说,Intelij IDEA 可以通过 Maven Archetype 来快速生成Maven项目,其实 IDEA 集成了 Spring 官方提供的 Spring Initializr,可以非常方便的创建 Maven 项目,而且能自动生成启动类和单元测试代码. 下面我们学习如何快速搭建一个 Spring Cloud 工程,示例使用 Spring Boot 2.2.2 版本,使用少量的代码,可以在半小时内完成项目的搭建. 本文为新手向教程,帮助大家快速入门 Spring Cloud 开发,也作

Spring Cloud项目部署(二)docker开启2375端口

开启2375端口,提供外部访问docker. 1.编辑docker文件:./usr/lib/systemd/system/docker.service vim /usr/lib/systemd/system/docker.service 2.修改ExecStart内容 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 3.重新加载docker配置 systemctl daemon-relo