一 背景介紹

先來看一下我們熟悉的第一代 spring cloud 的組件

spring cloud 現在已經是一種標準了,各公司可以基于它的編程模型編寫自己的組件 ,比如Netflix、阿里巴巴都有自己的一套通過spring cloud 編程模型開發的分布式服務組件 。
Spring Cloud 二代組件
Spring Cloud Alibaba 主要包含 Sentinel、Nacos、RocketMQ、Dubbo、Seata 等組件。
二代引入了 Spring Cloud Alibaba

再加上我們常用的組件

這其有中除 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下面的文件在這里(https://github.com/ctripcorp/apollo/tree/master/scripts/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.confbrokerClusterName?=?DefaultClusterbrokerName?=?broker-abrokerId?=?0deleteWhen?=?04fileReservedTime?=?48brokerRole?=?ASYNC_MASTERflushDiskType?=?ASYNC_FLUSH###?./data1/broker/conf/broker.confbrokerClusterName?=?DefaultClusterbrokerName?=?broker-bbrokerId?=?0deleteWhen?=?04fileReservedTime?=?48brokerRole?=?ASYNC_MASTERflushDiskType?=?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.jarEXPOSE?8080#指定容器啟動程序及參數????""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
xxl-job
version:?'3'services:??xxl-job-admin:????image:?xuxueli/xxl-job-admin:2.2.0????restart:?always????container_name:?xxl-job-admin????depends_on:??????-?mysql????environment:??????PARAMS:?'--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?Unicode=true&characterEncoding=UTF-8?--spring.datasource.username=root?--spring.datasource.password=root'????ports:??????-?8067:8080????volumes:??????-?./data/applogs:/data/applogs
注意: 這時引用的數據庫是你現有的mysql,找一個現有的,因為為了它再新建一個容器有點兒浪費
prometheus(altermanager+prometheus+grafana)
version:?'3'services:??prometheus:????image:?prom/prometheus:latest????container_name:?prometheus????volumes:??????-?/opt/docker_compose/monitor/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml??????-?/opt/docker_compose/monitor/prometheus/alertmanager_rules.yml:/etc/prometheus/alertmanager_rules.yml????ports:??????-?9090:9090????command:??????-?'--config.file=/etc/prometheus/prometheus.yml'??grafana:????image:?grafana/grafana????container_name:?grafana????restart:?always????hostname:?grafana????volumes:??????-?/opt/docker_compose/monitor/grafana/grafana.ini:/etc/grafana/grafana.ini????ports:??????-?"3000:3000"??????alertmanager:????image:?prom/alertmanager:latest????container_name:?alertmanager????hostname:?alertmanager????restart:?always????volumes:??????-?/opt/docker_compose/monitor/altermanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml????ports:??????-?"9093:9093"????prometheus-webhook-alert:????image:?timonwong/prometheus-webhook-dingtalk:v1.3.0????container_name:?prometheus-webhook-alertmanagers????hostname:?webhook-alertmanagers????restart:?always????volumes:??????-?/opt/docker_compose/monitor/prometheus-webhook-dingtalk/config.yml:/etc/prometheus-webhook-dingtalk/config.yml??????-?/etc/localtime:/etc/localtime????ports:??????-?"8060:8060"????entrypoint:?/bin/prometheus-webhook-dingtalk???--config.file=/etc/prometheus-webhook-dingtalk/config.yml??--web.enable-ui
這里我的alter沒有用grafana的,而是結合altermanager和 prometheus-webhook-dingtalk實現的釘釘告警。關于prometheus、altermanager、grafana都是常規配置大家可以找模板然后根據自己的需求修改,唯一需要說明的就是prometheus-webhook-dingtalk,雖然github上說明可以配置通知模版,但最新版本的,我怎么修改也不成,是個問題。 需要觀察以后版本會不會好,或者直接上手改它的go代碼。
skywalking
version:?'3.3'services:??elasticsearch:????image:?docker.elastic.co/elasticsearch/elasticsearch:7.5.0????container_name:?elasticsearch????restart:?always????ports:??????-?9200:9200??????-?9300:9300????environment:??????-?discovery.type=single-node??????-?bootstrap.memory_lock=true????network_mode:?bridge????volumes:??????-?/data/docker_compose/skywalking/es/config/jvm.options:/usr/share/elasticsearch/config/jvm.options:rw??????-?/data/docker_compose/skywalking/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml??????-?/data/docker/elk/elk_elastic/data:/usr/share/elasticsearch/data:rw????ulimits:??????memlock:????????soft:?-1????????hard:?-1??oap:????image:?apache/skywalking-oap-server:8.1.0-es7????container_name:?oap????depends_on:??????-?elasticsearch????links:??????-?elasticsearch????network_mode:?bridge????restart:?always????ports:??????-?11800:11800??????-?12800:12800????environment:??????SW_ES_USER:?elastic??????SW_ES_PASSWORD:?oasises??????SW_STORAGE:?elasticsearch7??????SW_STORAGE_ES_CLUSTER_NODES:?elasticsearch:9200??????SW_TRACE_SAMPLE_RATE:?8000??ui:????image:?apache/skywalking-ui:8.1.0????container_name:?ui????network_mode:?bridge????depends_on:??????-?oap????links:??????-?oap????restart:?always????ports:??????-?8083:8080????environment:??????SW_OAP_ADDRESS:?oap:12800
注意: es的詳細配置文件需要你自己寫哈。
kibana(ELK)
version:?'2'services:??elk-logstash:????image:?docker.elastic.co/logstash/logstash:7.5.0????container_name?:?elk_logstash????hostname:?elk_logstash????stdin_open:?true????tty:?true????ports:??????-?"5000:5000/udp"??????-??5001:5001????command:?logstash?--path.settings?/etc/logstash?-f?/etc/logstash/conf.d/logstash.conf????external_links:??????-?elasticsearch????network_mode:?bridge????volumes:??????-?/data1/docker/elk/elk_logstash/conf.d:/etc/logstash/conf.d??????-?/data1/docker/elk/elk_logstash/heapdump.hprof:/usr/share/logstash/heapdump.hprof?-rw??????-?/data1/docker/elk/elk_logstash/gc.log:/usr/share/logstash/gc.log?-rw??elk-kibana:????image:?docker.elastic.co/kibana/kibana:7.5.0????container_name?:?elk_kibana????hostname:?elk_kibana????stdin_open:?true????tty:?true????ports:??????-?5601:5601????external_links:??????-?elasticsearch????network_mode:?bridge????volumes:????????-?/data1/docker/elk/elk_kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml?????environment:??????-?ELASTICSEARCH_URL=http://elasticsearch:9200
- 由于ES一般我們會建集群,這里忽略ES容器
- logstash和kibana的相關配置也可從官網找到模版進行修改
關注公眾號 "小盒子的技術分享" 獲取更多精彩內容