服务发现—Asp.net core结合nacos实现服务发现

服务发现—Asp.net core结合nacos实现服务发现

  • Asp.net core通过api方式实现nacos服务注册
  • Nacos 服务发现

Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,.net 版本客户端在github上已经有开源sdk实现:nacos-sdk-csharp 。

Asp.net core通过api方式实现nacos服务注册

  1. 通过nacos管理平台创建名称空间
    命名空间:
    用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
    服务发现—Asp.net core结合nacos实现服务发现_第1张图片

  2. 创建一个web api应用
    通过vs创建一个.net core Api项目

  3. 安装nacos-sdk-csharp相关包

    Install-package nacos-sdk-csharp.AspNetCore
    

    服务发现—Asp.net core结合nacos实现服务发现_第2张图片
    值得一提的是,.net版本的 nacos sdk 曾经有过 nacos-sdk-csharp-unofficial 版本,不过现在官方已经放弃维护,所以使用的时候请注意安装最新的包,nacos-sdk-csharp能够兼容1.x和2.x版本。

  4. 配置文件中增加nacos节点

    {
    	"nacos": {
        "EndPoint": "",
        "ServerAddresses": [ "http://192.168.137.200:8848" ], // nacos服务端地址
        "DefaultTimeOut": 15000,
        "Namespace": "yyl", // 服务注册到的命名空间id
        "ListenInterval": 1000,
        "ServiceName": "App1", //服务名称
        "GroupName": "DEFAULT_GROUP", //服务分组
        "ClusterName": "DEFAULT",
        "Ip": "",
        "PreferredNetworks": "", // select an IP that matches the prefix as the service registration IP
        "Port": 0,
        "Weight": 100, // 权重
        "RegisterEnabled": true,
        "InstanceEnabled": true,
        "Ephemeral": true,
        "Secure": false,
        "AccessKey": "",
        "SecretKey": "",
        "UserName": "nacos", 
        "Password": "nacos",
        "ConfigUseRpc": false, // 为true时,通过 gRPC 去和 nacos server 交互,nacos 2.x版本要设
    置为true
        "NamingUseRpc": false, // 为true时,通过 gRPC 去和 nacos server 交互, nacos 2.x版本要设
    置为true
        "NamingLoadCacheAtStart": "",
        "LBStrategy": "WeightRandom", //  WeightRandom WeightRoundRobin
        "Metadata": {
          "aa": "bb",
          "cc": "dd"
        }
      }
    }
    

    有一点需要提及,上篇nacos部署中讲到nacos存在未授权漏洞,但是在高版本已经修复,可以通过配置文件启用授权认证,而一旦启用授权认证,nacos节点的配置中的UserName和Password必须填写,否则所有对nacos server的openApi的调用都会返回403,服务注册失败。

    对于服务发现的负载均衡,nacos-sdk-csharp中提供了加权随机和加权轮询两种方式,配置中的LBStrategy和Weight与此有关,我们无需再进行封装。

  5. 在startup类中进行注入

    public void ConfigureServices(IServiceCollection services)
    {
    	services.AddNacosAspNet(Configuration, "nacos");
    }
    

    之后启动应用,通过nacos管理平台即可看到注册上去的服务。
    服务发现—Asp.net core结合nacos实现服务发现_第3张图片
    通过详情,可看到服务元信息,也可在管理平台上修改服务权重或者将服务下线。当然,这里的修改在服务重启之后会失效。
    服务发现—Asp.net core结合nacos实现服务发现_第4张图片

Nacos 服务发现

nacos-sdk-csharp中提供了服务发现的实现,我们直接注入INacosNamingService即可使用。

 [ApiController]
 [Route("[Controller]")]
 public class ServiceController : Controller
 {
     private readonly INacosNamingService _nacosNamingService;
     public ServiceController(INacosNamingService nacosNamingService)
     {
         _nacosNamingService = nacosNamingService;
     }

     [HttpGet]
     public async Task<string> Get()
     {
         var instance = await _nacosNamingService.SelectOneHealthyInstance("App1", "DEFAULT_GROUP");
         var host = $"{instance.Ip}:{instance.Port}";

         var baseUrl = instance.Metadata.TryGetValue("secure", out _)
             ? $"https://{host}"
             : $"http://{host}";

         return baseUrl;
     }
 }

调用api,可以看到:
服务发现—Asp.net core结合nacos实现服务发现_第5张图片
在此基础上,就可以拼接上具体的api地址,对其他服务进行调用。

在生产环境使用中,可以再对这里进行简化,构建声明式REST客户端帮助我们简化服务间的api调用的过程,类似Java Feign Client。

微服务系列文章:
上一篇:服务发现—nacos部署
下一篇:服务发现—Consul部署

你可能感兴趣的:(微服务架构学习与实践总结,微服务,.net,服务发现)