翼度科技»论坛 编程开发 .net 查看内容

.net core微服务之网关

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
网关:
一: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
  1. version: "3.8"
  2. networks:
  3.   caseor_bridge:
  4.     driver: bridge
  5.     ipam:
  6.       config:
  7.         - subnet: 172.0.10.0/24
  8.   
  9. services:
  10.     mysql:
  11.         container_name: mysql
  12.         image: mysql
  13.         privileged: true
  14.         command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --max_connections=2000 --max_allowed_packet=64M
  15.         environment:
  16.           - TZ=Asia/Shanghai
  17.           - MYSQL_ROOT_PASSWORD=123456
  18.         volumes:
  19.           - ./mysql:/var/lib/mysql
  20.         ports:
  21.           - "3306:3306"
  22.         healthcheck:
  23.           test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
  24.           interval: 5s
  25.           timeout: 10s
  26.           retries: 10
  27.         networks:
  28.           caseor_bridge:
  29.             ipv4_address: 172.0.10.3
  30.     redis:
  31.         image: redis
  32.         container_name: "redis"
  33.         ports:
  34.             - "6379:6379"
  35.         volumes:
  36.             - ./redis/data:/data
  37.             - ./redis/conf:/usr/local/etc/redis
  38.         networks:
  39.           caseor_bridge:
  40.                 ipv4_address: 172.0.10.4
  41.     nacos1:
  42.         container_name: nacos1
  43.         hostname: nacos1
  44.         image: nacos/nacos-server
  45.         environment:
  46.             - MODE=cluster
  47.             - PREFER_HOST_MODE=hostname
  48.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  49.             - SPRING_DATASOURCE_PLATFORM=mysql
  50.             - MYSQL_SERVICE_HOST=172.0.10.3
  51.             - MYSQL_SERVICE_PORT=3306
  52.             - MYSQL_SERVICE_USER=root
  53.             - MYSQL_SERVICE_PASSWORD=123456
  54.             - MYSQL_SERVICE_DB_NAME=nacos
  55.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  56.             - JVM_XMS=128m
  57.             - JVM_XMX=128m
  58.             - JVM_XMN=128m
  59.         volumes:
  60.             - ./nacos/cluster-logs/nacos1:/home/nacos/logs
  61.             - ./nacos/init.d:/home/nacos/init.d
  62.         ports:
  63.             - 8850:8848
  64.             - 7850:7848     
  65.             - 9870:9848
  66.             - 9852:9849
  67.         depends_on:
  68.           - mysql
  69.         networks:
  70.           caseor_bridge:
  71.                 ipv4_address: 172.0.10.5
  72.     nacos2:
  73.         container_name: nacos2
  74.         hostname: nacos2
  75.         image: nacos/nacos-server
  76.         environment:            
  77.             - MODE=cluster
  78.             - PREFER_HOST_MODE=hostname
  79.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  80.             - SPRING_DATASOURCE_PLATFORM=mysql
  81.             - MYSQL_SERVICE_HOST=172.0.10.3
  82.             - MYSQL_SERVICE_PORT=3306
  83.             - MYSQL_SERVICE_USER=root
  84.             - MYSQL_SERVICE_PASSWORD=123456
  85.             - MYSQL_SERVICE_DB_NAME=nacos
  86.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  87.             - JVM_XMS=128m
  88.             - JVM_XMX=128m
  89.             - JVM_XMN=128m
  90.         volumes:
  91.             - ./nacos/cluster-logs/nacos2:/home/nacos/logs
  92.             - ./nacos/init.d:/home/nacos/init.d
  93.         ports:
  94.             - 8849:8848
  95.             - 7849:7848     
  96.             - 9869:9848
  97.             - 9851:9849
  98.         depends_on:
  99.           - mysql
  100.         networks:
  101.           caseor_bridge:
  102.                 ipv4_address: 172.0.10.6
  103.     nacos3:
  104.         container_name: nacos3
  105.         hostname: nacos3
  106.         image: nacos/nacos-server
  107.         environment:            
  108.             - MODE=cluster
  109.             - PREFER_HOST_MODE=hostname
  110.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  111.             - SPRING_DATASOURCE_PLATFORM=mysql
  112.             - MYSQL_SERVICE_HOST=172.0.10.3
  113.             - MYSQL_SERVICE_PORT=3306
  114.             - MYSQL_SERVICE_USER=root
  115.             - MYSQL_SERVICE_PASSWORD=123456
  116.             - MYSQL_SERVICE_DB_NAME=nacos
  117.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  118.             - JVM_XMS=128m
  119.             - JVM_XMX=128m
  120.             - JVM_XMN=128m
  121.         volumes:
  122.             - ./nacos/cluster-logs/nacos3:/home/nacos/logs
  123.             - ./nacos/init.d:/home/nacos/init.d
  124.         ports:
  125.             - 8848:8848
  126.             - 7848:7848     
  127.             - 9848:9848
  128.             - 9849:9849
  129.         depends_on:
  130.           - mysql
  131.         networks:
  132.           caseor_bridge:
  133.                 ipv4_address: 172.0.10.7
  134.     etcd:
  135.         container_name: etcd
  136.         hostname: etcd
  137.         image: bitnami/etcd
  138.         volumes:
  139.           - ./etcd/data:/bitnami/etcd
  140.         environment:
  141.           ETCD_ENABLE_V2: "true"
  142.           ALLOW_NONE_AUTHENTICATION: "yes"
  143.           ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" #https://github.com/apache/apisix-dashboard/issues/2756 需要更换为host域名不能使用0.0.0.0
  144.           ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  145.         ports:
  146.           - "2379:2379/tcp"
  147.         networks:
  148.           caseor_bridge:
  149.                 ipv4_address: 172.0.10.8
  150.     apisix:
  151.         container_name: apisix
  152.         hostname: apisix
  153.         image: apache/apisix        
  154.         volumes:
  155.           - ./apisix/log:/usr/local/apisix/logs
  156.           - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
  157.         depends_on:
  158.           - etcd
  159.         ports:
  160.           - "9088:9088/tcp"
  161.           - "9180:9180/tcp"
  162.           - "127.0.0.1:9090:9090/tcp"
  163.         networks:
  164.           caseor_bridge:
  165.                 ipv4_address: 172.0.10.9
  166.    
  167.     apisix-dashboard:
  168.         container_name: apisix-dashboard
  169.         image: apache/apisix-dashboard
  170.         depends_on:
  171.           - etcd
  172.         ports:
  173.           - "9188:9188"
  174.         volumes:
  175.           - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
  176.         networks:
  177.           caseor_bridge:
  178.                 ipv4_address: 172.0.10.10
  179.     rabbitmq01:
  180.       image: rabbitmq
  181.       container_name: rabbitmq01
  182.       hostname: rabbitmq01
  183.       environment:
  184.         - TZ=Asia/Shanghai
  185.         - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
  186.         - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  187.         - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  188.       ports:
  189.         - "15672:15672"
  190.         - "5672:5672"
  191.       volumes:
  192.         - ./rabbitmq/mq1/data:/var/lib/rabbitmq
  193.         - ./rabbitmq/mq1/conf:/etc/rabbitmq
  194.       command:  bash -c "sleep 10; rabbitmq-server;"
  195.       networks:
  196.         caseor_bridge:
  197.             ipv4_address: 172.0.10.11
  198.     rabbitmq02:
  199.       image: rabbitmq
  200.       container_name: rabbitmq02
  201.       hostname: rabbitmq02
  202.       environment:
  203.         - TZ=Asia/Shanghai
  204.         - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
  205.         - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  206.         - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  207.       ports:
  208.         - "15673:15672"
  209.         - "5673:5672"
  210.       depends_on:
  211.           - rabbitmq01
  212.       volumes:
  213.         - ./rabbitmq/mq2/data:/var/lib/rabbitmq
  214.         - ./rabbitmq/mq2/conf:/etc/rabbitmq
  215.       command:  bash -c "sleep 10; rabbitmq-server;"
  216.       networks:
  217.         caseor_bridge:
  218.             ipv4_address: 172.0.10.12
  219.     rabbitmq03:
  220.       image: rabbitmq
  221.       container_name: rabbitmq03
  222.       hostname: rabbitmq03
  223.       environment:
  224.         - TZ=Asia/Shanghai
  225.         - RABBITMQ_DEFAULT_USER=root   #自定义登录账号
  226.         - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  227.         - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  228.       ports:
  229.         - "15674:15672"
  230.         - "5674:5672"
  231.       depends_on:
  232.           - rabbitmq01
  233.       volumes:
  234.         - ./rabbitmq/mq3/data:/var/lib/rabbitmq
  235.         - ./rabbitmq/mq3/conf:/etc/rabbitmq
  236.       command:  bash -c "sleep 10; rabbitmq-server;"
  237.       networks:
  238.         caseor_bridge:
  239.             ipv4_address: 172.0.10.13
  240. # 开启web管理
  241. # rabbitmq-plugins enable rabbitmq_management
  242. # # 加入rabbitmq集群
  243. # # rabbit1
  244. # rabbitmqctl stop_app
  245. # rabbitmqctl reset
  246. # rabbitmqctl start_app
  247. # # rabbit2
  248. # rabbitmqctl stop_app
  249. # rabbitmqctl reset
  250. # rabbitmqctl join_cluster --ram rabbit@rabbit1
  251. # rabbitmqctl start_app
  252. # # rabbit3
  253. # rabbitmqctl stop_app
  254. # rabbitmqctl reset
  255. # rabbitmqctl join_cluster --ram rabbit@rabbit1
  256. # rabbitmqctl start_app
