環境
window10環境下hyper-v中使用docker-machine創建三個 Docker 主機,並使用docker swarm加入到集群中
- manager管理節點ip為10.0.0.126
- work1工作節點ip為10.0.0.112
- work2工作節點ip為10.0.0.113
user_service和product_service服務部署於三個節點中,consulserver、ocelotgateway、identity_service和simpleclient服務部署在manager管理節點中
其中user_service用戶服務,product_service產品服務,ocelotgateway路由網關,identity_service認證服務,consulserver服務注冊與發現,simpleclient訪問客戶端
簡述
docker swarm是docker官方下的服務編排組件,上手簡單,能快速地進行服務的集群發布。
swarm集群中使用endpoint_mode的dnsrr模式對各主機節點進行負載均衡,默認采用輪詢方式
在集群中使用consul進行服務發現與注冊,user_service和product_service服務會向consul服務進行注冊,在product_service中會使用consul的服務發現api調用user_service服務
ocelot服務作為網關對user_service和product_service服務進行路由,並集成identity_service服務的認證
代碼
步驟
進入manager管理節點,創建並編輯dockerSwarm.yml
進入manager管理節點
docker-machine ssh manager
創建並編輯dockerSwarm.yml
cd /tmp && > dockerSwarm.yml && vi ./dockerSwarm.yml
使用docker stack命令發布服務
docker stack deploy -c ./dockerSwarm.yml simpleconsul
查看consul的UI中的服務
使用客戶端訪問經過ocelot網關認證(密碼模式)的product服務信息
http://10.0.0.126:8821/product/ownerpassword
使用客戶端訪問的經過ocelot認證(密碼模式)的Product服務中user信息
http://10.0.0.126:8821/product/userinfo
dockerSwarm.yml 文件
#version: "3" #error endpoint_mode Additional property endpoint_mode is not allowed
version: "3.2"
services:
consulserver:
image: progrium/consul:latest
environment:
SERVICE_TAGS: consul servers
networks:
- overlay
#hostname: consulserver
ports:
- "8300:8300"
- "8400:8400"
- "8500:8500"
- "53:53"
command: -server -ui-dir /ui -data-dir /tmp/consul -bootstrap-expect 1
deploy:
placement:
constraints: [node.role == manager]
user_service:
image: windcatcher/user_service:v1
networks:
- overlay
# ports: #error port published with ingress mode can't be used with dnsrr mode
# - 80:80
environment:
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConsulUrl=http://consulserver:8500
- RegisterServerUrl=http://user_service
- RegisterServiceName=user_service
deploy:
mode: replicated
replicas: 3
endpoint_mode: dnsrr
product_service:
image: windcatcher/product_service:v1
#hostname: product_service
networks:
- overlay
environment:
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConsulUrl=http://consulserver:8500
- RegisterServerUrl=http://product_service
- RegisterServiceName=product_service
- DiscoveryServiceName=user_service
- DiscoverDnsUrl=http://consulserver:8600
# ports:
# - '8802:80'
depends_on:
- consulserver
- user_service
deploy:
mode: replicated
replicas: 3
endpoint_mode: dnsrr
identity_service:
image: windcatcher/identity_service:v1
#hostname: identity_service
networks:
- overlay
ports:
- '8010:80'
deploy:
placement:
constraints: [node.role == manager]
ocelotgateway:
image: windcatcher/ocelotgateway:v1
networks:
- overlay
environment:
- IdentityServerUrl=http://identity_service
ports:
- '9900:80'
depends_on:
- consulserver
- user_service
- product_service
- identity_service
deploy:
placement:
constraints: [node.role == manager]
simpleclient:
image: windcatcher/simpleclient:v1
networks:
- overlay
environment:
- IdentityServerUrl=http://identity_service
- GatewayUrl=http://ocelotgateway
ports:
- '8821:80'
depends_on:
- ocelotgateway
- user_service
- product_service
- identity_service
deploy:
placement:
constraints: [node.role == manager]
networks:
overlay: