Asp.Net Core Ocelot Consul 微服务

做一个简单的微服务架构如下图:

这个图表示的是一个网关代理Consul的两个服务,consul每个服务注册集群

安装 Consul的服务,这里安装单机版的,集群版配置最低要求(3个Consul server)的需要三台虚拟机,穷
这是下载地址 Consul 我这里部署的是CentOS7 ip是:192.168.31.140 记得关闭防火墙

yum instarll wget -y
yum instarll unzip -y
wget  https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
unzip consul_1.7.2_linux_amd64.zip
mv consul /usr/local/bin/
consul -v 查看图一代表安装成功了
nohup consul agent -server -ui -bootstrap-expect=1 -data-dir=/tmp/consul  -node=consul-1 -client=0.0.0.0   -datacenter=dc1 & 后台启动会生成一个nohup.out的日子文件
curl http://127.0.0.1:8500/ui/dc1/services  访问 如下图二代表服务启动OK
consul可以通过配置文件注册服务,我这里用的是api代码注册
配置文件注册vi /etc/consul/services_config.json创建配置文件重启即可

图一

图二

接下来写ServiceUser的服务,选择asp.net core Api模板创建项目,安装Consul包

添加一个健康检查的API直接返回OK

再添加一个返回用户数据的API

在写一个服务注册的方法在Startup.cs里,ip和port及id我是从命令行获取的其他配置均写在配置文件里

       private static void ServiceRegister(IConfiguration configuration){ConsulClient client = new ConsulClient(new Action<ConsulClientConfiguration>(t => {t.Address = new Uri(configuration["consul:servicesAddr"]);//这是Consul的服务地址192.168.31.140t.Datacenter = configuration["consul:datacenter"];//储存名}));//注册一个实例var result = client.Agent.ServiceRegister(new AgentServiceRegistration(){Address = configuration["ip"], //注册服务的IPID = $"{configuration["consul:serviceName"]}{configuration["id"]}",//服务id唯一的Name = configuration["consul:serviceName"],//服务名Port = Convert.ToInt32(configuration["port"]),//端口Tags = null,Check = new AgentServiceCheck(){HTTP = $"http://{configuration["ip"]}:{configuration["port"]}{configuration["consul:healthCheck"]}",//健康检查的API地址Interval = new TimeSpan(0, 0, 10),//间隔多少检查一次DeregisterCriticalServiceAfter = new TimeSpan(0, 1, 0) //多久注销不健康的服务}}).Result;}

获取命令行参数 写在main 方法里如下图

new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddCommandLine(args).Build();

编写配置文件

  "consul": {"servicesAddr": "http://192.168.31.140:8500","datacenter": "dr1","serviceName": "ServiceCommodity","healthCheck": "/api/Health"}

ServiceCommodity和ServiceUser一样

接下来启动实例注册服务,我这里用端口区分不同的实例

dotnet ServiceCommodity.dll --urls http://*:5000  --environment Development --ip 192.168.31.137 --port 5000 --id 1
dotnet ServiceCommodity.dll --urls http://*:5001  --environment Development --ip 192.168.31.137 --port 5001 --id 2
dotnet ServiceCommodity.dll --urls http://*:5002  --environment Development --ip 192.168.31.137 --port 5002 --id 3
dotnet ServiceUser.dll --urls http://*:6000  --environment Development --ip 192.168.31.137 --port 6000 --id 1
dotnet ServiceUser.dll --urls http://*:6001  --environment Development --ip 192.168.31.137 --port 6001 --id 2
dotnet ServiceUser.dll --urls http://*:6002  --environment Development --ip 192.168.31.137 --port 6002 --id 3


接下来注册Ocelot网关,微服务是离不开网关的,现在可能看不出网关的效果,Consul搭建成集群就能看出效果了
创建一个空的web项目安装如下两个包

在Startup.cs 里注册

创建ocelot.json配置文件

{"ReRoutes": [{"DownstreamPathTemplate": "/api/{controller}",//你的api路径"DownstreamScheme": "http","UpstreamPathTemplate": "/dust/{controller}",//你映射的路径"UpstreamHttpMethod": [ "get", "post" ],//请求方法"ServiceName": "ServiceCommodity",//你的服务名称"LoadBalancerOptions": {"Type": "LeastConnection"//ocelot提供了几种均衡方法,这里用的是最小连接}},{"DownstreamPathTemplate": "/api/{controller}","DownstreamScheme": "http","UpstreamPathTemplate": "/dust1/{controller}","UpstreamHttpMethod": [ "get", "post" ],"ServiceName": "ServiceUser","LoadBalancerOptions": {"Type": "LeastConnection"}}],"GlobalConfiguration": {"ServiceDiscoveryProvider": {"Host": "192.168.31.140",//你的Consul的ip地址"Port": 8500,//你的Consul的端口"ConfigurationKey": "Consul"//指定Consul,ocelot提供了几种,可以去官网看看}}
}

加载配置文件

  .ConfigureAppConfiguration((hostingContext, config) =>{config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath).AddJsonFile("appsettings.json", true, true).AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true).AddJsonFile("ocelot.json").AddEnvironmentVariables();})

启动 dotnet GateWayOcelot.dll --urls http://*:7000

最后应用请求网关

  string[] userAry = null;string[] commodityAry = null;using (HttpClient httpClient = new HttpClient()){HttpResponseMessage httpResponseMessage  = httpClient.GetAsync("http://192.168.31.137:7000/dust1/user").Result;userAry = JsonConvert.DeserializeObject<string[]>(httpResponseMessage.Content.ReadAsStringAsync().Result);}using (HttpClient httpClient = new HttpClient()){HttpResponseMessage httpResponseMessage = httpClient.GetAsync("http://192.168.31.137:7000/dust/commodity").Result;commodityAry = JsonConvert.DeserializeObject<string[]>(httpResponseMessage.Content.ReadAsStringAsync().Result);}this.ViewBag.msgText = $"{userAry[0]}和{userAry[1]}讨论项目,去烧烤摊点了{commodityAry[0]},{commodityAry[1]},{commodityAry[2]},第二天凌晨5点两个人支起了早餐摊!";

到此一个简单的微服务OK了


Demo下载地址:https://github.com/Xiao-Dust/MicroService

往期精彩回顾

  • .netcore consul实现服务注册与发现(一)单机部署

  • .netcore consul实现服务注册与发现(二)集群完整版

  • 基于Docker的Consul服务发现集群搭建

  • Ocelot简易教程(五)之集成IdentityServer认证以及授权


点击【在看】+转发【朋友圈】对我最大的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 104二叉树的最大深度-简单

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3/ \9 20/ \15 7返回它的最大深度 3 。 代码如下: …

以下c语言程序片段用于估测cpu的cache参数,阿里巴巴笔试题

阿里巴巴笔试题1.平均速度最快的排序算法是______。Shell排序快速排序冒泡排序插入排序2014-03-29 18:36:022.某服务进程的QPS(没秒处理的请求个数)较低&#xff0c;在空闲时间RT(响应时间)比较合理。在压力下CPU占用率20%左右。那么可能存在的问题是______。该进程的某个处理过…

.Neter们,你真的应该了解下EFCore3.x

本期导读&#xff1a;技术文&#xff0c;带你了解关于EntityFrameworkCore3.x的那些事&#xff0c;本文共1493个字&#xff0c;阅读大约需要3分钟。文末福利不要错过哦&#xff01;是的各位.Neter&#xff0c;不用怀疑&#xff0c;使用O/RM的开发者越来越多了&#xff0c;从风起…

LeetCode 111二叉树的最小深度-简单

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输…

山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题

高三计算机专业C语言测试题(1)学号姓名&#xff1a;得分&#xff1a;一、选择题40’1、下列选项是C语言保留字的一项是()A DOB gosubC strutD CHAR2、下列选项中可以作为C语言用户标识符的一组是()A void , define, wordB a3_b3, _123, IFC for, _abc , caseD 2a, do, sizeof3、…

istio回归「单体应用」对我们的启发

大家好&#xff0c;我是Z哥。这次分享给大家的是一篇与技术相关的文章&#xff0c;但是我想表达的核心观点并不仅限于技术范围。我们中国有句古话&#xff0c;分久必合&#xff0c;合久必分。很多事物的发展都逃不开这个规律。如今&#xff0c;这件事也正在分布式、微服务概念大…

LeetCode 110平衡二叉树-简单

给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;t…

c语言中如何使用面向对象编程,如何使用C语言的面向对象

我们都知道&#xff0c;C才是面向对象的语言&#xff0c;但是C语言是否能使用面向对象的功能&#xff1f;(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候&#xff0c;我…

c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt

C语言复习和VC6.0开发环境推荐* * * * * * * * * F10-单步调试 F11-进入函数内部调试 ShiftF11-从函数内部回到调用函数(如main) CtrlF10-运行到光标处. ShiftF5-终止调试过程. * 是一个重要概念&#xff0c;可以有效地表示复杂的数据结构&#xff1b; 能动态分配内存&#xff…

LeetCode 112路径总和-简单

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum &#xff0c;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,…

ASP.NET MVC升级到ASP.NET Core MVC踩坑小结

写在前面ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架&#xff0c;它的优势不必多说&#xff0c;因为已经说得太多了。当然&#xff0c;现在依然有着数量庞大的系统运行于.NET Framework上&#xff0c;由于有大量的Break Changes&#xff0c;很多项目项目团队…

用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...

南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx 南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-11、D 2、B 3、C 4、A 5、D 一、单选题共40题&#xff0c;80分1、以下对一维整型数组 a 的正确说明是 Aint a10 ;Bint…

LeetCode 563二叉树的坡度-简单

给定一个二叉树&#xff0c;计算 整个树 的坡度 。 一个树的 节点的坡度 定义即为&#xff0c;该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话&#xff0c;左子树的节点之和为 0 &#xff1b;没有右子树的话也是一样。空结点的坡度是 0 。 整个树…

c语言简单快速排序原理,C语言之简单快速排序

快速排序是一种对冒泡排序的改进&#xff0c;运用了二分的思想&#xff0c;提高了效率&#xff0c;元素的交换是跳跃式的&#xff0c;更适合用在数组这样方便随机读取的顺序结构&#xff0c;平均时间复杂度NlogN。#include #include /*快速排序*/void input(int*,int);void out…

LeetCode 501二叉搜索树中的众数-简单

给定一个有相同值的二叉搜索树&#xff08;BST&#xff09;&#xff0c;找出 BST 中的所有众数&#xff08;出现频率最高的元素&#xff09;。 假定 BST 有如下定义&#xff1a; 结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值…

CIO/CTO都应该掌握和了解的EA(企业架构)

我们已进入数字化技术推动的第四次工业革命&#xff0c;是以工业互联网建设为标志。单纯从IT的视角管理信息化系统让许多企业深陷管理困境&#xff0c;解决问题也是按下葫芦浮起瓢。实际上&#xff0c;IT的服务对象是企业的战略、组织、管理、流程等一系列的要素&#xff0c;因…

c语言火车票管理系统源代码2000行,C语言教务管理系统[2000行代码].doc

专业资料精心整理C语言教务管理系统一、程序结构图二、程序运行截图1. 个人信息简介2. 修改颜色3. 注册界面4. 信息保存至文件5. 登录界面6. 管理员录入信息7. 学生信息录入8. 学生成绩录入9. 学生课程表录入10. 学生信息查询界面11学生信息查询12. 学生成绩查询13. 学生课表查…

LeetCode 530二叉搜索树的最小绝对值差-简单

给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 输入&#xff1a; 1\3/2输出&#xff1a; 1 解释&#xff1a; 最小绝对差为 1&#xff0c;其中 2 和 1 的差的绝对值为 1&#xff08;或者 2 和 3&#xf…

扛并发主力军,引入应用层缓存

1.背景缓存的使用一定是今后开发中100%会用到的技术&#xff0c;尤其是Redis相关的问题&#xff0c;如果面试官不问我我几个缓存相关的问题&#xff0c;那我觉得我可能是去了个假的互联网公司。这里考虑到有些初学者刚刚出校园或者自学中&#xff0c;准许我多费口舌介绍下关于缓…