利佰兴 发表于 2024-2-19 16:03:22

.net core微服务之网关

网关:
一:apisix
  doc:https://apisix.apache.org/zh/docs/apisix/getting-started/README/
  github:https://github.com/apache/apisix
二:Kong
  github:https://github.com/Kong/kong
三:Ocelot
  github:https://github.com/ThreeMammals/Ocelot
四:janus
  github:https://github.com/motiv-labs/janus
 
前置条件:docker,yaml
microservice.yaml
version: "3.8"
networks:
caseor_bridge:
    driver: bridge
    ipam:
      config:
      - subnet: 172.0.10.0/24

services:

    mysql:
      container_name: mysql
      image: mysql
      privileged: true
      command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --max_connections=2000 --max_allowed_packet=64M
      environment:
          - TZ=Asia/Shanghai
          - MYSQL_ROOT_PASSWORD=123456
      volumes:
          - ./mysql:/var/lib/mysql
      ports:
          - "3306:3306"
      healthcheck:
          test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
          interval: 5s
          timeout: 10s
          retries: 10
      networks:
          caseor_bridge:
            ipv4_address: 172.0.10.3

    redis:
      image: redis
      container_name: "redis"
      ports:
            - "6379:6379"
      volumes:
            - ./redis/data:/data
            - ./redis/conf:/usr/local/etc/redis
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.4

    nacos1:
      container_name: nacos1
      hostname: nacos1
      image: nacos/nacos-server
      environment:
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.0.10.3
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123456
            - MYSQL_SERVICE_DB_NAME=nacos
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
      volumes:
            - ./nacos/cluster-logs/nacos1:/home/nacos/logs
            - ./nacos/init.d:/home/nacos/init.d
      ports:
            - 8850:8848
            - 7850:7848   
            - 9870:9848
            - 9852:9849
      depends_on:
          - mysql
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.5

    nacos2:
      container_name: nacos2
      hostname: nacos2
      image: nacos/nacos-server
      environment:            
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.0.10.3
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123456
            - MYSQL_SERVICE_DB_NAME=nacos
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
      volumes:
            - ./nacos/cluster-logs/nacos2:/home/nacos/logs
            - ./nacos/init.d:/home/nacos/init.d
      ports:
            - 8849:8848
            - 7849:7848   
            - 9869:9848
            - 9851:9849
      depends_on:
          - mysql
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.6

    nacos3:
      container_name: nacos3
      hostname: nacos3
      image: nacos/nacos-server
      environment:            
            - MODE=cluster
            - PREFER_HOST_MODE=hostname
            - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
            - SPRING_DATASOURCE_PLATFORM=mysql
            - MYSQL_SERVICE_HOST=172.0.10.3
            - MYSQL_SERVICE_PORT=3306
            - MYSQL_SERVICE_USER=root
            - MYSQL_SERVICE_PASSWORD=123456
            - MYSQL_SERVICE_DB_NAME=nacos
            - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
            - JVM_XMS=128m
            - JVM_XMX=128m
            - JVM_XMN=128m
      volumes:
            - ./nacos/cluster-logs/nacos3:/home/nacos/logs
            - ./nacos/init.d:/home/nacos/init.d
      ports:
            - 8848:8848
            - 7848:7848   
            - 9848:9848
            - 9849:9849
      depends_on:
          - mysql
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.7

    etcd:
      container_name: etcd
      hostname: etcd
      image: bitnami/etcd
      volumes:
          - ./etcd/data:/bitnami/etcd
      environment:
          ETCD_ENABLE_V2: "true"
          ALLOW_NONE_AUTHENTICATION: "yes"
          ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" #https://github.com/apache/apisix-dashboard/issues/2756 需要更换为host域名不能使用0.0.0.0
          ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
      ports:
          - "2379:2379/tcp"
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.8

    apisix:
      container_name: apisix
      hostname: apisix
      image: apache/apisix      
      volumes:
          - ./apisix/log:/usr/local/apisix/logs
          - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
      depends_on:
          - etcd
      ports:
          - "9088:9088/tcp"
          - "9180:9180/tcp"
          - "127.0.0.1:9090:9090/tcp"
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.9
   
    apisix-dashboard:
      container_name: apisix-dashboard
      image: apache/apisix-dashboard
      depends_on:
          - etcd
      ports:
          - "9188:9188"
      volumes:
          - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.10

    rabbitmq01:
      image: rabbitmq
      container_name: rabbitmq01
      hostname: rabbitmq01
      environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
      - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
      - RABBITMQ_ERLANG_COOKIE='secret_cookie'
      ports:
      - "15672:15672"
      - "5672:5672"
      volumes:
      - ./rabbitmq/mq1/data:/var/lib/rabbitmq
      - ./rabbitmq/mq1/conf:/etc/rabbitmq
      command:bash -c "sleep 10; rabbitmq-server;"
      networks:
      caseor_bridge:
            ipv4_address: 172.0.10.11

    rabbitmq02:
      image: rabbitmq
      container_name: rabbitmq02
      hostname: rabbitmq02
      environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
      - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
      - RABBITMQ_ERLANG_COOKIE='secret_cookie'
      ports:
      - "15673:15672"
      - "5673:5672"
      depends_on:
          - rabbitmq01
      volumes:
      - ./rabbitmq/mq2/data:/var/lib/rabbitmq
      - ./rabbitmq/mq2/conf:/etc/rabbitmq
      command:bash -c "sleep 10; rabbitmq-server;"
      networks:
      caseor_bridge:
            ipv4_address: 172.0.10.12

    rabbitmq03:
      image: rabbitmq
      container_name: rabbitmq03
      hostname: rabbitmq03
      environment:
      - TZ=Asia/Shanghai
      - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
      - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
      - RABBITMQ_ERLANG_COOKIE='secret_cookie'
      ports:
      - "15674:15672"
      - "5674:5672"
      depends_on:
          - rabbitmq01
      volumes:
      - ./rabbitmq/mq3/data:/var/lib/rabbitmq
      - ./rabbitmq/mq3/conf:/etc/rabbitmq
      command:bash -c "sleep 10; rabbitmq-server;"
      networks:
      caseor_bridge:
            ipv4_address: 172.0.10.13

