本文主要记录 CoreApi 的多环境配置以及如何消费在consul中注册的Api 服务

1、创建三个CoreApi

我们在项目中创建三个站点分别为 UserServices “用户服务”,OrderServices “订单服务” 以及 StorehouseServices “库房服务”

  1. 、打开VS2017 创建Core Web 应用程序

  2、选择项目模板

  注意:在选择项目模板的时候有一个支持Https 的选项不使用可以去掉

  

  忘记去掉了也没问题在项目属性调试中也可以去掉 如下图:

  

  3、在创建CoreApi的时候尽量不使用项目模板进行创建因为默认会使用MVC的引擎可以使用空模板进行创建,自行搭建。

2、对CoreApi进行环境的配置

  1、CoreApi的几种环境:开发(Development)占存(Staging)生产(Production)

  项目创建后我们在项目启动文件中有两种环境启动设置如下图

  

  我们可以看到不论是使用IIS启动还是 命令启动时都默认使用开发环境变量“”Development“”。

  在项目创建完成后默认有一个Json的配置文件,我们打开后可以看到一个默认的名为 appsettings.Development.json 的配置文件 如图所示

  

  也就是说项目创建完成后不论使用哪种环境运行都是同一个环境变量“Development” 同样也代表这不论哪种环境运行默认使用的同一份配置文件

  2、新增Production(生产)环境配置文件

2.1、如图所示:

  

  2.2、更改launchSettings.json 中的环境变量的配置信息 如下

  

  3、运行结果 三种运行方式

    3.1、首先使用IIS运行 默认走开发者配置

    

    3.2、在当前目录 下使用dotnet run  运行

    

    我们可以看到配置已经生效了

    (3):在项目的生成bin 目录下使用 dotnet  WebApplication1.dll 运行 结果

    

    可以看到这个时候怎么的配置失效了因为命令行是托管在Kestrel上运行的默认使用的端口就是 5000/5001 这个时候我们需要在增加一个配置来更改默认

    

    配置如下步骤:

    在项目新增的配置文件appsettings.Production.json中 添加 如下

    

    配置 127.0.0.1:代表着localhost 在下面使用的时候需要进行一下转换所以用127.0.0.1 具体配置如下

    在项目Program 中这样去使用

    

    这里不会影响我们的其他运行方式因为运行的环境不同:运行结果如下

    

  4、根据不同的运行环境读取使用不同的配置文件

  上面的有的步骤只是更改了项目启动时的IP端口信息,下面我们配置在项目运行时根据不同的运行环境去读取不同的配置文件

  在Startup 文件写入如下代码

 private IHostingEnvironment env;
/// <summary>
///
/// </summary>
/// <param name="environment"></param>
public Startup(IHostingEnvironment environment)
{
env = environment;
if (env.IsDevelopment())
{
var config = new ConfigurationBuilder()
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.Development.json", true, true) //.AddJsonFile("appsettings.json", true, true) //
.AddEnvironmentVariables()
.Build();
Configuration = config;
}
//生产环境Production运行 命令运行读取的配置信息
if (env.IsProduction())
{
var config = new ConfigurationBuilder()
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.Production.json", true, true)
.AddEnvironmentVariables()
.Build();
Configuration = config;
};
}

  5、项目启动后把服务注册到Consul中

  代码如下

  public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc(); //ServiceID复制