复制代码
View Code目前使用docker启动apisix,需要依赖etcd,
  1.     etcd:
  2.         container_name: etcd
  3.         hostname: etcd
  4.         image: bitnami/etcd
  5.         volumes:
  6.           - ./etcd/data:/bitnami/etcd
  7.         environment:
  8.           ETCD_ENABLE_V2: "true"
  9.           ALLOW_NONE_AUTHENTICATION: "yes"
  10.           ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" #https://github.com/apache/apisix-dashboard/issues/2756 需要更换为host域名不能使用0.0.0.0
  11.           ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  12.         ports:
  13.           - "2379:2379/tcp"
  14.         networks:
  15.           caseor_bridge:
  16.                 ipv4_address: 172.0.10.8
  17.     apisix:
  18.         container_name: apisix
  19.         hostname: apisix
  20.         image: apache/apisix        
  21.         volumes:
  22.           - ./apisix/log:/usr/local/apisix/logs
  23.           - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
  24.         depends_on:
  25.           - etcd
  26.         ports:
  27.           - "9088:9088/tcp"
  28.           - "9180:9180/tcp"
  29.           - "127.0.0.1:9090:9090/tcp"
  30.         networks:
  31.           caseor_bridge:
  32.                 ipv4_address: 172.0.10.9
  33.    
  34.     apisix-dashboard:
  35.         container_name: apisix-dashboard
  36.         image: apache/apisix-dashboard
  37.         depends_on:
  38.           - etcd
  39.         ports:
  40.           - "9188:9188"
  41.         volumes:
  42.           - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
  43.         networks:
  44.           caseor_bridge:
  45.                 ipv4_address: 172.0.10.10