# 开启web管理
# rabbitmq-plugins enable rabbitmq_management

# # 加入rabbitmq集群

# # rabbit1
# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl start_app

# # rabbit2
# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl join_cluster --ram rabbit@rabbit1
# rabbitmqctl start_app

# # rabbit3
# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl join_cluster --ram rabbit@rabbit1
# rabbitmqctl start_appView Code目前使用docker启动apisix,需要依赖etcd,
    etcd:
      container_name: etcd
      hostname: etcd
      image: bitnami/etcd
      volumes:
          - ./etcd/data:/bitnami/etcd
      environment:
          ETCD_ENABLE_V2: "true"
          ALLOW_NONE_AUTHENTICATION: "yes"
          ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" #https://github.com/apache/apisix-dashboard/issues/2756 需要更换为host域名不能使用0.0.0.0
          ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
      ports:
          - "2379:2379/tcp"
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.8

    apisix:
      container_name: apisix
      hostname: apisix
      image: apache/apisix      
      volumes:
          - ./apisix/log:/usr/local/apisix/logs
          - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
      depends_on:
          - etcd
      ports:
          - "9088:9088/tcp"
          - "9180:9180/tcp"
          - "127.0.0.1:9090:9090/tcp"
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.9
   
    apisix-dashboard:
      container_name: apisix-dashboard
      image: apache/apisix-dashboard
      depends_on:
          - etcd
      ports:
          - "9188:9188"
      volumes:
          - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
      networks:
          caseor_bridge:
                ipv4_address: 172.0.10.10使用apisix dashboard的时候 会出现一个bug,需要在启动etcd的时候设置ETCD_ADVERTISE_CLIENT_URLS为host域名 而不能使用0.0.0.0
apisix的config yaml 
apisix:
    node_listen:
      - port: 9088
    enable_ipv6: true
    enable_control: true
    control:
      ip: "[::]"
      port: 9090
discovery:
nacos:
    host:
      - "http://172.0.10.7:8848"
deployment:
    role: traditional
    role_traditional:
      config_provider: etcd
    admin:
      admin_listen:
            port: 9180
      allow_admin:
            - 0.0.0.0/0
      admin_key:
            - name: "admin"
            key: b848941cd4e1003f2f961a7786ecf75f
            role: admin
            - name: "viewer"
            key: dd3bc5bde63f272f554b91336bfcfcb3
            role: viewer
    etcd:
       host:
         - http://etcd:2379
       prefix: /apisix
       timeout: 30