ConsulServicesID = Configuration["ServicesName"]+ Guid.NewGuid();
using (var client = new ConsulClient(ConsulConfig))
{
//注册服务到 Consul
client.Agent.ServiceRegister(new AgentServiceRegistration()
{
ID = ConsulServicesID,//服务编号,不能重复,用 Guid 最简单
Name = Configuration["ServicesName"],//服务的名字
Address = Configuration["SerivceIP"],//我的 ip 地址(可以被其他应用访问的地址,本地测试可以用127.0.0.1,机房环境中一定要写自己的内网 ip 地址)
Port = Convert.ToInt32(Configuration["SerivcePort"]),//我的端口
Check = new AgentServiceCheck
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(),//服务停止多久后反注册
Interval = TimeSpan.FromSeconds(),//健康检查时间间隔,或者称为心跳间隔
HTTP = $"{Configuration["HealthUrl"]}/api/Health",//健康检查地址
Timeout = TimeSpan.FromSeconds()
}
}).Wait();//Consult 客户端的所有方法几乎都是异步方法,但是都没按照规范加上Async 后缀,所以容易误导。记得调用后要 Wait()或者 await }
//程序正常退出的时候从 Consul 注销服务
//要通过方法参数注入 IApplicationLifetime
applicationLifetime.ApplicationStopped.Register(() =>
{
using (var client = new ConsulClient(ConsulConfig))
{
//ServiceDeregister异步方法增加 Wait 等待完成
client.Agent.ServiceDeregister(ConsulServicesID).Wait();
}
});
}

  6、项目中我使用了Swagger 具体配置

Swagger 配置博客 https://www.cnblogs.com/szlblog/p/8068311.html

3、消费consul中的CoreApi的服务

  1、创建项目

  使用什么样的客户端都行,控制台,MVC,WebFrom 都行

  2、具体代码

  这个代码只是用来引路,可以根据自己的喜好去进行封装

  代码如下:

 #region //查看所有consul中被注册的服务
//查看所有consul中被注册的服务
using (var consulClient = new ConsulClient(c => { c.Address = new Uri("http://127.0.0.1:8500"); c.Datacenter = "dc1"; }))
{ var services = consulClient.Agent.Services().Result.Response;
//var ss = services.Values.Where(s => s.Service.Equals("UserServices", StringComparison.OrdinalIgnoreCase));//忽略大小写
foreach (var service in services.Values)
{
Console.WriteLine($"id={service.ID},name={service.Service},ip={service.Address},port={service.Port}");
}
}
#endregion
#region 客户端负载均衡
//客户端负载均衡
using (var consulClient = new ConsulClient(c => c.Address = new Uri("http://127.0.0.1:8500")))
{
var services = consulClient.Agent.Services().Result.Response.Values
.Where(s => s.Service.Equals("UserServices", StringComparison.OrdinalIgnoreCase));
if (!services.Any())
{
Console.WriteLine("找不到服务的实例");
}
else
{
// services.ElementAt(1);//如果环境中有多台服务器注册服务时我们可以使用随机数的方式,使用下标进行随机抽取一台服务进行使用
//集群中也可以轮训,当服务器性能差不多的时候可以轮着来
var service = services.ElementAt(Environment.TickCount % services.Count());
Console.WriteLine($"{service.Address}:{service.Port}");
} }
#endregion #region 调用服务方法 UserServices/api/Values
using (var consulClient = new ConsulClient(c => { c.Address = new Uri("http://127.0.0.1:8500"); c.Datacenter = "dc1"; }))
{
var AllServicesInfor = consulClient.Agent.Services().Result.Response;
//获取第一个实例 把UserServices转换为在Consul中注册的路径 然后进行访问
var UserServices = AllServicesInfor.Values.Where(s => s.Service.Equals("UserServices", StringComparison.OrdinalIgnoreCase)).First();//忽略大小写
using (System.Net.Http.HttpClient http = new HttpClient())
{
using (var HttpContent = new StringContent("", System.Text.Encoding.UTF8, "application/json"))
{
var ss = http.PostAsync($"http://{UserServices.Address}:{UserServices.Port}/api/Values", HttpContent);
string sss = ss.Result.RequestMessage.ToString();
}
}
}
#endregion

项目链接

链接:https://pan.baidu.com/s/1V0YcX1kFJg752icNICTuQQ 密码:1s47

有不足之处 希望大家指出相互学习,

                                     本文原创:转载请注明出处 谢谢!

