经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.net core微服务之网关
来源:cnblogs  作者:六指狂魔肉球猫  时间:2024/2/21 9:27:45  对本文有异议

网关:

一: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. services:
  9. mysql:
  10. container_name: mysql
  11. image: mysql
  12. privileged: true
  13. command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --max_connections=2000 --max_allowed_packet=64M
  14. environment:
  15. - TZ=Asia/Shanghai
  16. - MYSQL_ROOT_PASSWORD=123456
  17. volumes:
  18. - ./mysql:/var/lib/mysql
  19. ports:
  20. - "3306:3306"
  21. healthcheck:
  22. test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
  23. interval: 5s
  24. timeout: 10s
  25. retries: 10
  26. networks:
  27. caseor_bridge:
  28. ipv4_address: 172.0.10.3
  29. redis:
  30. image: redis
  31. container_name: "redis"
  32. ports:
  33. - "6379:6379"
  34. volumes:
  35. - ./redis/data:/data
  36. - ./redis/conf:/usr/local/etc/redis
  37. networks:
  38. caseor_bridge:
  39. ipv4_address: 172.0.10.4
  40. nacos1:
  41. container_name: nacos1
  42. hostname: nacos1
  43. image: nacos/nacos-server
  44. environment:
  45. - MODE=cluster
  46. - PREFER_HOST_MODE=hostname
  47. - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  48. - SPRING_DATASOURCE_PLATFORM=mysql
  49. - MYSQL_SERVICE_HOST=172.0.10.3
  50. - MYSQL_SERVICE_PORT=3306
  51. - MYSQL_SERVICE_USER=root
  52. - MYSQL_SERVICE_PASSWORD=123456
  53. - MYSQL_SERVICE_DB_NAME=nacos
  54. - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  55. - JVM_XMS=128m
  56. - JVM_XMX=128m
  57. - JVM_XMN=128m
  58. volumes:
  59. - ./nacos/cluster-logs/nacos1:/home/nacos/logs
  60. - ./nacos/init.d:/home/nacos/init.d
  61. ports:
  62. - 8850:8848
  63. - 7850:7848
  64. - 9870:9848
  65. - 9852:9849
  66. depends_on:
  67. - mysql
  68. networks:
  69. caseor_bridge:
  70. ipv4_address: 172.0.10.5
  71. nacos2:
  72. container_name: nacos2
  73. hostname: nacos2
  74. image: nacos/nacos-server
  75. environment:
  76. - MODE=cluster
  77. - PREFER_HOST_MODE=hostname
  78. - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  79. - SPRING_DATASOURCE_PLATFORM=mysql
  80. - MYSQL_SERVICE_HOST=172.0.10.3
  81. - MYSQL_SERVICE_PORT=3306
  82. - MYSQL_SERVICE_USER=root
  83. - MYSQL_SERVICE_PASSWORD=123456
  84. - MYSQL_SERVICE_DB_NAME=nacos
  85. - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  86. - JVM_XMS=128m
  87. - JVM_XMX=128m
  88. - JVM_XMN=128m
  89. volumes:
  90. - ./nacos/cluster-logs/nacos2:/home/nacos/logs
  91. - ./nacos/init.d:/home/nacos/init.d
  92. ports:
  93. - 8849:8848
  94. - 7849:7848
  95. - 9869:9848
  96. - 9851:9849
  97. depends_on:
  98. - mysql
  99. networks:
  100. caseor_bridge:
  101. ipv4_address: 172.0.10.6
  102. nacos3:
  103. container_name: nacos3
  104. hostname: nacos3
  105. image: nacos/nacos-server
  106. environment:
  107. - MODE=cluster
  108. - PREFER_HOST_MODE=hostname
  109. - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  110. - SPRING_DATASOURCE_PLATFORM=mysql
  111. - MYSQL_SERVICE_HOST=172.0.10.3
  112. - MYSQL_SERVICE_PORT=3306
  113. - MYSQL_SERVICE_USER=root
  114. - MYSQL_SERVICE_PASSWORD=123456
  115. - MYSQL_SERVICE_DB_NAME=nacos
  116. - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  117. - JVM_XMS=128m
  118. - JVM_XMX=128m
  119. - JVM_XMN=128m
  120. volumes:
  121. - ./nacos/cluster-logs/nacos3:/home/nacos/logs
  122. - ./nacos/init.d:/home/nacos/init.d
  123. ports:
  124. - 8848:8848
  125. - 7848:7848
  126. - 9848:9848
  127. - 9849:9849
  128. depends_on:
  129. - mysql
  130. networks:
  131. caseor_bridge:
  132. ipv4_address: 172.0.10.7
  133. etcd:
  134. container_name: etcd
  135. hostname: etcd
  136. image: bitnami/etcd
  137. volumes:
  138. - ./etcd/data:/bitnami/etcd
  139. environment:
  140. ETCD_ENABLE_V2: "true"
  141. ALLOW_NONE_AUTHENTICATION: "yes"
  142. ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" #https://github.com/apache/apisix-dashboard/issues/2756 需要更换为host域名不能使用0.0.0.0
  143. ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  144. ports:
  145. - "2379:2379/tcp"
  146. networks:
  147. caseor_bridge:
  148. ipv4_address: 172.0.10.8
  149. apisix:
  150. container_name: apisix
  151. hostname: apisix
  152. image: apache/apisix
  153. volumes:
  154. - ./apisix/log:/usr/local/apisix/logs
  155. - ./apisix/conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
  156. depends_on:
  157. - etcd
  158. ports:
  159. - "9088:9088/tcp"
  160. - "9180:9180/tcp"
  161. - "127.0.0.1:9090:9090/tcp"
  162. networks:
  163. caseor_bridge:
  164. ipv4_address: 172.0.10.9
  165. apisix-dashboard:
  166. container_name: apisix-dashboard
  167. image: apache/apisix-dashboard
  168. depends_on:
  169. - etcd
  170. ports:
  171. - "9188:9188"
  172. volumes:
  173. - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
  174. networks:
  175. caseor_bridge:
  176. ipv4_address: 172.0.10.10
  177. rabbitmq01:
  178. image: rabbitmq
  179. container_name: rabbitmq01
  180. hostname: rabbitmq01
  181. environment:
  182. - TZ=Asia/Shanghai
  183. - RABBITMQ_DEFAULT_USER=root #自定义登录账号
  184. - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  185. - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  186. ports:
  187. - "15672:15672"
  188. - "5672:5672"
  189. volumes:
  190. - ./rabbitmq/mq1/data:/var/lib/rabbitmq
  191. - ./rabbitmq/mq1/conf:/etc/rabbitmq
  192. command: bash -c "sleep 10; rabbitmq-server;"
  193. networks:
  194. caseor_bridge:
  195. ipv4_address: 172.0.10.11
  196. rabbitmq02:
  197. image: rabbitmq
  198. container_name: rabbitmq02
  199. hostname: rabbitmq02
  200. environment:
  201. - TZ=Asia/Shanghai
  202. - RABBITMQ_DEFAULT_USER=root #自定义登录账号
  203. - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  204. - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  205. ports:
  206. - "15673:15672"
  207. - "5673:5672"
  208. depends_on:
  209. - rabbitmq01
  210. volumes:
  211. - ./rabbitmq/mq2/data:/var/lib/rabbitmq
  212. - ./rabbitmq/mq2/conf:/etc/rabbitmq
  213. command: bash -c "sleep 10; rabbitmq-server;"
  214. networks:
  215. caseor_bridge:
  216. ipv4_address: 172.0.10.12
  217. rabbitmq03:
  218. image: rabbitmq
  219. container_name: rabbitmq03
  220. hostname: rabbitmq03
  221. environment:
  222. - TZ=Asia/Shanghai
  223. - RABBITMQ_DEFAULT_USER=root #自定义登录账号
  224. - RABBITMQ_DEFAULT_PASS=123456 #自定义登录密码
  225. - RABBITMQ_ERLANG_COOKIE='secret_cookie'
  226. ports:
  227. - "15674:15672"
  228. - "5674:5672"
  229. depends_on:
  230. - rabbitmq01
  231. volumes:
  232. - ./rabbitmq/mq3/data:/var/lib/rabbitmq
  233. - ./rabbitmq/mq3/conf:/etc/rabbitmq
  234. command: bash -c "sleep 10; rabbitmq-server;"
  235. networks:
  236. caseor_bridge:
  237. ipv4_address: 172.0.10.13
  238. # 开启web管理
  239. # rabbitmq-plugins enable rabbitmq_management
  240. # # 加入rabbitmq集群
  241. # # rabbit1
  242. # rabbitmqctl stop_app
  243. # rabbitmqctl reset
  244. # rabbitmqctl start_app
  245. # # rabbit2
  246. # rabbitmqctl stop_app
  247. # rabbitmqctl reset
  248. # rabbitmqctl join_cluster --ram rabbit@rabbit1
  249. # rabbitmqctl start_app
  250. # # rabbit3
  251. # rabbitmqctl stop_app
  252. # rabbitmqctl reset
  253. # rabbitmqctl join_cluster --ram rabbit@rabbit1
  254. # 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. apisix-dashboard:
  34. container_name: apisix-dashboard
  35. image: apache/apisix-dashboard
  36. depends_on:
  37. - etcd
  38. ports:
  39. - "9188:9188"
  40. volumes:
  41. - ./apisix/conf/dashboard.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
  42. networks:
  43. caseor_bridge:
  44. 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 Code

dashboard的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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号