spring cloud+dotnet core搭建微服务架构:服务发现(二)

前言

上篇文章《手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)》实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这种方式的缺点。那么下面讲如何在spring cloud+dotnet core的应用下进行服务调用。

代码实现

假设一种场景,有一个订单服务,有一个产品服务,其中产品服务是由两个服务节点组成一个集群。需求是订单服务访问产品服务的一个API接口。根据上一章文章的内容创建3个应用程序ServiceOne(端口8010),ServiceTwo(端口8011),ServiceThree(8012)。其中ServiceOne设置应用程序名称为order。ServiceTwo和ServiceThree的应用程序名称为product,做成集群。

ServiceOne.appsettings.json

{"Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Warning"}},"spring": {"application": {"name": "order"}},"eureka": {"client": {"serviceUrl": "http://localhost:5000/eureka/"},"instance": {"port": 8010}}
}

ServiceOne.Controllers.ValuesController.CS

private readonly DiscoveryHttpClientHandler _handler;

private const string ProductUrl = "http://product/api/values";

public ValuesController(IDiscoveryClient client, ILoggerFactory logFactory){_handler = new DiscoveryHttpClientHandler(client); }[HttpGet("product")]
public async Task<string> GoProductAsync(){  
 var client = new HttpClient(_handler, false);  
  return await client.GetStringAsync(ProductUrl); }

ServiceTwo.appsettings.json

{"Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Warning"}},"spring": {"application": {"name": "product"}},"eureka": {"client": {"serviceUrl": "http://localhost:5000/eureka/"},"instance": {"port": 8011}}
}

ServiceTwo.appsettings.json

{"Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Warning"}},"spring": {"application": {"name": "product"}},"eureka": {"client": {"serviceUrl": "http://localhost:5000/eureka/"},"instance": {"port": 8012}}
}

为了展现访问的差异,设置不同的返回值。
ServiceTwo.Controllers.ValuesController.cs

[HttpGet]public string Get(){    return "ServiceTwo";
}

ServiceThree.Controllers.ValuesController.cs

[HttpGet]public string Get(){    return "ServiceThree";
}

同时启动这3个项目,先看看服务中心http://localhost:5000/

这个3个应用程序都已经注册到了服务中心。ServiceOne被注册到ORDER,ServiceTwo和ServiceThree注册到了PRODUCT。
分别访问
http://localhost:8011/api/values 返回ServiceTwo
http://localhost:8012/api/values 返回ServiceThree
证明这两个服务是没有问题的。
再访问http://localhost:8010/api/values/product,
如图所示,分别返回了“ServiceTwo”和“ServiceThree”,多刷新几次,发现结果是来回变动的,这说明服务中心帮我们实现了负载均衡。

我们再做一个测试,断开ServiceTwo这个应该程序。我们继续访问http://localhost:8010/api/values/product,发现一次错误,一次正常返回ServiceThree。30秒以后(可配置)再访问正常返回ServiceThree,同时发现服务中心已经踢掉了端口为8011的应用程序(ServiceTwo)。

后记

通过上面3个实例我们模拟了分布式的调用场景,其中Order访问Product集群的时候,并没有指定具体的地址,而是指定了服务名称(product),服务中心自动分配了地址,并实现了负载均衡。联系实际应用场景,配合docker,我们可以快速的对某个服务进行添加,不再需要维护服务节点。同时某个服务节点挂掉以后,服务中心也会踢出这个服务节点(会有短暂的不可用)。结合CAP理论来说,服务中心满足了AP。
这篇文章讲解了服务之间的调用,我们实际的应用场景,还有各种客户端(IOS,Andriod,Web...)来访问,而服务一般是内网不对外暴露的,所以客户端访问服务的时候就需要有一个专门对外暴露的入口,那么就引入了下篇文章的API网关。

所有代码均上传github。
求推荐,你们的支持是我写作最大的动力,我的QQ群:328438252,交流微服务。