复制代码
使用apisix dashboard的时候 会出现一个bug,需要在启动etcd的时候设置ETCD_ADVERTISE_CLIENT_URLS为host域名 而不能使用0.0.0.0
apisix的config yaml 
  1. apisix:
  2.     node_listen:
  3.         - port: 9088
  4.     enable_ipv6: true
  5.     enable_control: true
  6.     control:
  7.         ip: "[::]"
  8.         port: 9090
  9. discovery:
  10.   nacos:
  11.     host:
  12.       - "http://172.0.10.7:8848"
  13. deployment:
  14.     role: traditional
  15.     role_traditional:
  16.         config_provider: etcd
  17.     admin:
  18.         admin_listen:
  19.             port: 9180
  20.         allow_admin:
  21.             - 0.0.0.0/0
  22.         admin_key:
  23.             - name: "admin"
  24.               key: b848941cd4e1003f2f961a7786ecf75f
  25.               role: admin
  26.             - name: "viewer"
  27.               key: dd3bc5bde63f272f554b91336bfcfcb3
  28.               role: viewer
  29.     etcd:
  30.        host:
  31.            - http://etcd:2379
  32.        prefix: /apisix
  33.        timeout: 30
  34. #plugin_attr:
  35. #    prometheus:
  36. #        export_addr:
  37. #            ip: "0.0.0.0"
  38. #            port: 9091
  39. #END
