服务发现—Asp.net core结合nacos实现服务发现
Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,.net 版本客户端在github上已经有开源sdk实现:nacos-sdk-csharp 。
Asp.net core通过api方式实现nacos服务注册
-
通过nacos管理平台创建名称空间
命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
-
创建一个web api应用
通过vs创建一个.net core Api项目 -
安装nacos-sdk-csharp相关包
Install-package nacos-sdk-csharp.AspNetCore
值得一提的是,.net版本的 nacos sdk 曾经有过 nacos-sdk-csharp-unofficial 版本,不过现在官方已经放弃维护,所以使用的时候请注意安装最新的包,nacos-sdk-csharp能够兼容1.x和2.x版本。 -
配置文件中增加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与此有关,我们无需再进行封装。
-
在startup类中进行注入
public void ConfigureServices(IServiceCollection services) { services.AddNacosAspNet(Configuration, "nacos"); }
之后启动应用,通过nacos管理平台即可看到注册上去的服务。
通过详情,可看到服务元信息,也可在管理平台上修改服务权重或者将服务下线。当然,这里的修改在服务重启之后会失效。
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,可以看到:
在此基础上,就可以拼接上具体的api地址,对其他服务进行调用。
在生产环境使用中,可以再对这里进行简化,构建声明式REST客户端帮助我们简化服务间的api调用的过程,类似Java Feign Client。
微服务系列文章:
上一篇:服务发现—nacos部署
下一篇:服务发现—Consul部署