前言

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

其中不乏他人对这些项目的完善。很高兴自己的开源项目能够给他人提供思路和复用代码。

关于Rabbit.Rpc相关的文章:

.NET轻量级RPC框架:Rabbit.Rpc

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

挫折

但无一不被推翻。为什么呢?是因为没有耐心?喜新厌旧吗?

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

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

一个人的精力有限,越深入越发现一个微服务框架需要考虑的事情太多,而不是简简单单写点代码达到展示可用。

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

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

是能力不足代码太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(服务提供方)

这边大家意会就可以了,后续会写详细的文章来一步一步完成和解释这些步骤。

配置如下:

大概的意思是:

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

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

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

设置服务的名称

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

Program如下:

大概的意思是:

根据不同的serverId加载不同的配置文件并且创建对应的WebHost

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

Startup如下:

大概的意思是:

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

server2只启用mvc(心跳检查)

Controller如下:

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

看看Consul

我们可以发现Consul上注册了一个timeService,并且有两个健康的节点,分别是:localhost:6001和localhost:6002。

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

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

配置文件

大概的意思是:

配置Consul的地址

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

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

使用feign调用

定义接口

大概的意思是:

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

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

初始化和调用

运行

关掉server试试?

在开启server?

使用HttpClientFactory调用

初始化和调用

运行

可以看到6001和6002在交替请求,证明采用的策略是轮询。

写在最后

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

开源的地址如下:

https://github.com/majian159/ribbon

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

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

.NET Core下的Spring Cloud——前言和概述的更多相关文章

  1. Docker下的Spring Cloud三部曲之一:极速体验

    版权声明:欢迎转载,请注明出处,谢谢. http://blog.csdn.net/boling_cavalry/article/details/79177930   目录(?)[+]   从本章开始, ...

  2. Spring Cloud 前后端分离后引起的跨域访问解决方案

    背景 Spring Cloud 微服务试点改造,目前在尝试前后端分离. 前台A应用(本机8080端口),通过网管(本机8769端口)调用后台应用B(本机8082端口).应用C发布的http服务.. A ...

  3. spring-cloud-kubernetes服务发现之在k8s环境下开发spring cloud应用

    通常情况下,我们的线上的服务在迁移到k8s环境下的时候,都是采用平滑迁移的方案.服务治理与注册中心等都是采用原先的组件.比如spring cloud应用,在k8s环境下还是用原来的一套注册中心(如eu ...

  4. Spring Cloud(一):概述以及核心成员介绍

    什么是Spring Cloud? Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  5. Spring Cloud 学习 之 Spring Cloud Eureka(概述)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 前述: ​ 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务 ...

  6. 微服务架构下使用Spring Cloud Zuul作为网关将多个微服务整合到一个Swagger服务上

    注意: 如果你正在研究微服务,那必然少不了服务之间的相互调用,哪么服务之间的接口以及api就必须生成系统的管理文档了.如果你希望更好的管理你的API,你希望有一个工具能一站式地解决API相关的所有事情 ...

  7. Spring Cloud Eureka基本概述

    记一次Eureka的进一步学习. 一.Eureka简介 百科描述:Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡 ...

  8. 【spring cloud】spring boot2.x下 使用feign,注解@EnableFeignClients 找不到的解决方法

    spring boot2.x下 使用feign,注解@EnableFeignClients 找不到的解决方法 在spring boot1.x下,使用注解@EnableFeignClients,jar包 ...

  9. 使用Spring Cloud搭建服务注册中心

    我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...

随机推荐

  1. Ubuntu下编译SqlCipher以及解密微信数据库EnMicroMsg.db过程和坑

    wget https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.4.2 ./configure --enable-tempstore=yes C ...

  2. PHP CURL获取页面内容输出例子

    使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true. 1.curl ...

  3. linux系统资源监控

    top命令 1.平均负载(load average): 正在耗费CPU进程与正在等待io的进程之和,三个值分别是一分钟,五分钟,十五分钟的平均负载,负载值只要小于CPU颗粒数属于正常情况 任务进程(T ...

  4. ORACLE启动报错ORA-03113: end-of-file on communication channel

    使用过程中发现oracle运行很慢(其实应该先关注空间问题),就准备关机重启一下,关不掉就强制关闭,然后启动就报错了. 1.SQL> startup ORACLE instance starte ...

  5. DOM与BOM

    DOM 1.概念起源: 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结 ...

  6. [error] eclipse编写spring等xml配置文件时只有部分提示,tx无提示

    eclipse编写spring等xml配置文件时只有<bean>.<context>等有提示,其他标签都没有提示 这时就需要做以下两步操作(下面以事务管理标签为例) 1,添加命 ...

  7. UEditor之实现配置简单的图片上传示例

    UEditor之实现配置简单的图片上传示例 原创 2016年06月11日 18:27:31 开心一笑 下班后,阿华到楼下小超市买毛巾,刚买完出来,就遇到同一办公楼里另一家公司的阿菲,之前与她远远的有过 ...

  8. Java Web每天学之Servlet的原理解析

    Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...

  9. PHP零基础入门

    字符函数库: 函数库基础 安装字符串函数库 字符串函数库列表 函数是可以实现特定功能,可以重复执行的代码段. 函数分 内置函数 和 用户函数. 内置函数是指PHP本身提供的各类库函数. 字符串函数库, ...

  10. [Swift]LeetCode225. 用队列实现栈 | Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...