AspNetCore 多环境配置 以及注册 消费Consul的更多相关文章

  1. Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册

    记录一下搭建 Spring Cloud 过程中踩过的一些坑,测试的东西断断续续已经弄了好多了,一直没有时间整理搭建过程,时间啊~时间~ Spring 版本 Spring Boot:2.0.6.RELE ...

  2. 案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul

    #案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul #项目背景 多套业务系统, 所有节点注册到consul集群,方便统一管理 使用consul的dns功能, 所有节点hostnam ...

  3. RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

    一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启 ...

  4. 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现

    首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...

  5. SpringCloud服务的注册发现--------consul实现服务与发现

    1,consul也可以替代Eureka实现注册和发现的功能,即注册中心. 之前在linux环境通过consul + upsync + nginx 实现nginx 的动态负载均衡 https://www ...

  6. dubbo学习实践(5)之Dubbo-Admin元数据中心配置(zookeeper&Redis&Consul)

    1.Dubbo2.7.8元数据中心配置zookeeper版 前面文章已经写到了dubbo-admin管理平台的docker版配置及dubbo服务注册与调用,这篇文章记录dubbo元数据中心配置 翻开d ...

  7. .NET Core(.NET6)中gRPC注册到Consul

    一.简介 上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的. Consul的安装这里就 ...

  8. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...

  9. 解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置

    asp.net 5是下一代的asp.net,该版本进行了全部重写以适用于跨平台,新新版本中,微软引入了如下工具与命令:DNVM.DNX.DNU. DNVM(.NET Version Manager): ...

随机推荐

  1. java基础常见面试题,这是一篇超长的随笔!!!

    1. Java基础部分....................................................... 4 1.一个".java"源文件中是否可以包括 ...

  2. 新手篇丨Python任意网段Web端口信息探测工具

    你学习Python的目的是什么?是想写爬虫爬取数据(数据.图片等内容),还是想自写自动化的小工具,又或是作为一个新手小白单纯的欣赏这门语言呢? 今天i春秋分享的是一篇关于多线程工具的文章,工具使用效率 ...

  3. 实战经验丨CTF中文件包含的技巧总结

    站在巨人的肩头才会看见更远的世界,这是一篇技术牛人对CTF比赛中文件包含的内容总结,主要是对一些包含点的原理和特征进行归纳分析,并结合实际的例子来讲解如何绕过,全面细致,通俗易懂,掌握这个新技能定会让 ...

  4. 读书笔记:深入理解java虚拟机(二)创建对象的时候需要访问哪几块内存

    @TOC 对象在内存中如何储存 对象访问在java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及到java栈,java堆,方法去三个最重要的内存区域的关联关系,比如下面这段代码: ...

  5. 初探机器学习之使用百度EasyDL定制化模型

    一.Why 定制化模型 一般来说,各大云服务厂商只会提供一些最常见通用的AI服务,针对具体场景的AI应用则需要在云服务厂商提供的服务之上进行定制.例如,通常的图像识别只能做到分析照片的主题内容,而我的 ...

  6. WebWorker 中将已处理好的 VDOM 数据提交主线程渲染 DOM

    上篇文章讲了 WebWorker 的简单用法,其实网上很多类似的文章,我写的也比较垃圾.不会的建议可以网上看比较好点的资料. 这里我会先讲下我的大致思路.然后会贴上一堆不实用的垃圾代码供参考. Web ...

  7. 为什么range不是迭代器?range到底是什么类型?

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

  8. LDA && NCA: 降维与度量学习

    已迁移到我新博客,阅读体验更佳LDA && NCA: 降维与度量学习 代码实现放在我的github上:click me 一.Linear Discriminant Analysis(L ...

  9. MaxCompute 2.0复杂数据类型之array

    1. 含义 类似于Java中的array.有序.可重复. 2. 场景 什么样的数据,适合使用array类型来存储呢?这里列举了几个我在开发中实际用到的场景. 2.1 标签类的数据 为什么说标签类数据适 ...

  10. 简单计算器 安卓 Android 作业

    Android老师布置的课程作业——简单计算器 功能要求实现四则运算,参考界面见下图: 首先给各位老铁提供apk安装包以及项目压缩包,略表诚意~ github地址:https://github.com ...