手把手教你如何编排和容器化微服务_编程小黑马

准备

在本人的微服务系列中,已经演示了各个spring cloud 微服务组件的使用,以及相关的示例微服务应用。在每次启动微服务和对微服务进行扩容、缩容都不方便,本文使用docker-compose将以下的微服务容器化,并进行自动化部署。

1.微服务治理组件列表

2.微服务示例列表

3.环境与工具

环境 linux (ubuntu 16)
工具 docker+gitlab+rabbitmq+docker registry+intellij idea+maven
操作步骤
本文编写两个docker-compose.yml文件,将服务治理和服务示例分开,主要是因为服务示例依赖了服务治理,部分示例必须要等待服务治理组件加载完毕才能正常启动,比如hello项目使用了配置中心config server的配置,config server未加载完毕,hello项目启动异常。

虽然depends_on、links等具有启动顺序的问题,但解决不了启动是否 ready的问题.

1.编写 Dockerfile
在每个项目的根目录中,编写Dockerfile,文件内容为

FROM java:8-jre-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories
VOLUME /tmp
ADD target/*.jar app.jar
RUN sh -c 'touch /app.jar'
RUN echo $(date) > /image_built_at
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar","--spring.profiles.active=${SPRING_PROFILES_ACTIVE}"]

其中SPRING_PROFILES_ACTIVE为后面docker-compose.yml传入的环境变量,指定项目以使用哪段配置启动。

2.在原有的配置文件application.yml增加spring.profiles:docker的配置
主要是使用docker后,服务依赖的其他服务的连接发生改变,通过配置环境变量来动态接收docker-compose的配置参数。

track增加的spring.profiles:docker配置


spring:
  profiles: docker
server:
  port: ${{SERVER_PORT}:9411}
eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_SERVER_LIST}

hello 增加的spring.profiles:docker配置



spring:
  profiles: docker
  datasource:
    url: jdbc:mysql://mysql:3306/${{MYSQL_DATABASE}:hello}
    username: ${{MYSQL_USERNAME}:user}
    password: ${{MYSQL_PASSWORD}:passworld}
    testWhileIdle: true
    validationQuery: SELECT 1
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
      properties:
        hibernate:
          dialect: org.hibernate.dialect.MySQL5Dialect
  zipkin:
    base-url: http://track:9411

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_SERVER_LIST}

${{MYSQL_USERNAME}:user} 是指配置文件在启动的时候如果没有读取到环境变量MYSQL_USERNAME的值,则使用默认值user。这种配置在开发的时候十分有用,比如切换开发、测试、生产环境配置。

3.编写批量编译的shell脚本images-build.sh
该脚本将进入到各个项目中,使用maven对项目进行打包,然后使用docker,根据Dockerfile对项目进行构建,生成分别带有:lastest 和当前日期标签的两个镜像。

#!/bin/bash

编译所有的代码,生成docker 镜像

function progress(){
    local GREEN CLEAN
    GREEN='\033[0;32m'
    CLEAN='\033[0m'
    printf "\n${GREEN}$@  ${CLEAN}\n" >&2
}

set -e

镜像仓库前缀

REGPREFIX=127.0.0.1:5000/billjiang
TOTAL=10

#discovery server
progress “Building discovery-server(1/ T O T A L ) j a r f i l e . . . " c d c o m m o n / d i s c o v e r y m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g d i s c o v e r y ( e u r e k a s e r v e r ) ( 1 / {TOTAL}) jar file ..." cd common/discovery mvn clean package -DskipTests progress "Building discovery(eureka server)(1/ TOTAL)jarfile..."cdcommon/discoverymvncleanpackageDskipTestsprogress"Buildingdiscovery(eurekaserver)(1/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/discovery -q .) R E G P R E F I X / d i s c o v e r y : {REGPREFIX}/discovery: REGPREFIX/discovery:(date -u “+%Y%m%d-%H%M%S”)
cd -

#config server
progress “Building config-server(2/ T O T A L ) j a r f i l e . . . " c d c o m m o n / c o n f i g s e r v e r m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g c o n f i g s e r v e r ( 2 / {TOTAL}) jar file ..." cd common/configserver mvn clean package -DskipTests progress "Building config server(2/ TOTAL)jarfile..."cdcommon/configservermvncleanpackageDskipTestsprogress"Buildingconfigserver(2/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/configserver -q .) R E G P R E F I X / c o n f i g s e r v e r : {REGPREFIX}/configserver: REGPREFIX/configserver:(date -u “+%Y%m%d-%H%M%S”)
cd -

#gateway
progress “Building gateway-zuul(3/ T O T A L ) j a r f i l e . . . " c d c o m m o n / g a t e w a y m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g g a t e w a y − z u u l ( 3 / {TOTAL}) jar file ..." cd common/gateway mvn clean package -DskipTests progress "Building gateway-zuul(3/ TOTAL)jarfile..."cdcommon/gatewaymvncleanpackageDskipTestsprogress"Buildinggatewayzuul(3/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/gateway -q .) R E G P R E F I X / g a t e w a y : {REGPREFIX}/gateway: REGPREFIX/gateway:(date -u “+%Y%m%d-%H%M%S”)
cd -

#track sleuth+zipkin
progress “Building track(sleuth+zipkin)(4/ T O T A L ) j a r f i l e . . . " c d c o m m o n / t r a c k m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g t r a c k b y s l e u t h + z i p k i n ( 4 / {TOTAL}) jar file ..." cd common/track mvn clean package -DskipTests progress "Building track by sleuth+zipkin(4/ TOTAL)jarfile..."cdcommon/trackmvncleanpackageDskipTestsprogress"Buildingtrackbysleuth+zipkin(4/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/track -q .) R E G P R E F I X / t r a c k : {REGPREFIX}/track: REGPREFIX/track:(date -u “+%Y%m%d-%H%M%S”)
cd -

#hystrix-dashboard
progress “Building hystrix-dashboard(5/ T O T A L ) j a r f i l e . . . " c d c o m m o n / h y s t r i x − d a s h b o a r d m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g h y s t r i x − d a s h b o a r d ( 5 / {TOTAL}) jar file ..." cd common/hystrix-dashboard mvn clean package -DskipTests progress "Building hystrix-dashboard(5/ TOTAL)jarfile..."cdcommon/hystrixdashboardmvncleanpackageDskipTestsprogress"Buildinghystrixdashboard(5/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/hystrix-dashboard -q .) R E G P R E F I X / h y s t r i x − d a s h b o a r d : {REGPREFIX}/hystrix-dashboard: REGPREFIX/hystrixdashboard:(date -u “+%Y%m%d-%H%M%S”)
cd -

#hystrix-turbine-mq
progress “Buildinhg hystrix-turbine-mq(6/ T O T A L ) j a r f i l e . . . " c d c o m m o n / h y s t r i x − t u r b i n e − m q m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g h y s t r i x − t u r b i n e − m q ( 6 / {TOTAL}) jar file ..." cd common/hystrix-turbine-mq mvn clean package -DskipTests progress "Building hystrix-turbine-mq(6/ TOTAL)jarfile..."cdcommon/hystrixturbinemqmvncleanpackageDskipTestsprogress"Buildinghystrixturbinemq(6/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/hystrix-turbine-mq -q .) R E G P R E F I X / h y s t r i x − t u r b i n e − m q : {REGPREFIX}/hystrix-turbine-mq: REGPREFIX/hystrixturbinemq:(date -u “+%Y%m%d-%H%M%S”)
cd -

#hello
progress “Buildinhg hello service(7/ T O T A L ) j a r f i l e . . . " c d s e r v i c e / h e l l o m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g h e l l o s e r v i c e ( 7 / {TOTAL}) jar file ..." cd service/hello mvn clean package -DskipTests progress "Building hello service(7/ TOTAL)jarfile..."cdservice/hellomvncleanpackageDskipTestsprogress"Buildinghelloservice(7/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/hello -q .) R E G P R E F I X / h e l l o : {REGPREFIX}/hello: REGPREFIX/hello:(date -u “+%Y%m%d-%H%M%S”)
cd -

#world
progress “Buildinhg world service(8/ T O T A L ) j a r f i l e . . . " c d s e r v i c e / w o r l d m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g w o r l d s e r v i c e ( 8 / {TOTAL}) jar file ..." cd service/world mvn clean package -DskipTests progress "Building world service(8/ TOTAL)jarfile..."cdservice/worldmvncleanpackageDskipTestsprogress"Buildingworldservice(8/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/world -q .) R E G P R E F I X / w o r l d : {REGPREFIX}/world: REGPREFIX/world:(date -u “+%Y%m%d-%H%M%S”)
cd -

#helloworld
progress “Buildinhg helloworld service(9/ T O T A L ) j a r f i l e . . . " c d s e r v i c e / h e l l o w o r l d m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g h e l l o w o r l d s e r v i c e ( 9 / {TOTAL}) jar file ..." cd service/helloworld mvn clean package -DskipTests progress "Building helloworld service(9/ TOTAL)jarfile..."cdservice/helloworldmvncleanpackageDskipTestsprogress"Buildinghelloworldservice(9/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/helloworld -q .) R E G P R E F I X / h e l l o w o r l d : {REGPREFIX}/helloworld: REGPREFIX/helloworld:(date -u “+%Y%m%d-%H%M%S”)
cd -

#helloworld-feign
progress “Buildinhg helloworld-feign service(10/ T O T A L ) j a r f i l e . . . " c d s e r v i c e / h e l l o w o r l d − f e i g n m v n c l e a n p a c k a g e − D s k i p T e s t s p r o g r e s s " B u i l d i n g h e l l o w o r l d − f e i g n s e r v i c e ( 10 / {TOTAL}) jar file ..." cd service/helloworld-feign mvn clean package -DskipTests progress "Building helloworld-feign service(10/ TOTAL)jarfile..."cdservice/helloworldfeignmvncleanpackageDskipTestsprogress"Buildinghelloworldfeignservice(10/{TOTAL}) docker image …”
docker tag $(docker build -t ${REGPREFIX}/helloworld-feign -q .) R E G P R E F I X / h e l l o w o r l d − f e i g n : {REGPREFIX}/helloworld-feign: REGPREFIX/helloworldfeign:(date -u “+%Y%m%d-%H%M%S”)
cd -
4.进入到项目目录springcloud-demo,执行bash images-build.sh进行批量编译打包

批量编译打包springcloud-demo.png

5.创建服务治理组件的docker-compose.yml,编写如下内容
version: “2”
services:

#启动注册中心eureka-server集群 集中管理/服务注册/服务发现
discovery1:
container_name: discovery1
image: 127.0.0.1:5000/billjiang/discovery
ports:
- “8761:8761”
environment:
- ADDITIONAL_EUREKA_SERVER_LIST=http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8761

discovery2:
container_name: discovery2
image: 127.0.0.1:5000/billjiang/discovery
ports:
- “8762:8762”
environment:
- ADDITIONAL_EUREKA_SERVER_LIST=http://discovery1:8761/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8762
links:
- discovery1

#启动配置中心config-server集群 配置更新/配置集中管理/多环境配置
config1:
container_name: configserver1
image: 127.0.0.1:5000/billjiang/configserver
ports:
- “8090:8090”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8090
links:
- discovery1
- discovery2

config2:
container_name: configserver2
image: 127.0.0.1:5000/billjiang/configserver
ports:
- “8091:8091”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8091
links:
- discovery1
- discovery2

#启动网关gateway,可配置成集群,使用nginx进行负载 智能路由/安全控制/负载均衡
gateway:
container_name: gateway
image: 127.0.0.1:5000/billjiang/gateway
ports:
- “8086:8086”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8086
links:
- discovery1
- discovery2

启动seluth+zipkin zipkin服务跟踪/依赖可视化

track:
container_name: track
image: 127.0.0.1:5000/billjiang/track
ports:
- “9411:9411”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=9411
links:
- discovery1
- discovery2

hystrix

启动hystrix-dashboard

hystrix-dashboard:
container_name: hystrix-dashboard
image: 127.0.0.1:5000/billjiang/hystrix-dashboard
ports:
- “8087:8087”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8087
links:
- discovery1
- discovery2

启动hystrix-turbine-mq 基于消息中间件的实时性能数据收集

hystrix-turbine-mq:
container_name: hystrix-turbine-mq
image: 127.0.0.1:5000/billjiang/hystrix-turbine-mq
ports:
- “8089:8089”
environment:
- EUREKA_SERVER_LIST=http://discovery1:8761/eureka/,http://discovery2:8762/eureka/
- SPRING_PROFILES_ACTIVE=docker
- SERVER_PORT=8089
links:
- discovery1
- discovery2

mysql:
container_name: mysql
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=passw0rd
- MYSQL_DATABASE=foodb
- MYSQL_USER=user1
- MYSQL_PASSWORD=passw0rd
6.启动服务治理的docker-compose.yml
在springcloud-demo根目录下,使用docker-compose up启动服务编排,如下界面所示:

服务治理服务编排启动1.png

启动后,打开注册中心地址,查看已经启动的服务:

已经启动的服务列表.png

7.连接外部docker容器
配置中心使用到了gitlab, 服务跟踪track使用了rabbitmq,这两个容器都不在docker-compose之中,要使得能够互相连通,要把这两个容器也加入到springclouddemo_default网络。

docker network connect springclouddemo_default gitlab
docker network connect springclouddemo_default rabbitmq
使用docker network inspect springclouddemo_default可以查看到已经加入网络的容器。

8.启动服务示例编排docker-compose.yml
进入到service目录,使用docker-compose up启动服务示例编排,如下所示:

服务示例编排1.png

服务示例编排2

9.在Eureka Server查看新增的服务

新增注册服务.png

10.可以使用如下命令对服务进行扩容

scale扩容.png

刷新Eureka Server,可以看到服务已经扩展到三个节点。

扩容后.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值