前言

上篇文章《手把手教你使用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跨平台或扫描二维码关注

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

  1. spring cloud+dotnet core搭建微服务架构:配置中心续(五)

    前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...

  2. spring cloud+dotnet core搭建微服务架构:配置中心(四)

    前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...

  3. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  4. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  5. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  6. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  7. 用Spring Cloud和Docker搭建微服务平台

    This blog series will introduce you to some of the foundational concepts of building a microservice- ...

  8. Spring Cloud Eureka(一)搭建一个注册中心

    Spring Cloud Eureka(一)搭建一个注册中心 服务治理 名词解释 spring cloud eureka:spring cloud eureka 使用Netflix Eureka来服务 ...

  9. Spring Cloud构建微服务架构-服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 愿意了解源码的朋友直接求求交流分享技术 一零三八七七四六二六 我们使用Sp ...

最新文章

  1. 博士后工作站来了!智源研究院获得正式授牌
  2. SAP CRM呼叫中心里link按钮的技术实现
  3. ABAP的语法高亮是如何在浏览器里显示的
  4. php遍历一个目录 并重命名
  5. 玩Weld-Probe –一站式查看CDI的所有方面
  6. NILMTK——深扒组合优化(CO)和FHMM细节
  7. ip,子网与子网掩码
  8. unet图像分割_UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式
  9. 直播报名 | 从业务场景入手,吃透音视频技术
  10. python requests 10041报错_Python:requests高级_模拟登陆
  11. 354. 俄罗斯套娃信封问题--(每日一难phase2--day9)
  12. 阿里maven 仓库地址
  13. 计算机一级字幕设置,如何开启电脑哔哩哔哩中的CC字幕功能
  14. css 引入字体、屏幕分辨率设置不同宽度适应
  15. oracle 中 使用 begin end 批量更新,删除资料
  16. 桌面Linux绝地反击
  17. [生存志] 第91节 鬼谷捭阖之策
  18. 【转】国家集训队论文分类整理 作者:洪雁书
  19. 《AMNet: Deep Atrous Multiscale Stereo Disparity Estimation Networks》
  20. 刚刚 Kubernetes 1.25 正式发布,所有变化都在这儿了

热门文章

  1. 微软 改变 开源【几个站点】
  2. jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
  3. OC之非ARC环境下循环retain问题
  4. Ecshop:后台添加新功能栏目以及管理权限设置
  5. 【转】卖场开设社区便利店,不仅卖货,还有家政服务、售后衔接等(图)
  6. .NET6之MiniAPI(九):基于角色的身份验证和授权
  7. 如何通过 C# 判断某个 IP 是否属于某IP段?
  8. .NET 6 对 StackOverflow 的优化
  9. 还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb
  10. 使用零代码平台构建应用,应该怎样转变思路?