参考资料

java部分

  • spring cloud文档

  • 纯洁大神spring cloud系列

.net部分

  • SteeltoeOSS文档

  • SteeltoeOSS源码


原文地址:http://www.cnblogs.com/longxianghui/p/7576736.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

猿创征文|公众号开发之路——为了研究公众号,我注册了公司

大家好&#xff0c;我是雄雄。 内容先知&#x1f60a;1.前言&#x1f636;2.想法&#x1f913;3.注册及研究&#x1f4aa;4.注册公司现在是北京时间&#xff1a;2022年9月10日23:34&#xff0c;农历八月十五日&#xff0c;2022年的教师节&#xff0c;也是中秋节&#xff0c;祝大…

动态数组(四)

#include<stdio.h>void f(int *q){*q200;}main(){int *p(int *)malloc(sizeof(int));*p10;printf("%d\n",*p);f(p);printf("%d\n",*p);}动态数组应用&#xff1a;&#xff08;记得导入#include<malloc.h>&#xff09; #include<stdio.h>…

Docker 实战笔记

Docker的安装与配置CentOS前提条件目前&#xff0c;CentOS 仅在发行的版本中的内核支持DockerDocker 运行在CentOS 7 上要求系统为64位&#xff0c;系统内核版本在3.10以上。本次测试运行使用的是 centOS 7.2 64位的系统版本。使用代码 uname -r即可查看系统内核版本Docker软件…

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

转载自 JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 现实企业级Java开发中&#xff0c;有时候我们会碰到下面这些问题&#xff1a; OutOfMemoryError&#xff0c;内存不足 内存泄露 线程死锁 锁争用&#xff08;Lock Contention&#xff09; Java进…

jeecg微服务中如何实现机构的概念(当前机构只能查到其子机构)

大家好&#xff0c;我是雄雄。 内容先知前言代码实现前言 以前&#xff0c;我们做的国家平台项目&#xff0c;都是采用现在开源的框架来做的&#xff0c;比如若依&#xff0c;bladex&#xff0c;相比之下&#xff0c;若依用的要稍多点儿。因为那时候刚开始接触vue&#xff0c;…

初学结构体(一)

#include<stdio.h>struct Student{int age;float score;char sex;};main(){struct Student st{25,88,M};printf("%d\n",st.age); struct Student *pst&st;pst->age100;printf("%d\n",st.age);printf("%d",pst->age); }构造结构…

.NET Conf 2017后初尝Xamarin Forms 3.0@Linux

对很多.NET粉&#xff0c;.NET Conf 2017的东西估计提前一个月都熟悉了&#xff0c;Xamarin粉估计最大惊喜不是Xamarin Live Player, 也不是Xamarin.Forms混合NativeControl &#xff0c;而是Xamarin.Forms 3.0&#xff0c;因为它融入到 Linux平台. Xamarin.Forms 跨平台&#…

Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

转载自 Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比 redis作为一种高效的缓存框架&#xff0c;使用是非常广泛的&#xff0c;在数据存储上&#xff0c;在运行时其将数据存储在内存中&#xff0c;以实现数据的高效读写&#xff0c;并且根据定制的持久化规则…

微信小程序中使用画布canvas实现动态心电图绘制

大家好&#xff0c;我是雄雄。 内容先知前言效果图实现代码前言 近期&#xff0c;接了个项目&#xff0c;三端&#xff08;小程序、PC、公众号&#xff09;同步开发&#xff0c;PC端没的问题&#xff0c;以前一直做的就是PC端&#xff0c;但是小程序和公众号之前没有做过&…

nssl1163-小x游世界树【树形dp,二次扫描和换根法】

正题 题目大意 一棵树&#xff0c;一条边的权是原本的权值减去出发点的加速。 求一个点使得这个点到所有点路径边权和最小。 解题思路 我们先求出以1为根时的答案 然后用换根法 我们从1转移到2&#xff0c;我们会发现 红色的部分的路径都减去的紫色的路径长度&#xff0c;蓝…

