文笔不好,不喜勿喷;但是自认为是能够解决实际问题的
微服务使用spring cloud实现,部署采用.jar 包方式
安静的研究了几天docker,最终解决了跨主机的通信的问题,虽然不知道其中的原理,但是还是需要记录下来!
1,修改 eureka 注册中心配置
spring:
profiles:
active: @profileActive@ # 多环境使用 需要maven配合
application:
name: eureka-server
server:
port: 8761
eureka:
server:
enableSelfPreservation: false
instance:
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://192.168.10.28:8761/eureka/,http://192.168.10.29:8761/eureka/,http://192.168.10.30:8761/eureka/
maven 使用多环境配置
dev
true
dev
test
test
prod
prod
src/main/resources
bootstrap*.yml
src/main/resources
true
bootstrap.yml
bootstrap-${profileActive}.yml
org.springframework.boot
spring-boot-maven-plugin
spring-milestones
Spring Milestones
https://repo.spring.io/milestone
false
2,修改config 配置中心,注册服务配置
#配置中心
spring:
profiles:
active: @profileActive@
application:
name: spring-cloud-config
#服务的git仓库地址
cloud:
config:
server:
git:
username: 请替换成你自己git账号
password: 请替换成你自己git密码
uri: 请替换成你自己git地址
timeout: 10
search-paths: /** #查找所有目录,所有分支
#端口
server:
port: 8762 #请自行定义
security:
user:
name: 配置中心安全验证账号
password: 配置中心安全验证密码
eureka:
instance:
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://192.168.10.28:8761/eureka/,http://192.168.10.29:8761/eureka/,http://192.168.10.30:8761/eureka/
3,修改我们的微服务配置general-server
spring:
profiles:
active: @profileActive@ #环境
application:
name: general-server
http:
multipart: #指定文件传输大小
enabled: true
max-file-size: 100mb
max-request-size: 200mb
cloud:
config:
username: 配置中心账号
password: 配置中心密码
label: git分支
name: 配置文件名称
profile: ${spring.profiles.active} # 环境
discovery: # 发现配置中心服务
enabled: true
service-id: spring-cloud-config
retry:
max-attempts: 6
multiplier: 1.1
initial-interval: 1000
max-interval: 2000
management:
security:
enabled: false
到这里,我们的微服务就改造完成,接下来就是这么发布到docker了
1,假如我有3台服务(内网互通,如果不是内网互通,建议不要集群):
192.168.10.28 manger
192.168.10.29 worker1
192.168.10.30 worker2
2,确保三台服务器已经安装(生成环境请根据自己的需求,选择需要版本)
docker engine (我安装的版本 docker ce version 18.09.1)
docker compose (我安装的版本 docker-compose version 1.24.0-rc1)
我没有使用虚拟机,也没有用到 docker machine ,所以就没有安装
3,使用docker swarm 创建集群(建议先关闭三台主机的防火墙,或者打开需要使用端口)
在manager
。初始化群。如果主机只有一个网络接口,则该--advertise-addr
标志是可选的。
docker swarm init --advertise-addr=192.168.10.28
记下打印的文本,因为它包含您将用于加入worker-1
和使用worker-2
swarm 的标记。将令牌存储在密码管理器中是个好主意。
在worker-1
,加入群。如果主机只有一个网络接口,则该--advertise-addr
标志是可选的。
docker swarm join --token \
--advertise-addr 192.168.10.29:2377
在worker-2
,加入群。如果主机只有一个网络接口,则该--advertise-addr
标志是可选的。
docker swarm join --token \
--advertise-addr 192.168.10.30:2377
manager
,列出所有的节点。此命令只能从经理处完成。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER
d68ace5iraw6whp7llvgjpu48 ip-192-168-10-28 Ready Active Leader
nvp5rwavvb8lhdggo8fcf7plg ip-192-168-10-29 Ready Active
ouvx2l7qfcxisoyms8mtkgahw ip-192-168-10-30 Ready Active
5.在manager上列出Docker网络,并注意到它们中的每一个现在都有一个名为 ingress 网络和一个名为 docker_gwbridge 网络。此处仅显示列表:worker-1 worker-2 ingress docker_gwbridge manager
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
495c570066be bridge bridge local
961c6cae9945 docker_gwbridge bridge local
ff35ceda3643 host host local
trtnl4tqnc3n ingress overlay swarm
6.在manager 上面创建网络
$ docker network create --driver=overlay --attachable test-net
在worker1 worker2上面执行(主要是为了连接到manager 的 test-net网络)
$ docker run -itd --name=mybusybox --network=test-net busybox /bin/sh
如果不执行上面的语句,待会使用 docker-compose up -d 的时候会报错,错误愿意就是无法找到test-net 网络
目录结构就直接放图片
我在common 目录下面只部署了 注册中心和配置中心(下面贴出我的docker-compose.yml文件)
version: '3'
services:
eureka:
build:
context: ./eureka
image: eureka:0.0.1
networks:
- test-net
volumes:
- server-app:/usr/server
ports:
- "8761:8761"
config:
build:
context: ./config
image: config:0.0.1
networks:
- test-net
volumes:
- server-app:/usr/server
ports:
- "8762:8762"
depends_on:
- eureka
volumes:
server-app:
networks:
test-net: #上面创建好的网络
external: true
下面是eureka 目录,Dockerfile 文件(文件里面有指定内存的占用,可根据自己的需求进行更改)
FROM java:8
VOLUME /usr/server
ADD eureka-server-0.0.1-SNAPSHOT.jar eureka-server.jar
RUN bash -c 'touch /eureka-server.jar'
ENTRYPOINT ["java","-Xms56m","-Xmx128m","-XX:PermSize=128m","-XX:MaxPermSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/eureka-server.jar"]
下面是config 目录,Dockerfile文件(文件里面有指定内存的占用,可根据自己的需求进行更改)
FROM java:8
VOLUME /usr/server
ADD config-server-0.0.1-SNAPSHOT.jar config-server.jar
RUN bash -c 'touch /config-server.jar'
ENTRYPOINT ["java","-Xms56m","-Xmx128m","-XX:PermSize=128m","-XX:MaxPermSize=256m","-Djava.security.egd=file:/dev/./urandom","-jar","/config-server.jar"]
回到 cd /user/common 目录 执行
$ docker-compose build
$ docker-compose up -d
如果不出意外,在浏览器上面输入192.168.10.28:8761 已经能够看到注册中心了,而且config 也注册成功了
我是将 general-server 放在另外的 /usr/server目录的,不过可以根据自己的需求而定,自行存放
$ cd /usr/server
$ mkdir general
Dockerfile
FROM java:8
VOLUME /usr/server
ADD general-server.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Xms128m","-Xmx256m","-XX:PermSize=128m","-XX:MaxPermSize=512m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
$ cd /usr/server
docker-compose.yml
version: '3'
services:
general:
build:
context: ./general
image: general-server:0.0.1
networks:
- test-net
ports:
- "8800-8802" //端口设置范围的目的,是为了使用 scale的方式启动多份微服务
volumes:
- server-app:/usr/server
volumes:
server-app:
networks:
test-net:
external: true
$ docker-compose build 编译文件里面所有服务
$ docker-compose up -d 运行文件里面所有服务
$ docker-compose logs -f 查看日志
查看日志发现已经可以联通配置中心了
到这里就结束,如果有什么不对的地方,请指出
如果有什么看不懂的,可参考官方文档
https://docs.docker.com/network/network-tutorial-overlay/