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。代码按照章节的顺序上传,例如第一章demo1,第二章demo2以此类推。
求推荐,你们的支持是我写作最大的动力,我的QQ群:328438252,交流微服务。
传送门
- spring cloud+dotnet core搭建微服务架构:服务注册(一)
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
- spring cloud+dotnet core搭建微服务架构: Api网关(三)
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
参考资料
java部分
.net部分
spring cloud+dotnet core搭建微服务架构:服务发现(二)的更多相关文章
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+dotnet core搭建微服务架构:Api网关(三)
前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
- spring cloud+dotnet core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- spring cloud+.net core搭建微服务架构:服务注册(一)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+.net core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- spring cloud+.net core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- spring cloud+.net core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
随机推荐
- FBI Warning
FBI Warning... --------------------------- 电影中的片头部分:<正宗的FBI Warning>: ========== 翻译: fbi warni ...
- (转)没有IE就没有伤害!浏览器兼容性问题解决方案汇总
普及:浏览器的兼容性问题,往往是个别浏览器(没错,就是那个与众不同的浏览器)对于一些标准的定义不一致导致的.俗话说:没有IE就没有伤害. 贴士:内容都是自己总结的,不免会出现错误或者bug,欢迎更正和 ...
- 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)
因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念. 方法的作用:把一系列的代码放在一起,然后再取个别名.之后通过这个别名的调用,就相当于执行了这一系列的代码. 方法的语法:([]中的内 ...
- JS函数-我调用自己试试看
前言 最近在读<JavaScript语言精粹>,对递归函数有了进一步的认识,希望总结下来: 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归 ...
- WPF蒙板弹窗
由于界面设计需要,要给弹窗添加蒙板效果,在百度和google搜索了半天,竟然没有一个满意的方案,最后只能自己想办法实现了一个,原理还是比较简单的,现在分享给大家. 先看一下效果.. 原理其实 ...
- linux(十)之初始化文件
前面写了很多linux的知识,其实很多都是命令的,所以要去多多的练习才能学的更好,加油为了好工作. 要么现在懒惰,未来讨饭.要么现在努力,未来惬意. 一.初始化文件概述 1.1.概述 系统初始化文件是 ...
- Be the Best of Whatever You Are
If you can't be a pine on the top of the hill, Be a scrub in the valley—but be The best little scrub ...
- python之VSCode安装
[之前发布到本人的51cto博客,现转过来] 1.安装python3.5(3.6版本亲测无法实现命令补全功能) 2.安装VSCode(我的版本:VSCode-win32-1.7.2) 3.安装Pyth ...
- java TreeSet 应用
本文主要是介绍一下java集合中的比较重要的Set接口下的可实现类TreeSet TreeSet类,底层用二叉树的数据结构 * 集合中以有序的方式插入和抽取元素. * 添加到TreeSet中的元素必须 ...
- Java泛型:泛型类,泛型接口和泛型方法
转自: https://segmentfault.com/a/1190000002646193 泛型的产生很多缘由是因为 容器类 的创建 泛型类 容器类应该算得上最具重用性的类库之一.先来看一个没有 ...