复制代码
View Codedashboard的config yaml
  1. conf:
  2.   listen:
  3.     host: 0.0.0.0     # `manager api` listening ip or host name
  4.     port: 9188          # `manager api` listening port
  5.   allow_list:           # If we don't set any IP list, then any IP access is allowed by default.
  6.     - 0.0.0.0/0
  7.   etcd:
  8.     endpoints:          # supports defining multiple etcd host addresses for an etcd cluster
  9.       - "http://etcd:2379"
  10.                           # yamllint disable rule:comments-indentation
  11.                           # etcd basic auth info
  12.     # username: "root"    # ignore etcd username if not enable etcd auth
  13.     # password: "123456"  # ignore etcd password if not enable etcd auth
  14.     mtls:
  15.       key_file: ""          # Path of your self-signed client side key
  16.       cert_file: ""         # Path of your self-signed client side cert
  17.       ca_file: ""           # Path of your self-signed ca cert, the CA is used to sign callers' certificates
  18.     # prefix: /apisix     # apisix config's prefix in etcd, /apisix by default
  19.   log:
  20.     error_log:
  21.       level: warn       # supports levels, lower to higher: debug, info, warn, error, panic, fatal
  22.       file_path:
  23.         logs/error.log  # supports relative path, absolute path, standard output
  24.                         # such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
  25.     access_log:
  26.       file_path:
  27.         logs/access.log  # supports relative path, absolute path, standard output
  28.                          # such as: logs/access.log, /tmp/logs/access.log, /dev/stdout, /dev/stderr
  29.                          # 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": []}
  30. authentication:
  31.   secret:
  32.     secret              # secret for jwt token generation.
  33.                         # NOTE: Highly recommended to modify this value to protect `manager api`.
  34.                         # if it's default value, when `manager api` start, it will generate a random string to replace it.
  35.   expire_time: 3600     # jwt token expire time, in second
  36.   users:                # yamllint enable rule:comments-indentation
  37.     - username: admin   # username and password for login `manager api`
  38.       password: admin
  39.     - username: user
  40.       password: user
  41. plugins:                          # plugin list (sorted in alphabetical order)
  42.   - api-breaker
  43.   - authz-keycloak
  44.   - basic-auth
  45.   - batch-requests
  46.   - consumer-restriction
  47.   - cors
  48.   # - dubbo-proxy
  49.   - echo
  50.   # - error-log-logger
  51.   # - example-plugin
  52.   - fault-injection
  53.   - grpc-transcode
  54.   - hmac-auth
  55.   - http-logger
  56.   - ip-restriction
  57.   - jwt-auth
  58.   - kafka-logger
  59.   - key-auth
  60.   - limit-conn
  61.   - limit-count
  62.   - limit-req
  63.   # - log-rotate
  64.   # - node-status
  65.   - openid-connect
  66.   - prometheus
  67.   - proxy-cache
  68.   - proxy-mirror
  69.   - proxy-rewrite
  70.   - redirect
  71.   - referer-restriction
  72.   - request-id
  73.   - request-validation
  74.   - response-rewrite
  75.   - serverless-post-function
  76.   - serverless-pre-function
  77.   # - skywalking
  78.   - sls-logger
  79.   - syslog
  80.   - tcp-logger
  81.   - udp-logger
  82.   - uri-blocker
  83.   - wolf-rbac
  84.   - zipkin
  85.   - server-info
  86.   - traffic-split
复制代码
View Code在文件夹下启动
  1. docker-compose -f microservice.yaml up
复制代码


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

 

 

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

 启动以8083端口的服务
  1. 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】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具