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

.net core微服务之服务发现

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
一:nacos
  https://nacos.io/docs/latest/what-is-nacos/
  https://github.com/alibaba/nacos
二:consul
  https://developer.hashicorp.com/consul/docs?product_intent=consul
  https://github.com/hashicorp/consul
服务发现的框架常用的还有zookeeper eureka等,这里准备使用nacos
前置条件准备 docker,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启动mysql
  1.     mysql:
  2.         container_name: mysql
  3.         image: mysql
  4.         privileged: true
  5.         command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --max_connections=2000 --max_allowed_packet=64M
  6.         environment:
  7.           - TZ=Asia/Shanghai
  8.           - MYSQL_ROOT_PASSWORD=123456
  9.         volumes:
  10.           - ./mysql:/var/lib/mysql
  11.         ports:
  12.           - "3306:3306"
  13.         healthcheck:
  14.           test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
  15.           interval: 5s
  16.           timeout: 10s
  17.           retries: 10
  18.         networks:
  19.           caseor_bridge:
  20.             ipv4_address: 172.0.10.3
复制代码
View Code在数据库创建nacos数据库
  1. https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql
复制代码
准备三个nacos
  1.     nacos1:
  2.         container_name: nacos1
  3.         hostname: nacos1
  4.         image: nacos/nacos-server
  5.         environment:
  6.             - MODE=cluster
  7.             - PREFER_HOST_MODE=hostname
  8.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  9.             - SPRING_DATASOURCE_PLATFORM=mysql
  10.             - MYSQL_SERVICE_HOST=172.0.10.3
  11.             - MYSQL_SERVICE_PORT=3306
  12.             - MYSQL_SERVICE_USER=root
  13.             - MYSQL_SERVICE_PASSWORD=123456
  14.             - MYSQL_SERVICE_DB_NAME=nacos
  15.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  16.             - JVM_XMS=128m
  17.             - JVM_XMX=128m
  18.             - JVM_XMN=128m
  19.         volumes:
  20.             - ./nacos/cluster-logs/nacos1:/home/nacos/logs
  21.             - ./nacos/init.d:/home/nacos/init.d
  22.         ports:
  23.             - 8850:8848
  24.             - 7850:7848     
  25.             - 9870:9848
  26.             - 9852:9849
  27.         depends_on:
  28.           - mysql
  29.         networks:
  30.           caseor_bridge:
  31.                 ipv4_address: 172.0.10.5
  32.     nacos2:
  33.         container_name: nacos2
  34.         hostname: nacos2
  35.         image: nacos/nacos-server
  36.         environment:            
  37.             - MODE=cluster
  38.             - PREFER_HOST_MODE=hostname
  39.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  40.             - SPRING_DATASOURCE_PLATFORM=mysql
  41.             - MYSQL_SERVICE_HOST=172.0.10.3
  42.             - MYSQL_SERVICE_PORT=3306
  43.             - MYSQL_SERVICE_USER=root
  44.             - MYSQL_SERVICE_PASSWORD=123456
  45.             - MYSQL_SERVICE_DB_NAME=nacos
  46.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  47.             - JVM_XMS=128m
  48.             - JVM_XMX=128m
  49.             - JVM_XMN=128m
  50.         volumes:
  51.             - ./nacos/cluster-logs/nacos2:/home/nacos/logs
  52.             - ./nacos/init.d:/home/nacos/init.d
  53.         ports:
  54.             - 8849:8848
  55.             - 7849:7848     
  56.             - 9869:9848
  57.             - 9851:9849
  58.         depends_on:
  59.           - mysql
  60.         networks:
  61.           caseor_bridge:
  62.                 ipv4_address: 172.0.10.6
  63.     nacos3:
  64.         container_name: nacos3
  65.         hostname: nacos3
  66.         image: nacos/nacos-server
  67.         environment:            
  68.             - MODE=cluster
  69.             - PREFER_HOST_MODE=hostname
  70.             - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
  71.             - SPRING_DATASOURCE_PLATFORM=mysql
  72.             - MYSQL_SERVICE_HOST=172.0.10.3
  73.             - MYSQL_SERVICE_PORT=3306
  74.             - MYSQL_SERVICE_USER=root
  75.             - MYSQL_SERVICE_PASSWORD=123456
  76.             - MYSQL_SERVICE_DB_NAME=nacos
  77.             - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true  
  78.             - JVM_XMS=128m
  79.             - JVM_XMX=128m
  80.             - JVM_XMN=128m
  81.         volumes:
  82.             - ./nacos/cluster-logs/nacos3:/home/nacos/logs
  83.             - ./nacos/init.d:/home/nacos/init.d
  84.         ports:
  85.             - 8848:8848
  86.             - 7848:7848     
  87.             - 9848:9848
  88.             - 9849:9849
  89.         depends_on:
  90.           - mysql
  91.         networks:
  92.           caseor_bridge:
  93.                 ipv4_address: 172.0.10.7
复制代码
具体配置可以参考官网
查看nacos 控制台 http://127.0.0.1:8848/nacos/http://127.0.0.1:8849/nacos/http://127.0.0.1:8850/nacos/

 可以看到集群已经搭建完成了
在.net core中使用nacos
https://github.com/nacos-group/nacos-sdk-csharp
  1. nacos-sdk-csharp.AspNetCore
  2. nacos-sdk-csharp.Extensions.Configuration
复制代码
在appsettings.json中新增Nacos配置
  1.   "Nacos": {
  2.     "ServerAddresses": [ "http://192.168.110.39:8848" ],
  3.     //命名空间GUID,public默认没有
  4.     "Namespace": "779857e5-b517-437c-9026-f04c98d4bac1",
  5.     // 配置中心
  6.     "Listeners": [
  7.       {
  8.         "Group": "DEFAULT_GROUP",
  9.         "DataId": "appsettings.json",
  10.         "Optional": false
  11.       }
  12.     ],
  13.     // 服务发现
  14.     "ServiceName": "saas-system",
  15.     "GroupName": "DEFAULT_GROUP"
  16.   }
复制代码

 在program下新增
  1. //读取nacos配置文件
  2. builder.Host.UseNacosConfig("Nacos");
  3. //注册服务到nacos
  4. builder.Services.AddNacosAspNet(builder.Configuration, "Nacos");
复制代码
在program下继续读取appsettings的配置信息,首选需要在nacos上的appsettings配置信息

 

 启动该服务
  1. dotnet run --urls=http://*:8083
  2. dotnet run --urls=http://*:8084
  3. dotnet run --urls=http://*:8085
复制代码


 

 在其他服务中调用当前服务接口
  1. [HttpGet("nacos.test")]
  2. public async Task<IActionResult> TestNacos()
  3. {
  4.      var instance= await _namingService.SelectOneHealthyInstance("saas-system", "DEFAULT_GROUP");
  5.      var host = $"{instance.Ip}:{instance.Port}";
  6.      var baseUrl = instance.Metadata.TryGetValue("secure", out _)
  7.          ? $"https://{host}"
  8.          : $"http://{host}";
  9.      var url = $"{baseUrl}/system/tenant.package.query.list";
  10.      using HttpClient client = new();
  11.      var result = await client.GetAsync(url);
  12.      return Ok(await result.Content.ReadAsStringAsync());
  13. }
复制代码

 

来源:https://www.cnblogs.com/AsprosL/p/18021312
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具