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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Spring Cloud Alibaba 主要包含 Sentinel、Nacos、RocketMQ、Dubbo、Seata 等组件。二代引入了 Spring Cloud Alibaba

一 背景介绍


1.png


先来看一下我们熟悉的第一代 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下面的文件在这里(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.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


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的相关配置也可从官网找到模版进行修改



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
29天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
35 0
|
22天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
9天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
24 5
|
14天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
30天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
123 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
46 0
|
5天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
4天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####