使用dockerswarm+consul+ocelot對asp netcore服務進行集群,發現和網關認證


環境

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服務的認證

代碼

github地址

步驟

進入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中的服務

http://10.0.0.126:8500

使用客戶端訪問經過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:     



參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM