热门标签 | 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";
}
}

  • 测试结果 



微信识别二维码关注




推荐阅读
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
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社区 版权所有