Adnc.Infr.Consul 主要提供服务自动注册/发现以及获取配置。

项目结构

Configuration

配置中心相关共功能,主要有两个关键类

1、ConsulConfigurationProvider.cs,继承自Microsoft.Extensions.Configuration.ConfigurationProvider。

2、ConsulConfigurationSource.cs 实现了Microsoft.Extensions.Configuration.IConfigurationSource。

有了这个两个类,就相当于新增了一个consul配置源

我们在启动项目中的program.cs文件中把consul配置源添加进去,这样我们在configuration中就可以读取到配置了。

ConsulConfigurationProvider.cs 文件中ListenToConfigurationChanges方法负责监听consul配置的变化,如果有更新,就会更新configuration。

实现原理,当你通过url(http://你的consul地址/v1/kv/配置节点)获取到配置,配置中有一个index字段,如果你把index字段值加到url后面

(http://你的consul地址/v1/kv/配置节点?recurse=true&index=47837),HTTP 请求会一直阻塞,直到下一次配置变更(或 HttpClient 超时)

        public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(configuration =>
{
configuration.AddCommandLine(args);
})
.ConfigureAppConfiguration((context, cb) =>
{
var env = context.HostingEnvironment;
if (env.IsProduction() || env.IsStaging())
{
var configuration = cb.Build();
//从consul配置中心读取配置
var consulOption = configuration.GetSection("Consul").Get<ConsulOption>();
cb.AddConsul(new[] { consulOption.ConsulUrl }, consulOption.ConsulKeyPath);
}
cb.AddJsonFile("autofac.json", optional: true);
})
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}) }

Registration

提供服务自动注册,该文件夹只有一个文件RegistrationExtension.cs

RegistrationExtension.cs 是一个IApplicationBuilder扩展类。

    public static class RegistrationExtension
{
public static void RegisterToConsul(this IApplicationBuilder app, ConsulOption consulOption)
{
//业务代码
}
}
在startup.cs文件中的Configure方法里最后调用,这样就可以把服务启动时注册到consul了。
app.RegisterToConsul(Configuration.GetSection("Consul").Get<ConsulOption>());
Consul 节点配置如下:
 "Consul": {
//Consul Client 地址
"ConsulUrl": "http://127.0.0.1:8550",
//Key路径
"ConsulKeyPath": "adnc/test/sys/appsettings",
//当前服务名称,可以多个实例共享
"ServiceName": "andc-api-sys",
//当前服务地址
"ServiceUrl": "",
//服务tag
"ServerTags": ["urlprefix-/sys"],
//健康检查的地址,当前服务公布出来的一个api接口
"HealthCheckUrl": "sys/health-24b01005-a76a-4b3b-8fb1-5e0f2e9564fb",
//心跳间隔
"HealthCheckIntervalInSecond": 10,
//是否docker部署服务
"IsDocker": true
}

服务注册提供了3种方式

方式1、docker容器方式启动服务自动注册

第一步需要Consul节点的IsDocker配置为true;

第二步启动容器时配置一个环境变量

docker run --name adnc-api-sys-9010 -d -p 9010:80 --env DOCKER_LISTEN_HOSTANDPORT=http://172.16.0.4:9010 adnc-api-sys 

方式2、在Consul节点配置ServiceUrl节点

方式3、在Consul节点不配置ServiceUrl节点,程序会自动获取服务器ip与监听地址。

Consumer

封装了一个静态类用于服务发现,服务发现实现的比较简单,我会继续完善。

var address = await ServiceConsumer.GetServicesAsync("http://172.16.0.4:8560", "andc-api-sys");

