热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于.NETCore框架nacos的简单应用

什么是Nacos?服务(Service)是Nacos世界的一等公民。Nacos支持

么是Nacos?

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:Nacos 的关键特性包括:

  • 服务发现和服务健康监测

  • 动态配置服务

  • 动态 DNS 服务

  • 服务及其元数据管理

具体的请参考官网地址: https://nacos.io/zh-cn/index.html

Nacos 2.0.0兼容性/环境准备

当前推荐的稳定版本为2.0.3,nacos有多种部署方式,这里为了测试只要单机版就行了。

Nacos2.0版本相比1.X增加了grpc的通信方式,因此需要增加2个端口。新增端口是配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口与主端口的偏移量描述
98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC请求服务端端口,用于服务间同步等

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。 客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。

因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。

兼容性

Nacos2.0的服务端完全兼容1.X客户端。Nacos2.0客户端由于使用了gRPC,无法兼容Nacos1.X服务端,请勿使用2.0以上版本客户端连接Nacos1.X服务端。

下载编译后压缩包方式

您可以从 https://github.com/alibaba/nacos/releases 下载最新稳定版本 nacos-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

修改配置文件

  • 打开conf/application.properties配置文件;

  • 修改mysql连接字符串,如下:

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://ip:3306/nacos_config?characterEncoding=utf8&cOnnectTimeout=1000&socketTimeout=3000&autoRecOnnect=true&useUnicode=true&useSSL=false&serverTimezOne=UTC
db.user.0=root
db.password.0=123456

  • nacos-mysql.sql用初始化nacos_config数据库

启动服务

Windows

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

登入控制台

打开http://localhost:8848/nacos,默认用户和密码都是nacos。  这样简单的单机环境就搭建好了。

创建命名空间

基于ASP.NET Core的应用

随着 nacos 2.0.3 正式发布,我这边也用nacos-sdk-csharp 1.1.1版本体验下。

安装依赖

新版已经移除了后缀unofficial。

dotnet add package nacos-sdk-csharp
dotnet add package nacos-sdk-csharp.AspNetCore
dotnet add package nacos-sdk-csharp.Extensions.Configuration

服务注册

  • appseting.json增加配置

"nacos": {
"EndPoint": "",
"ServerAddresses": [ "http://localhost:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "10525b8b-6f88-4c8b-9d5e-d518d8205f46",
"ListenInterval": 1000,
"ServiceName": "App1",
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"Ip": "",
"PreferredNetworks": "",
"Port": 5000,
"Weight": 100,
"RegisterEnabled": true,
"InstanceEnabled": true,
"Ephemeral": true,
"Secure": false,
"AccessKey": "",
"SecretKey": "",
"UserName": "",
"Password": "",
"ConfigUseRpc": true,
"NamingUseRpc": true,
"NamingLoadCacheAtStart": "",
"Metadata": {
"version": "1.0.0",
"updatetime": "2020/02/01"
}
},

- Namespace:我这里是自定义了一个cs,请参考前一个章节,必须用id,不能用名称。
- ConfigUseRpc/NamingUseRpc:是否使用gRPC 协议和服务端对接。
- IP/Port: 是APP对外暴露的IP和端口
- ServerAddresses:nacos服务地址
- Metadata:元数据,可以用来控制版本信息等

  • Stautup.cs中增加以下代码

services.AddNacosAspNet(Configuration);

运行APP

  • 运行之后我们可以看到这个命名空间下有个服务名为App1。 

  • 再启动一个一模一样的APP,只不过端口变了,集群里可以看到两个实例 

服务发现

//获取单个实例
var instance = _svc.SelectOneHealthyInstance("App1", "DEFAULT_GROUP").GetAwaiter().GetResult();

上面获取单实例,每次获取到的可能不一样,取决于nacos负载均衡机制。

//获取所有健康的实例
var instances=_svc.SelectInstances("App1", true).GetAwaiter().GetResult();

此种方式可以获取出所有健康的实例。

测试代码

[HttpGet]
public ActionResult<string> Get()
{
//获取实例
var instance = _svc.SelectOneHealthyInstance("App1", "DEFAULT_GROUP").GetAwaiter().GetResult();
var instances=_svc.SelectInstances("App1", true).GetAwaiter().GetResult();

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

if (string.IsNullOrWhiteSpace(baseUrl))
{
return "empty";
}

var url = $"{baseUrl}/api/user";

using (HttpClient client = new HttpClient())
{
var result = client.GetAsync(url).GetAwaiter().GetResult();
return result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
}
}

结果符合上面的预期。

配置中心

  • 新增配置项,把原来的配置全部移入nacos配置中心中。

{
"AdminSafeList": "127.0.0.1;192.168.10.134",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"nacos": {
"EndPoint": "",
"ServerAddresses": [ "http://localhost:8848" ],
"DefaultTimeOut": 15000,
"Namespace": "10525b8b-6f88-4c8b-9d5e-d518d8205f46",
"ListenInterval": 1000,
"ServiceName": "App1",
"GroupName": "DEFAULT_GROUP",
"ClusterName": "DEFAULT",
"Ip": "",
"PreferredNetworks": "",
"Port": 5000,
"Weight": 100,
"RegisterEnabled": true,
"InstanceEnabled": true,
"Ephemeral": true,
"Secure": false,
"AccessKey": "",
"SecretKey": "",
"UserName": "nacos",
"Password": "nacos",
"ConfigUseRpc": true,
"NamingUseRpc": true,
"NamingLoadCacheAtStart": "",
"LBStrategy": "WeightRandom", WeightRandom WeightRoundRobin
"Metadata": {
"aa": "bb",
"cc": "dd"
}
},
"AllowedHosts": "*",
"Urls": "http://*:5000",
"ConnectionStrings": {
"Default": "Server=127.0.0.1;Port=3306;Database=demo;User Id=root;Password=123456;"
},
"version": "测试version",
"AppSettings": {
"Str": "val",
"num": 1,
"arr": [1, 2, 3],
"subobj": {
"a": "b"
}
}
}

  • 修改应用程序

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
var c = builder.Build();
builder.AddNacosV2Configuration(c.GetSection("NacosConfig"));
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
});
}

  • 修改appsettings.json

