docker篇-(docker-compose搭建高可用Eureka集群)

心已赠人 2022-11-18 01:47 269阅读 0赞

docker-compose安装高可用Eureka集群

  • 构建Eureka注册中心镜像
  • 搭建集群
  • 通过nginx实现负载均衡
  • 配置nginx ssl支持
  • 注册product和consumer测试是否可用

构建Eureka注册中心镜像

eureka项目来自于我之前写的一篇博客,博客地址: springcloud篇-(高可用注册中心Eureka集群实现)
1.修改原项目中的application.yml配置

  1. server:
  2. port: 8761
  3. eureka:
  4. auth:
  5. enable: ${ EUREKA_AUTH_ENABLE:false} #将认证相关的配置,通过这种方式来设置,方便在docker中通过环境变量来改变这些参数
  6. username: ${ EUREKA_AUTH_USERNAME:root}
  7. password: ${ EUREKA_AUTH_PASSWORD:123456}
  8. server:
  9. eviction-interval-timer-in-ms: 60000 #驱逐下线服务的间隔时间
  10. enable-self-preservation: ${ EUREKA_ENABLE_SELF_PRESERVATION:false} #关闭eureka服务自我保护机制,使eviction-interval-timer-in-ms配置生效
  11. instance:
  12. health-check-url-path: /actuator/health #健康检查地址
  13. prefer-ip-address: true #显示ip地址
  14. hostname: ${ EUREKA_HOSTNAME:localhost}
  15. client:
  16. fetch-registry: false #注册中心不需要拉取服务
  17. register-with-eureka: false #使用高可用集群搭建,设置为false即可
  18. service-url:
  19. defaultZone: ${ EUREKA_SERVER_LIST:http://localhost:8761/eureka} #注册中心地址
  20. spring:
  21. application:
  22. name: eureka-server

2.将项目打包上传到centos
在这里插入图片描述
在这里插入图片描述
3.编写Dockerfile文件

  1. cat > Dockerfile <<EOF FROM adoptopenjdk/openjdk11:x86_64-alpine-jre-11.0.9_11 # dockerfile维护人员 MAINTAINER lhstack@foxmail.com #定义标签 LABEL version=0.0.1 LABEL gitee="https://gitee.com/myprofile" # jvm参数 ENV JVM_OPTS "-Xmx128m -Xms128m -Xmn32m -Xss512k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=\$WORKDIR/error -Duser.timezone=Asia/Shanghai" # 项目参数 ENV JAVA_OPTS "" ENV WORKDIR "/opt/eureka" #挂载error目录 VOLUME /opt/eureka/error # 配置时区 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \\ && apk update \\ && apk add --no-cache tzdata \\ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置时区 ENV TZ Asia/Shanghai # 设置工作目录 WORKDIR \$WORKDIR # 将tomcat拷贝到工作目录 ADD *.jar app.jar # 暴露端口 EXPOSE 8761 # 启动eureka CMD java \$JVM_OPTS \$JAVA_OPTS -jar app.jar EOF

4.构建eureka镜像

  1. docker build -t eureka:0.0.1-alpine .

5.运行镜像

  1. docker run --rm -ti -p 8761:8761 eureka:0.0.1-alpine

在这里插入图片描述
通过浏览器访问
在这里插入图片描述

搭建集群

1.编写eureka集群的环境变量

  1. mkdir env
  2. cat > env/eureka.env <<EOF EUREKA_AUTH_ENABLE=true EUREKA_AUTH_USERNAME=admin EUREKA_AUTH_PASSWORD=123456 EUREKA_HOSTNAME=\${hostname} EUREKA_SERVER_LIST="http://admin:123456@eureka-1:8761/eureka,http://admin:123456@eureka-2:8761/eureka,http://admin:123456@eureka-3:8761/eureka" EOF

2.编写docker-compose.yaml文件

  1. cat > docker-compose.yaml <<EOF version: '3' services: eureka-1: image: eureka:0.0.1-alpine build: . ports: - 8761:8761 container_name: eureka-1 env_file: - ./env/eureka.env hostname: eureka-1 networks: - eureka eureka-2: image: eureka:0.0.1-alpine ports: - 8762:8761 container_name: eureka-2 env_file: - ./env/eureka.env hostname: eureka-2 networks: - eureka eureka-3: image: eureka:0.0.1-alpine ports: - 8763:8761 container_name: eureka-3 env_file: - ./env/eureka.env hostname: eureka-3 networks: - eureka networks: eureka: driver: bridge ipam: driver: default config: - subnet: "10.10.0.0/16" EOF

3.执行docker-compose并通过浏览器访问对应端口的eureka应用
第一个
在这里插入图片描述
第二个
在这里插入图片描述
第三个
在这里插入图片描述
可以看到,上面指向的eureka高可用集群开发的那篇博客里面,集群页面是没有Ds Replicas的,是因为那篇博客里面的hostname都是localhost,所以eureka无法区分出来副本,实际上是不影响的

通过nginx实现负载均衡

1.生成nginx配置

  1. mkdir conf
  2. cat > ./conf/eureka.conf <<EOF upstream eureka-cluster{ server eureka-1:8761 weight=1; server eureka-2:8761 weight=1; server eureka-3:8761 weight=1; } server { listen 80; server_name localhost; location / { proxy_set_header X-Real-IP \$remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里 proxy_pass http://eureka-cluster; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } EOF

2.修改docker-compose.yaml,添加nginx进去

  1. cat > docker-compose.yaml <<EOF version: '3' services: eureka-lb: image: nginx:alpine container_name: eureka-lb ports: - 8080:80 volumes: - ./conf:/etc/nginx/conf.d depends_on: - eureka-1 - eureka-2 - eureka-3 networks: - eureka eureka-1: image: eureka:0.0.1-alpine build: . container_name: eureka-1 env_file: - ./env/eureka.env hostname: eureka-1 networks: - eureka eureka-2: image: eureka:0.0.1-alpine container_name: eureka-2 env_file: - ./env/eureka.env hostname: eureka-2 networks: - eureka eureka-3: image: eureka:0.0.1-alpine container_name: eureka-3 env_file: - ./env/eureka.env hostname: eureka-3 networks: - eureka networks: eureka: driver: bridge ipam: driver: default config: - subnet: "10.10.0.0/16" EOF

3.通过浏览器访问
在这里插入图片描述

配置nginx ssl支持

1.下载cfssl证书生成工具

  1. wget -O /usr/local/sbin/certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 && chmod +x /usr/local/sbin/certinfo
  2. wget -O /usr/local/sbin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && chmod +x /usr/local/sbin/cfssl
  3. wget -O /usr/local/sbin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 && chmod +x /usr/local/sbin/cfssljson

2.生成证书

  1. mkdir ssl && cd ssl
  2. cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "876000h" }, "profiles": { "eureka": { "expiry": "876000h", "usages": [ "signing", "key encipherment", "server auth" ] } } } } EOF
  3. cat > ca-csr.json <<EOF { "CN": "www.eureka.com.cn", "hosts": [ ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] } EOF
  4. #生成ca根证书
  5. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  6. cat > server-csr.json <<EOF { "CN": "www.eureka.com.cn", "hosts": [ ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] } EOF
  7. #生成服务端证书
  8. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=eureka server-csr.json | cfssljson -bare server
  9. cd ..

