前言

由于 Consul 的高可用性、丰富的API、友好的 Web 控制台界面等特点,Consul 的发展非常迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,我们现在可以非常方便快速的将 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是非常的便捷,在 API Gateway 项目中,只需要通过引用一个包,就可以在项目中服务发现了。

今天要完成的架构图

上面就是今天要完成的业务架构图,客户端、Ocelot 网关、Consul 集群、计算器服务集群,这几个模块组成了基本的分布式网关模型。

建立 APIGateway 项目

建立空项目

首先我们建立一个空的 Asp.NetCore WebApplication 程序,对于一个简单的网关程序来说,空项目足够了,因为我们写代码的地方不多

Ocelot 的包引用

我们只需要引用 Ocelot.Provider.Consul ,即可完成 ocelot 和 consul 的依赖引用

配置网关

首先,我们需要为 ocelot 网关编写一个配置文件,ocelot 的配置功能非常丰富,具体参考:https://ocelot.readthedocs.io/en/latest/,本次我们只编写一个最简单的 ocelot.json 文件,该配置文件决定了客户端的请求该如何转发到从 Consul 发现到真正的服务实例中。

{
"ReRoutes": [
{
"UseServiceDiscovery": true, // 使用服务发现
"DownstreamPathTemplate": "/{url}", // 转发路由规则
"DownstreamScheme": "http", // 协议
"ServiceName": "node-1", // 服务名称
"LoadBalancerOptions": { // 负载均衡的算法(这里使用平均)
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/{url}", // 下游请求路由
"UpstreamHttpMethod": [ "Get", "Post" ], // 支持请求方法
"ReRoutesCaseSensitive": false // 路由大小写敏感设置
}
],
"GlobalConfiguration": { // 网关全局配置
"RequestKey": "OcRequestId",
"ServiceDiscoveryProvider": { // 服务发现的配置
"Host": "172.16.1.218",
"Port": 8500,
"ConfigurationKey": "node-1"
}
}
}

上面就是 ocelot 网关的配置,接下来,还需要在 Startup.cs 类中进行简单的配置。

进行服务注入
        public void ConfigureServices(IServiceCollection services)
{
var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build();
services.AddOcelot(ocelotConfig)
.AddConsul()
.AddConfigStoredInConsul();
}

首先加载 ocelot.json 文件,然后将配置注入到服务中

设置路由转发
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHttpsRedirection()
.UseOcelot()
.Wait();
}

通过上面的代码,将 ocelot 注入请求管道中,到这里,配置的工作就已经完成了

创建一个计算器服务

为了演示网关转发和服务发现,我们需要构建一个简单的计算器服务,我准备使用该计算器服务运行两个实例,两个实例运行于同一台服务器上,分别侦听 12008/12009 端口,在服务启动后,该计算器服务将会自动的把自己注册到 Consul 代理服务器集群中,然后 APIGateway 网关从 Consul 发现 12008/12009 服务,并使用负载均衡的机制对两个服务进行调用。

为了方便演示,这里的计算器服务就使用上一篇的代码 进行测试了

运行计算器服务(12008/12009)

我们需要启动两个服务实例,然后注册到 Consul 中,启动服务

查看 Consul 代理服务器集群的状态

服务注册正常

启动 ocelot 网关

访问 Ocelot 网关

计算器服务(12008/12009) 服务实例提供的路由地址为:/home/add/{x:int}/{y:int} ,ocelot 网关的侦听地址为:http://172.16.10.227:12200 ,根据路由转发规则,ocelot 网关会把客户端的请求完整的转发到 12008/12009 服务实例上,所以我们可以通过下面的 url 请求服务,即:ocelot网关+12008/12009 路由,组合起来就是:http://172.16.10.227:12200/home/add/{x:int}/{y:int},那么真正的请求 url 为:http://172.16.10.227:12200/home/add/10/10,预期输出结果为:30

通过上面的输出,可以看到,从网关到真正的服务实例,这个环节已经打通了,通过不断的刷新网页请求,下方的两个服务实例总是一前一后的持续输出日志,这就足以证明我们在 ocelot 服务网关配置的负载均衡算法 "Type": "RoundRobin" 发挥了作用。

ocelot 配置文件管理

通过查看 Consul Web 控制台的界面的 Key/Value 菜单,发现 ocelot 将配置文件 ocelot.json 存储到 Consul 中了,我们可以在 Consul 中对网关进行可视化管理,修改保存即可。

结束语

从实验结果看,在 .NETCore 中集成 APIGateway 和 Consul 还是比较简单的事情,当然,大部分的项目在项目开放进程中,大概率是不会一次性使用到这么多组件的,不过我相信,随着架构的演进,这些项目最终也不得不考虑服务注册、发现、调度、负载均衡等这些问题,引入网关,就势在必行了。

.NETCore 集成 Consul 导读

源代码下载