"NacosConfig": {
"Listeners": [
{
"Optional": false,
"DataId": "common",
"Group": "DEFAULT_GROUP"
}
],
"Tenant": "10525b8b-6f88-4c8b-9d5e-d518d8205f46",
"ServerAddresses": [ "http://localhost:8848/" ],
"UserName": "",
"Password": "",
"AccessKey": "",
"SecretKey": "",
"EndPoint": ""
}

这里的意思是,这个应用需要监听commo配置项的变化,Optional 设置成 false,表示这个配置项不是可选的,是必须的,少了它程序就会出错。

  • 如果使用 Option 的方式来读取配置的话,还需要在 Startup 里面进行绑定。

services.Configure(Configuration.GetSection("AppSettings"));

  • 测试接口用来查询配置

[Route("api/[controller]")]
[ApiController]
public class ConfigController : ControllerBase
{
private readonly ILogger _logger;
private readonly IConfiguration _configuration;
private readonly AppSettings _settings;
private readonly AppSettings _sSettings;
private readonly AppSettings _mSettings;
public ConfigController(ILogger logger, IConfiguration configuration,
IOptions options,
IOptionsSnapshot sOptions,
IOptionsMonitor _mOptions
)

{
_logger = logger;
_cOnfiguration= configuration;
_settings =options.Value;
_sSettings = sOptions.Value;
_mSettings = _mOptions.CurrentValue;
}


[HttpGet]
public string Get()
{
string id = Guid.NewGuid().ToString("N");

_logger.LogInformation($"==========={_configuration["all"]}======");

_logger.LogInformation($"============== begin {id} =====================");

var cOnn= _configuration.GetConnectionString("Default");
_logger.LogInformation($"{id} cOnn= {conn}");

var version = _configuration["version"];
_logger.LogInformation($"{id} version = {version}");

var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_settings);
_logger.LogInformation($"{id} IOptiOns= {str1}");

var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_sSettings);
_logger.LogInformation($"{id} IOptiOnsSnapshot= {str2}");

var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_mSettings);
_logger.LogInformation($"{id} IOptiOnsMonitor= {str3}");

_logger.LogInformation($"===============================================");

return "ok";
}
}

  • 测试结果 



微信识别二维码关注




推荐阅读
  • 回顾两年前春节期间的一个个人项目,该项目原本计划参加竞赛,但最终作为练习项目完成。独自完成了从编码到UI设计的全部工作,尽管代码量不大,但仍有一定的参考价值。本文将详细介绍该项目的背景、功能及技术实现。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
author-avatar
该改改小心眼_222
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有