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


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

    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

        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中使用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"
      }
    复制代码

     在program下新增

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

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

     

     启动该服务

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

     

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

    复制代码
     [HttpGet("nacos.test")]
     public async Task 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());
    
     }
    复制代码

     

  • 相关阅读:
    Kamiya丨Kamiya艾美捷人α1-抗糜蛋白酶ELISA说明书
    SpringSecurity初识及使用
    Python分享之多进程初步 (multiprocessing包)
    好物周刊#9:AI 学习必备资料
    Ubuntu安装深度学习环境相关(yolov8-python部署)
    原生js实现上拉加载和下拉刷新功能
    Go test之理
    CentOS7安装jdk
    Linux安装rabbitMq(亲测可用)解决只能本地访问的问题
    编程内功心法「公钥密码学系列」基础介绍公钥证书与私钥标准(1)
  • 原文地址:https://www.cnblogs.com/AsprosL/p/18021312