基础设施层-Adnc.Infr.Consul的更多相关文章

  1. DDD领域驱动设计之领域基础设施层

    1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 其实这里说的基础设施层只是领域层的一些接口和基类而已,没有其他的如日子工具等代码,仅仅是为了说明领域层的一些基础 ...

  2. DDD~基础设施层~续

    回到目录 在之前写的DDD~基础设施层文章中,提到了UnitOfWork,它里面有一些方法,但经过项目证明,不应该有Save和IsExplicitSubmit,而这个工作单元只起到了数据上下文统一的作 ...

  3. FAQ:仓储实现为什么在基础设施层?

    FAQ:仓储实现为什么在基础设施层? 目录 问答部分参考文章 问答部分返回目录 问: 仓储实现为什么在基础设施层? 答: 领域模型包含三种元素:实体.值对象和服务,这三种元素都可以以某种形式使用仓储, ...

  4. ABP入门教程7 - 基础设施层更新数据库

    点这里进入ABP入门教程目录 设置数据库 在基础设施层(即JD.CRS.EntityFrameworkCore)打开数据库环境设置 JD.CRS.EntityFrameworkCore/EntityF ...

  5. ABP 基础设施层——集成 Entity Framework

    本文翻译自ABP的官方教程<EntityFramework Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/En ...

  6. ABP 基础设施层——集成 NHibernate

    本文翻译自ABP的官方教程<NHibernate Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/NHibern ...

  7. 一个轻量级的.Net Core微服务快速开发的轮子

    前言     Adnc是一个轻量级的.Net Core微服务快速开发框架,同时也可以应用于单体架构系统的开发.框架基于JWT认证授权.集成了一系列微服务配套组件,代码简洁.易上手.学习成本低.开箱即用 ...

  8. Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架

    前言     Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发.     如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...

  9. ABP理论学习之N层架构

    返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...

随机推荐

  1. 老猿学5G扫盲贴:推荐三篇介绍HTTP2协议相关的文章

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 5G中的服务化接口调用都是基于HTTP2协议的,老 ...

  2. 关于Python中中文文本文件使用二进制方式读取后的解码UnicodeDecodeError问题

    最近老猿在进行文件操作的验证测试,发现对于中文文本文件如果使用二进制方式打开,返回的类型是bytes,如果要转换成可读的字符串信息需要进行解码.可是老猿使用decode()或decode(" ...

  3. PHP代码审计分段讲解(4)

    08 SESSION验证绕过 源代码为: <?php ​ $flag = "flag"; ​ session_start(); if (isset ($_GET['passw ...

  4. Python运算符可不只有加减乘除

    数学里面的加减乘除,就是运算符,但是 Python 的运算符更多样,更复杂,分为算术运算符.比较运算符.赋值运算符.位运算符.逻辑运算符.成员运算符.身份运算符.为了更直观的看到运算符的使用,本文采用 ...

  5. STL—— 容器(vector)的数据插入之 insert()

    vector 容器可以使用 vectorName.insert() 方法插入元素,vectorName.insert() 函数一共有4种重载方法: 第一种 insert() 用法:在指定地址插入单个元 ...

  6. C++异常之三 异常处理接口声明

    异常处理接口声明 1 一般为了方便程序员阅读代码,提高程序的可读性,会将函数中的异常类型声明至函数头后方,不用一行一行的找抛出内容: 2 这里要注意一点,这属于C++的标准语法,但在VS中这个操作不被 ...

  7. 傲视Kubernetes(三):Kubernetes中的Pod

    从本文开始,将正式开始Kubernetes的核心内容学习.首先要了解的是Pod,总共大约分为六篇左右,本篇是第一篇,相信学完之后,我们会对Pod有一个整体的理解. 本文内容: 1.什么是Pod 2.P ...

  8. 第一次软件工程与UML的编程作业

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  9. Git的使用上传与下载github

    下载git 下载git工具是第一步 Git的使用上传与下载 创建本地仓库 在选择的文件夹中鼠标右键打开git Bash here ,在命令行输入git init创建该文件夹的本地仓库 将文件夹文件提交 ...

  10. Python高级语法-深浅拷贝-总结(4.2.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 任何可变数据类型都牵扯到深浅拷贝 但是元组,常数等,不可变数据类型,无论浅拷贝,深拷贝都是指向 不管如何嵌套,一旦牵扯到可变数据类型,都会有深浅区别 ...