结构体跨函数应用(二)

#include<stdio.h> struct Student { int age;char sex; };int main(void){struct Student st;InputStudent(&st);printf("%d,%c",st.age,st.sex);}void InputStudent(struct Student *pstu) {(*pstu).age88;pstu->sexF;}老是出现警告&#xff0c;排查好…

ASP.NET Core依赖注入解读使用Autofac替代实现

1. 前言关于IoC模式&#xff08;控制反转&#xff09;和DI技术&#xff08;依赖注入&#xff09;&#xff0c;我们已经见过很多的探讨&#xff0c;这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection 模式》&#xff0c;相关资料链接都附于文章末尾…

jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)

大家好&#xff0c;我是雄雄。 内容先知前言软件获取开始测试1.新建线程组2.创建一个请求3.添加HTTP信息头4.开始测试5.查看请求情况前言 上头问题要服务器的配置&#xff0c;基于我们现在做的项目&#xff0c;需要安排别人去采购服务器&#xff0c;给出的消息是&#xff1a;2…

开封游(一)

今天去开封玩了一下&#xff0c;白天在路程上耽搁太多时间&#xff0c;主要在晚上玩的。终于到显示我米9夜景功能的时候了。 去了包公祠&#xff0c;西司夜市&#xff0c;鼓楼夜市。 下午先去了包公祠 下面是夜景了&#xff0c;特别的炫酷。 首先是西司夜市 进去的时候 这个…

C#中的两把双刃剑:抽象类和接口

问题出现&#xff1a;我们在使用C#的抽象类和接口的时候&#xff0c;往往会遇到以下类似的问题&#xff0c;大致归纳如下:(1)抽象类和接口有什么本质的区别和联系&#xff1f;(2)什么时候选择使用抽象类&#xff0c;然啥时候使用接口最恰当呢&#xff1f;(3)在项目中怎样使用才…

开封游(二)

短暂的永远浪漫&#xff0c;漫长换来不满。人就是这样&#xff0c;第一天是怀着期盼喜悦的心情来的&#xff0c;等到二天&#xff0c;被漫长的行程磨平心境后就再也不想出来旅游了。 总之第二天的心情只能用疲倦来概括。 本来愉悦的心情&#xff0c;而转折点是在吃完海底捞之…

.NetCore之下载文件

本篇将和大家分享的丝.NetCore下载文件&#xff0c;常见的下载有两种&#xff1a;A标签直接指向下载文件地址和post或get请求后台输出文件流的方式&#xff0c;本篇也将围绕这两种来分享&#xff1b;如果对您有好的帮助&#xff0c;请多多支持。允许站点不识别content-type下载…

jeecg-boot中如何修改自定义主题颜色

大家好&#xff0c;我是雄雄。 前言 今天第一次上老丈人家&#xff0c;哈哈哈&#xff0c;有点猝不及防&#xff0c;本来没准备去&#xff0c;结果正好在小区门口碰到&#xff0c;人家让我去&#xff0c;我就把后备箱里面的东西拿下来带着去的。 聊了几个小时&#xff0c;也还…

跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

1谈一谈.NET 的跨平台终于要写到这一篇了。跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标。我在前面的文章已经提到过了&#xff0c;Microsoft Graph 服务针对一些主流的开源平台&#xff08;主要用来做跨平台应用&#xff09;都有支持&#xff0c;例如 python,…

用指针完成函数参数的调用

#include<stdio.h>addUp(int a,int b,int c){ cab;printf("%d\n",c); return c;}main(){int c;addUp(6,5,c);printf("%d",c); }可以在函数中完成数字的加减但是发现无法再主函数中调用&#xff0c;是个初始值22&#xff0c;所有得想个办法将函数的值…