本文所有源代码已托管到 Github ,欢迎下载测试 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,如果觉得还行,请点击 star ,谢谢支持。

Consul初探-集成ocelot的更多相关文章

  1. .NetCore·集成Ocelot组件之完全解决方案

    阅文时长 | 11.04分钟 字数统计 | 17672.8字符 主要内容 | 1.前言.环境说明.预备知识 2.Ocelot基本使用 3.Ocelot功能挖掘 4.Ocelot集成其他组件 5.避坑指 ...

  2. Consul初探-在深交之前先认识

    Consul 是什么? Consul 官方站点:https://www.consul.io/ 首先,官方介绍是:Consul 是一种服务网格的解决方案,在 Consul 中,提供了服务发现.配置.分段 ...

  3. 使用docker+consul+nginx集成分布式的服务发现与注册架构

    一.环境说明: 1.一台虚拟机,该系统已经装好了docker: ip 192.168.10.224 虚拟网卡,与主机互通 操作系统rhel6 内核 2.6.32  64位 docker版本 1.7.1 ...

  4. Consul初探-服务注册和发现

    前言 经过上一篇的学习,现在已经来到了服务注册发现环节:Consul 的核心功能就是服务注册和发现,Consul 客户端通过将自己注册到 Consul 服务器集群,然后等待调用方去发现服务,实现代理转 ...

  5. Consul初探-从安装到运行

    前言 伟大领袖毛主席说过:实践是检验真理的唯一标准!经过上一篇的学习,我基本掌握了 Consul 的基本原理,接下来就是动手实践了:Consul 的部署方式分为两种,分别是二进制包和docker方式, ...

  6. Consul-template+nginx实现自动负载均衡

    前言 consul-template 是 Consul 的一个守护程序,使用 consul-template 可以方便快速的实现对 Consul Key/Value 存储系统的访问,可以从 KV 系统 ...

  7. .Net Core微服务——网关(2):ocelot集成consul

    有consul基础的都知道,consul可以发现新增的服务,剔除掉无效的服务,赋予应用自动伸缩的能力.而ocelot如果集成了consul,那ocelot也能拥有这些能力,还可以自主选择负载均衡策略, ...

  8. 基于.net core微服务(Consul、Ocelot、Docker、App.Metrics+InfluxDB+Grafana、Exceptionless、数据一致性、Jenkins)

    1.微服务简介 一种架构模式,提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(RESTfu ...

  9. 庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现

    庐山真面目之七微服务架构Consul集群.Ocelot网关集群和IdentityServer4版本实现 一.简介      在上一篇文章<庐山真面目之六微服务架构Consul集群.Ocelot网 ...

随机推荐

  1. PAT-2019年秋季考试-甲级

    7-1 Forever (20 分) #include <bits/stdc++.h> using namespace std; int N,K,m,number[10]; multima ...

  2. Python爬虫帮你打包下载所有抖音好听的背景音乐,还不快收藏一起听歌【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  3. Python报错ERROR: Command errored out with exit status 1:

    解决方法: 1.以管理员身份打开cmd 2.pip install robotframework-AutoItLibrary (本次安装时Python基于3.7.3,pip为最新版本) 3.安装成功

  4. mac office软件的安装与破解

    1.mac  office 软件的安装及破解  http://10176523.cn/archives/29/ 下载后安装  切记不要登录 然后用这个文件 破解

  5. The file “XXX.app” couldn’t be opened because you don’t have permission to view it.问题修复

    出现下列问题 怎么解决呢 如图 将info.plist的文件中的Executable.file中的文件修改为:$(PRODUCT_NAME) 重新编译 com+R不出意外的话 运行成功 ok 解决~

  6. nbuoj2784 倒水

    题目:http://www.nbuoj.com/v8.83/Problems/Problem.php?pid=2784 一天,TJ买了N个容量无限大的瓶子,开始时每个瓶子里有1升水.接着TJ决定只保留 ...

  7. nmap扫描进阶、msfconsole攻击入门(网安全实训第二天)

    本期内容:nmap扫描.msfconsole攻击入门 1. nmap扫描进阶 2.msfconsole攻击入门 1.nmap扫描进阶 (1)nmap命令 nmap --sP -iL abin.txt ...

  8. java发送邮件基础方法(另附部分主流邮箱服务器地址、端口及设置方法)

    java发送邮件基础方法,可通过重载简化参数 import java.io.File; import java.io.UnsupportedEncodingException; import java ...

  9. JS-常见数据结构

    常见数据结构 这一章节我们将来学习数据结构的内容.经常会有人提问说:学习数据结构或者算法对于前端工程师有用么? 总的来说,这些基础学科在短期内收效确实甚微,但是我们首先不要将自己局限在前端工程师这点上 ...

  10. C#线程学习笔记四:线程同步

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/21/ThreadsSynchronous.html,记录一下学习过程以备后续查用.     ...