.NET Core下的Spring Cloud——前言和概述

前言

前几年一直在写相似dubbo,Srping Cloud的微服务框架辗展转转重复了屡次,也重构推翻了不少次,其中诞生了“Rabbit.Rpc”,”Go”,”RabbitCloud”等开源项目。html

其中不乏他人对这些项目的完善。很高兴本身的开源项目可以给他人提供思路和复用代码。git

关于Rabbit.Rpc相关的文章:github

.NET轻量级RPC框架:Rabbit.Rpc服务器

拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpcmvc

挫折

但无一不被推翻。为何呢?是由于没有耐心?喜新厌旧吗?负载均衡

回顾经历,鄙人一直在互联网类型的公司就任,用户量和请求量都不算低,而本身造的轮子在具体应用上多多少少存在一些问题。框架

为何不去解决遇到的问题呢?

一我的的精力有限,越深刻愈加现一个微服务框架须要考虑的事情太多,而不是简简单单写点代码达到展现可用。微服务

真正用在生产上会遇到不少奇奇怪怪的需求,有技术正确的也有业务须要的。url

并且每个项目对微服务框架的需求也不尽同样。常常遇到某些功能在A处可用,在B处就没那么流利了。3d

是能力不足代码太low吗?

也存在这个可能。我的以为微服务框架须要大量的微服务实践经验。或许是本人的实践经验还不够。

站在巨人的肩膀上

这时候我发现了一个项目“SteeltoeOSS”这是Spring Cloud团队在.NET下的实现。这时我准备拥抱开源,放弃本身造核心轮子的想法。利用社区的经验衍生出更方便的使用方式。

然而SteeltoeOSS由于建立不久,没法彻底对标Java Spring Cloud的实现,缺乏了一些快速上手的能力,好比feign(声明式API请求客户端),Hystrix的集成,ribbot(负载均衡服务器),只有基于eureka的服务发现。

这样的状况便萌生了我补缺的想法,我基于SteeltoeOSS添加了三个新的项目,分别是:steeltoe-extensions(Steeltoe.Discovery.Consul.Client,基于consul的服务发现),ribbon和feign(简单可用)。其中feign属于简单可用,耦合的比较紧,目前feign还在ribbon的git仓库。

为何要这么作?

“.NET不缺少轮子,而是缺少稳定生产可用的轮子。”

目前这套解决方案只在前段时间"福州首届.NET开源社区线下技术交流会"上公开宣讲过。

这套解决方案也用于生产,不是知足私欲的花瓶框架

下面是生产环境的相关状况:

最大峰值:80W/min

日请求量:2亿

微软官方实地勘察调研,并做为案例向社会推广.NET Core。

看看效果

首先准备2个server(服务提供方)

这边你们意会就能够了,后续会写详细的文章来一步一步完成和解释这些步骤。

配置以下:

imageimage

大概的意思是:

本地绑定的服务端口分别是 6001和6002

配置Consul的地址和注册到Consul上的服务地址

其中server2关闭了url健康检查(consul定时向server1请求,返回200表明健康),启用了心跳检查(定时向consul报告我还活着)。

设置服务的名称

添加actuator端点(提供健康检查等能力,来自SteeltoeOSS)

Program以下:

image

大概的意思是:

根据不一样的serverId加载不一样的配置文件而且建立对应的WebHost

其中UseDiscoveryClient是启用发现客户端的意图

Startup以下:

imageimage

大概的意思是:

server1启用mvc,健康检查端点和CloudFoundry端点(url健康检查)

server2只启用mvc(心跳检查)

Controller以下:

image

大概的意思:返回当前时间

看看Consul

imageimage

咱们能够发现Consul上注册了一个timeService,而且有两个健康的节点,分别是:localhost:6001和localhost:6002。

这样咱们就完成了同一个服务两个实例的环境,下一步就是如何调用这些服务。

编写客户端(服务调用方)

配置文件

image

大概的意思是:

配置Consul的地址

当前程序不注册到Consul上(目前只是调用方无需注册到Consul)

只查询健康的服务信息(不健康的节点不会返回)

使用feign调用

定义接口

image

大概的意思是:

定义了一个ITimeService接口,里面有个方法叫GetNowAsync。

在接口定义上添加FeignClientAttribute,指定这个接口对应的服务名称是:timeService(server端的服务名称:Spring:Application:Name),定义一个回退类型(当服务不可用时返回一个可控值,DateTime的最小时间)

初始化和调用

image

运行

image

关掉server试试?

image

在开启server?

image

使用HttpClientFactory调用

初始化和调用

image

运行

image

能够看到6001和6002在交替请求,证实采用的策略是轮询。

写在最后

本篇属于开篇,后续会单独介绍ribbon、feign、Steeltoe.Discovery.Consul.Client。

开源的地址以下:

https://github.com/majian159/ribbon

https://github.com/RabbitTeam/steeltoe-extensions

.NET技术栈QQ群:384413261(点击加入 .NET Group

相关文章
相关标签/搜索