需要一个swarm集群= = ,我们用traefik的动态配置,所谓的动态配置就是你修改配置文件以后,不用手动重启traefik,只要重启微服务,它会自动发现你的修改并且应用。

traefik的那些概念我不讲了,官方文档说得很清楚,我们直接在swarm集群里面起一个traefik:

version: "3.7"
services:
  traefik:
    image: traefik:v1.7-alpine
    ports:
      - 80:80
      - 443:443
    deploy:
      labels:
        - traefik.frontend.rule=Host:traefik.com
        - traefik.enable=true
        - traefik.port=8080
        - traefik.tags=traefik-public
        - traefik.docker.network=multihost
        - traefik.webservice.frontend.entryPoints=https
      replicas: 1
      placement:
        constraints:
          - node.labels.traefik-public.traefik-public-certificates == true
    configs:
      - source: traefik.toml
        target: /etc/traefik/traefik.toml
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    secrets:
      - source: traefik.com.crt
        target: /ssl/traefik.com.crt
      - source: traefik.com.key
        target: /ssl/traefik.com.key
    networks:
      - multihost
    command: >
      --docker
      --docker.swarmMode
      --docker.watch
      --docker.exposedbydefault=false
      --constraints=tag==traefik-public
      --accessLog
      --api      

networks:
  multihost:
    external: true
		
configs:
  traefik.toml:
    external: true

secrets:
  traefik.com.crt:
    external: true
  traefik.com.key:
    external: true

几个关键点: –docker.exposedbydefault=false,–constraints=tag==traefik-public,前面一个只暴露有标签的服务,后面一个可以用来只暴露有这个标签的服务给对应的traefik实例,对部署多个traefik有帮助。

我们麻烦一点用了docker的secret保存证书,config保存配置,所以先要创建这两个: traefik.toml:

logLevel = "DEBUG"

defaultEntryPoints = ["http", "https"]

[entryPoints]
  [entryPoints.http]
    address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
    address = ":443"

  [entryPoints.https.tls]
    [[entryPoints.https.tls.certificates]]
      certFile = "/ssl/traefik.com.crt"
      keyFile = "/ssl/traefik.com.key"

我们把http请求都重定向到https。 docker config create traefik.toml traefik.toml docker secret 就不写了。 这样就可以部署service了。


接下来就是动态配置了,比如说我们想访问后端的rabbitmq:

version: "3.4"
services:
  rabbitmq:
    image: rabbitmq:3.7.5-management
    deploy:
      labels:
        - traefik.frontend.rule=Host:rabbitmq.com
        - traefik.enable=true
        - traefik.port=15672
        - traefik.tags=traefik-public
        - traefik.docker.network=multihost
        - traefik.backend.loadbalancer.swarm=true

这里我们用docker swarm mode内置的负载均衡,影响不大。 再看一个复杂一点的:

version: "3.4"
services:
  gateway-service:
    image: 
    deploy:
      labels:
        - traefik.api.frontend.rule=Host:traefik-api.com
        - traefik.web-api.frontend.rule=Host:traefik-api.com;PathPrefix:/api/
        - traefik.accounts.frontend.rule=Host:traefik-accounts.com;PathPrefixStrip:/api
        - traefik.enable=true
        - traefik.port=9000
        - traefik.tags=traefik-public
        - traefik.docker.network=multihost
        - traefik.backend.loadbalancer.swarm=true

这里有3个frontend,traefik-api.com, traefik-api.com/api/, traefik-accounts.com/api。 都指向同一个后端,gateway-service。 具体配置看官方文档吧,解释得很清楚。

它还有个web页面: 大概就是这个样子= =