.net core微服务之服务发现

  • .net core微服务之服务发现已关闭评论
  • 55 次浏览
  • A+
所属分类:.NET技术
摘要

一:nacos  https://nacos.io/docs/latest/what-is-nacos/  https://github.com/alibaba/nacos二:consul

一: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

.net core微服务之服务发现.net core微服务之服务发现

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_app

View Code

使用docker启动mysql

.net core微服务之服务发现.net core微服务之服务发现

    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

View Code

在数据库创建nacos数据库

https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql

准备三个nacos

    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

具体配置可以参考官网

查看nacos 控制台 http://127.0.0.1:8848/nacos/http://127.0.0.1:8849/nacos/http://127.0.0.1:8850/nacos/

.net core微服务之服务发现

 可以看到集群已经搭建完成了

.net core中使用nacos

https://github.com/nacos-group/nacos-sdk-csharp

nacos-sdk-csharp.AspNetCore nacos-sdk-csharp.Extensions.Configuration

在appsettings.json中新增Nacos配置

  "Nacos": {     "ServerAddresses": [ "http://192.168.110.39:8848" ],     //命名空间GUID,public默认没有     "Namespace": "779857e5-b517-437c-9026-f04c98d4bac1",     // 配置中心     "Listeners": [       {         "Group": "DEFAULT_GROUP",         "DataId": "appsettings.json",         "Optional": false       }     ],     // 服务发现     "ServiceName": "saas-system",     "GroupName": "DEFAULT_GROUP"   }

.net core微服务之服务发现

 在program下新增

//读取nacos配置文件 builder.Host.UseNacosConfig("Nacos"); //注册服务到nacos builder.Services.AddNacosAspNet(builder.Configuration, "Nacos");

在program下继续读取appsettings的配置信息,首选需要在nacos上的appsettings配置信息

.net core微服务之服务发现

 

.net core微服务之服务发现

 启动该服务

dotnet run --urls=http://*:8083 dotnet run --urls=http://*:8084 dotnet run --urls=http://*:8085

.net core微服务之服务发现

.net core微服务之服务发现

 

.net core微服务之服务发现

 在其他服务中调用当前服务接口

 [HttpGet("nacos.test")]  public async Task<IActionResult> TestNacos()  {      var instance= await _namingService.SelectOneHealthyInstance("saas-system", "DEFAULT_GROUP");      var host = $"{instance.Ip}:{instance.Port}";       var baseUrl = instance.Metadata.TryGetValue("secure", out _)          ? $"https://{host}"          : $"http://{host}";       var url = $"{baseUrl}/system/tenant.package.query.list";       using HttpClient client = new();      var result = await client.GetAsync(url);      return Ok(await result.Content.ReadAsStringAsync());   }

.net core微服务之服务发现