3.修改nginx的配置文件

  1. cat > ./conf/eureka.conf <<EOF upstream eureka-cluster{ server eureka-1:8761 weight=1; server eureka-2:8761 weight=1; server eureka-3:8761 weight=1; } server { listen 443 ssl http2 default_server; server_name www.eureka.com.cn [::]:443 ssl http2 default_server; ssl_certificate /opt/ssl/eureka/server.pem; # pem文件的路径 ssl_certificate_key /opt/ssl/eureka/server-key.pem; # key文件的路径 ssl_session_timeout 5m; #缓存有效期 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议 ssl_prefer_server_ciphers on; #使用服务器端的首选算法 location / { proxy_set_header X-Real-IP \$remote_addr; # 将客户端真实ip存放到X-Real-IP这个header里面,由于这里是没有使用host模式启动nginx,获取的会是宿主机的ip proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里 proxy_pass http://eureka-cluster; } } EOF

4.修改docker-compose.yml

  1. cat > docker-compose.yaml <<EOF version: '3' services: eureka-lb: image: nginx:alpine container_name: eureka-lb ports: - 8443:443 volumes: - ./conf:/etc/nginx/conf.d - ./ssl:/opt/ssl/eureka depends_on: - eureka-1 - eureka-2 - eureka-3 networks: - eureka eureka-1: image: eureka:0.0.1-alpine build: . container_name: eureka-1 env_file: - ./env/eureka.env hostname: eureka-1 networks: - eureka eureka-2: image: eureka:0.0.1-alpine container_name: eureka-2 env_file: - ./env/eureka.env hostname: eureka-2 networks: - eureka eureka-3: image: eureka:0.0.1-alpine container_name: eureka-3 env_file: - ./env/eureka.env hostname: eureka-3 networks: - eureka networks: eureka: driver: bridge ipam: driver: default config: - subnet: "10.10.0.0/16" EOF

5.通过浏览器访问
注意:查看eureka启动日志,确认启动成功之后再访问
在这里插入图片描述

注册product和consumer测试是否可用

1.因为eureka注册中心使用ssl进行代理,所以客户端注册的时候,需要配置证书信息

  1. # 如果centos上面没有keytool工具,请用windows的,这里ca.pem就是nginx里面ssl目录下面的ca.pem文件
  2. keytool -import -noprompt -file ca.pem -keystore truststore.jks -storepass 123456
  3. # openssl在centos上是默认安装了的,这里我们导出server.pem相关文件格式为p12,pass:这里设置密码
  4. openssl pkcs12 -export -in server.pem -inkey server-key.pem -out keystore.p12 -passout pass:123456
  5. # 将p12格式证书导出成jks
  6. keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -srcstorepass 123456 -deststorepass 123456

2.配置域名映射,因为客户端这边配置了证书之后,会验证域名,我们上面生成的证书文件域名为www.eureka.com.cn,因此我们添加一行域名映射
在这里插入图片描述

3.打开之前的product和consumer两个项目,分别将生成的keystore.jks和truststore.jks复制到resources目录下面,并且修改application.yaml文件内容为
Product

  1. spring:
  2. application:
  3. name: Product
  4. eureka:
  5. instance:
  6. prefer-ip-address: true
  7. health-check-url-path: /actuator/health
  8. client:
  9. register-with-eureka: true
  10. fetch-registry: false #生产端不需要拉取服务
  11. service-url:
  12. defaultZone: https://admin:123456@www.eureka.com.cn:8443/eureka #新的注册中心地址
  13. tls: #证书相关
  14. enabled: true
  15. key-store: classpath:keystore.jks
  16. key-store-password: 123456
  17. key-password: 123456
  18. trust-store-password: 123456
  19. trust-store: classpath:truststore.jks
  20. server:
  21. port: 9090

Consumer

  1. spring:
  2. application:
  3. name: Consumer
  4. eureka:
  5. instance:
  6. prefer-ip-address: true
  7. health-check-url-path: /actuator/health
  8. client:
  9. register-with-eureka: true
  10. fetch-registry: true #消费端需要发现服务
  11. service-url:
  12. defaultZone: https://admin:123456@www.eureka.com.cn:8443/eureka #注册中心地址
  13. tls:
  14. enabled: true
  15. key-store: classpath:keystore.jks
  16. key-store-password: 123456
  17. key-password: 123456
  18. trust-store-password: 123456
  19. trust-store: classpath:truststore.jks
  20. server:
  21. port: 8080

4.分别启动product和consumer,并查看注册中心是否存在实例
因为eureka-server注册中心副本默认同步时间设置的是30s,所以服务注册上去之后,所有节点不是马上就会有最新的注册实例
在这里插入图片描述
5.访问Consumer,查看是否能调用生产者暴露的服务
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis

    在web项目里出现高并发时,可以通过负载均衡来处理,redis的插槽分配机制就是一个负载均衡的模式。 Redis集群节点复制介绍 (1)Redis集群的每个节点都有两种

    相关 rabbitMq

    消息中间件—RabbitMQ 一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本