spring cloud 二代架构依赖组件 docker全配置放送(一)

991 阅读4分钟

spring cloud 二代架构依赖组件 docker全配置放送(一)

一 背景介绍

先来看一下我们熟悉的第一代 spring cloud 的组件

组件名称 功能
Ribbon 客户端负载均衡器
Eureka 服务治理(注册、发现......)
Hystrix 服务之间远程调用时的熔断保护
Feign 通过定义接口的方式直接调用其他服务的 API
Zuul 服务网关
Config 分布式配置
Sleuth 用于请求链路跟踪

spring cloud 现在已经是一种标准了,各公司可以基于它的编程模型编写自己的组件 ,比如Netflix、阿里巴巴都有自己的一套通过spring cloud 编程模型开发的分布式服务组件 。

Spring Cloud 二代组件

Spring Cloud Alibaba 主要包含 Sentinel、Nacos、RocketMQ、Dubbo、Seata 等组件。

二代引入了 Spring Cloud Alibaba

第一代组件 第二代组件
Eureka Nacos
Config Apollo
Zuul spring cloud gateway
Hystrix Sentinel

再加上我们常用的组件

组件 功能
XXL-Job 分布式定时任务中心
Redis 分布式缓存
Rocket-MQ 消息队列
Seata 分布式事务
ELK 日志处理
Skywalking 调用链监控
Prometheus metrics监控

这其有中除 spring cloud gateway都需要外部单独部署服务来支持

二 利用docker-compose 进行本地简化部署

apollo

version: '2'

services:
  apollo-quick-start:
    image: nobodyiam/apollo-quick-start
    container_name: apollo-quick-start
    depends_on:
      - apollo-db
    ports:
      - "8080:8080"
      - "8070:8070"
    links:
      - apollo-db

  apollo-db:
    image: mysql:5.7
    container_name: apollo-db
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    depends_on:
      - apollo-dbdata
    ports:
      - "13306:3306"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    volumes_from:
      - apollo-dbdata

  apollo-dbdata:
    image: alpine:latest
    container_name: apollo-dbdata
    volumes:
      - /var/lib/mysql

注意: ./sql下面的文件在这里,是两个初始化的sql文件

nacos

version: "2"
services:
  nacos:
    image: nacos/nacos-server:latest
    container_name: nacos-standalone-mysql
    env_file:
      - ./env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9555:9555"
    depends_on:
      - mysql
    restart: on-failure
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    env_file:
      - ./env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3308:3306"

redis

version: '2'
services:
  #redis容器
  redis:
    #定义主机名
    container_name: redis
    #使用的镜像
    image: redis:6.0.8
    #容器的映射端口
    ports:
      - 6379:6379
    command: redis-server /etc/conf/redis.conf
    #定义挂载点
    volumes:
      - ./data:/data
      - ./conf:/etc/conf
    #环境变量
    privileged: true
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8

注意: conf下的redis.conf配置文件可以找个默认的模版文件,然后进行相应修改

rocket-mq

version: '2'

services:
  #Service for nameserver
  namesrv:
    image: apacherocketmq/rocketmq-nameserver:4.5.0-alpine-operator-0.3.0
    container_name: rmqnamesrv
    ports:      
      - 9876:9876
    volumes:     
      - ./data/namesrv/logs:/home/rocketmq/logs
    command: sh mqnamesrv
    environment:
      TZ: Asia/Shanghai
      JAVA_OPT_EXT: "-server -Xms512m -Xmx512m -Xmn256m"

  #Service for broker
  broker:
    image: apacherocketmq/rocketmq-broker:4.5.0-alpine-operator-0.3.0
    container_name: rmqbroker-a
    depends_on:     
      - namesrv
    ports:      
      - 10909:10909
      - 10911:10911
      - 10912:10912
    environment:      
      NAMESRV_ADDR: namesrv:9876
      JAVA_OPT_EXT: "-server -Xms512m -Xmx512m -Xmn256m"
    volumes:      
      - ./data/broker/logs:/home/rocketmq/logs     
      - ./data/broker/store:/home/rocketmq/store      
      - ./data/broker/conf/broker.conf:/opt/rocketmq-4.7.1/conf/broker.conf

    command: sh mqbroker -c /opt/rocketmq-4.7.1/conf/broker.conf

 #Service for another broker -- broker1
  broker1:
    image: apacherocketmq/rocketmq-broker:4.5.0-alpine-operator-0.3.0
    container_name: rmqbroker-b
    depends_on:     
      - namesrv
    ports:      
      - 10929:10909
      - 10931:10911
      - 10932:10912
    environment:      
      NAMESRV_ADDR: namesrv:9876
      JAVA_OPT_EXT: "-server -Xms512m -Xmx512m -Xmn256m"
    volumes:      
      - ./data1/broker/logs:/home/rocketmq/logs      
      - ./data1/broker/store:/home/rocketmq/store      
      - ./data1/broker/conf/broker.conf:/opt/rocketmq-4.7.1/conf/broker.conf
    command: sh mqbroker -c /opt/rocketmq-4.7.1/conf/broker.conf

  rmqconsole:
    image: styletang/rocketmq-console-ng
    container_name: rmqconsole
    ports:
      - 8180:8080
    environment:
        TZ: Asia/Shanghai
        JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - namesrv

此外还有两个配置文件

  • ./data/broker/conf/broker.conf
  • ./data1/broker/conf/broker.conf
## ./data/broker/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-abroker
Id = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

### ./data1/broker/conf/broker.conf
brokerClusterName = Default
ClusterbrokerName = broker-bbroker
Id = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

seata-server

version: "3.1"
services:
  seata-server:
    image: seataio/seata-server:latest
    hostname: seata-server
    ports:
      - 8091:8091
    environment:
      - SEATA_PORT=8091
    expose:
      - 8091

sentinel

  • 没有现成的docker镜像,需要自己编写一个
FROM openjdk:8

#复制上下文目录下的jar包到容器里  使用COPY命令亦可
ADD sentinel-dashboard-1.8.0.jar sentinel-dashboard-1.8.0.jar

EXPOSE 8080

#指定容器启动程序及参数   <ENTRYPOINT> "<CMD>"
ENTRYPOINT ["java","-jar","sentinel-dashboard-1.8.0.jar"]
  • 利用自己编译的镜像再编写docker-compose配置文件
version: '3'
services:
  sentinel-dashboard:
    image: sentinel-dashboard:1.8.0
    container_name: sentinel-dashboard
    restart: always
    environment:
      JAVA_OPTS: "-Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -Djava.security.egd=file:/dev/./urandom -Dcsp.sentinel.api.port=8719"
    ports: #避免出现端口映射错误,建议采用字符串格式 8080端口为Dockerfile中EXPOSE端口
      - "58080:8080"
      - "8719:8719"
    volumes:
      - ./root/logs:/root/logs

更多精彩内容,请关注 公众号 “小盒子的技术分享”