#plugin_attr:
#    prometheus:
#      export_addr:
#            ip: "0.0.0.0"
#            port: 9091
#ENDView Codedashboard的config yaml
conf:
listen:
    host: 0.0.0.0   # `manager api` listening ip or host name
    port: 9188          # `manager api` listening port
allow_list:         # If we don't set any IP list, then any IP access is allowed by default.
    - 0.0.0.0/0
etcd:
    endpoints:          # supports defining multiple etcd host addresses for an etcd cluster
      - "http://etcd:2379"
                        # yamllint disable rule:comments-indentation
                        # etcd basic auth info
    # username: "root"    # ignore etcd username if not enable etcd auth
    # password: "123456"# ignore etcd password if not enable etcd auth
    mtls:
      key_file: ""          # Path of your self-signed client side key
      cert_file: ""         # Path of your self-signed client side cert
      ca_file: ""         # Path of your self-signed ca cert, the CA is used to sign callers' certificates
    # prefix: /apisix   # apisix config's prefix in etcd, /apisix by default
log:
    error_log:
      level: warn       # supports levels, lower to higher: debug, info, warn, error, panic, fatal
      file_path:
      logs/error.log# supports relative path, absolute path, standard output
                        # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
    access_log:
      file_path:
      logs/access.log# supports relative path, absolute path, standard output
                         # such as: logs/access.log, /tmp/logs/access.log, /dev/stdout, /dev/stderr
                         # log example: 2020-12-09T16:38:09.039+0800    INFO    filter/logging.go:46    /apisix/admin/routes/r1 {"status": 401, "host": "127.0.0.1:9000", "query": "asdfsafd=adf&a=a", "requestId": "3d50ecb8-758c-46d1-af5b-cd9d1c820156", "latency": 0, "remoteIP": "127.0.0.1", "method": "PUT", "errs": []}
authentication:
secret:
    secret            # secret for jwt token generation.
                        # NOTE: Highly recommended to modify this value to protect `manager api`.
                        # if it's default value, when `manager api` start, it will generate a random string to replace it.
expire_time: 3600   # jwt token expire time, in second
users:                # yamllint enable rule:comments-indentation
    - username: admin   # username and password for login `manager api`
      password: admin
    - username: user
      password: user

plugins:                        # plugin list (sorted in alphabetical order)
- api-breaker
- authz-keycloak
- basic-auth
- batch-requests
- consumer-restriction
- cors
# - dubbo-proxy
- echo
# - error-log-logger
# - example-plugin
- fault-injection
- grpc-transcode
- hmac-auth
- http-logger
- ip-restriction
- jwt-auth
- kafka-logger
- key-auth
- limit-conn
- limit-count
- limit-req
# - log-rotate
# - node-status
- openid-connect
- prometheus
- proxy-cache
- proxy-mirror
- proxy-rewrite
- redirect
- referer-restriction
- request-id
- request-validation
- response-rewrite
- serverless-post-function
- serverless-pre-function
# - skywalking
- sls-logger
- syslog
- tcp-logger
- udp-logger
- uri-blocker
- wolf-rbac
- zipkin
- server-info
- traffic-splitView Code在文件夹下启动
docker-compose -f microservice.yaml up

 本地打开 http://localhost:9188 使用admin ,admin 登录
配置路由信息

 

 

 这里使用的是nacos作为服务发现,具体查看nacos配置

 启动以8083端口的服务
dotnet run --urls=http://*:8083
 打开浏览器调试下接口

 接下来使用网关请求

 再启动以8084端口的服务

nacos中出现了两个实例
 

继续使用网关请求
在log中的access.log 可以查看到网关请求到不同端口的服务

 
 

 几个注意点:
1.etcd的ETCD_ADVERTISE_CLIENT_URLS 需要更换为host域名不能使用0.0.0.0

 2.apisix的nacos配置在 config.yaml中的discovery
 

尽量使用host名称 


来源:https://www.cnblogs.com/AsprosL/p/18020704
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: .net core微服务之网关