asp.net core系列 61 Ocelot 构建服务发现简单示例
一.概述
Ocelot允许指定服务发现提供程序,如Consul或Eureka。 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口。目前Ocelot仅在GlobalConfiguration部分支持配置服务发现功能,这意味着相同的服务发现提供程序将用于为ReRoute级别指定ServiceName的所有ReRoutes。这里介绍下服务发现的二个中间件:Consul与Eureka。
1. Consul介绍
Consul服务发现是用GO语言的开源框架,是一个分布式, 高可用,数据中心感知的解决方案,用于跨任何运行时平台和公共云或私有云连接。Consul是服务发现和配置工具。主要功能包括:
(1) 服务发现 - Consul使用简单的服务来注册自己,并通过DNS或HTTP接口发现其他服务。还可以注册外部服务,比如SaaS提供者。
(2) 运行状况检查 -运行状况检查使Consul能够快速向操作员发出有关群集中任何问题的警报, 与服务发现的集成可防止将流量路由到不健康的主机,并启用服务级别的断路器。
(3) Key/Value存储 - 灵活的Key/Value存储可以存储动态配置,功能标记,协调,领导者选举等。简单的HTTP API使其易于在任何地方使用。
(4) 多数据中心 - Consul可以识别数据中心,并且可以支持任意数量的区域而无需复杂的配置。
(5) 服务分段 - Consul 连接通过自动TLS加密和基于身份的授权实现安全的服务到服务通信。
使用consul示例:https://www.cnblogs.com/Zhang-Xiang/p/10437488.html
2. Eureka介绍
Eureka服务发现是用java语言的开源框架,最新版本为19.9 (有报道后面2.0版本不开源)。是一种基于REST的服务,主要用于AWS云,用于定位服务,以实现中间层服务器的负载平衡和故障转移。
使用Eureka示例:Service Discovery Demo With Eureka
二.演示项目介绍
本篇重点了解Consul的使用,下面参考开源项目Github , 本篇在部署上 对比 参考示例 有些小改动,项目使用了Ocelot + IdentityServer4 + Consul中间件。
说明:
(1) 用到的软件包括:centos系统, iis, fiddler。其中centos系统用于做Consul服务注册,iis做webapi的宿主承载,fiddler用于客户端模拟测试。
(2) 演示中 IdentityServer4服务认证和ApiGateway网关项目由vs2017 来做宿主承载,但也可以用iis承载。
|
项目名称 |
Ip和端口 |
说明 |
|
ApiGateway |
http://localhost:38039 |
网关项目。统一访问入口点,在生产环境下ip要在广域网,供第三方客户端访问。 做好网关路由配置,将自动转发。 |
|
IdentityServer4 |
http://127.0.0.1:8021 |
Is4令牌服务。ip是在局域网, 通过web api来调用令牌 |
|
Service A/B |
http://127.0.0.1:8010 (A) http://127.0.0.1:8011 (B) |
服务项目。ip是在局域网,由网关转发进来访问。 |
|
Consul 搭建 |
http://172.168.18.201:8500 |
服务发现。在linux中启动Consul服务,默认是8500端口,用于监听服务的健康状态。 在linux中需要拼通服务ip及port, 反之一样。可telnet命令。 配置服务注册文件 |
|
fiddler客户端模拟 |
调用服务A获取IS4令牌,通过该令牌访问服务A受保护的接口 |
三. web api服务
参考开源项目,Service A和Service B服务项目相关配置都一样,以Service A为例:
1.项目中有三个api接口
(1) 一个必须要诊断接口api/Health
(1) 一个必须要的获取令牌接口api/Session
(3) 一个业务测试接口api/Values。 因为业务接口是受保护的,所以该接口加了[Authorize],需要令牌来访问
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new[] { "value1", "value2" };
}
}
2. 在启动时,加了授权中间件,采用JwtBearer方案。设置了受信任的is4服务基地址,以及Audience保护的资源。
services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.Authority = "http://127.0.0.1:8021";
options.RequireHttpsMetadata = false;
options.Audience = "ServiceB";
});
四. ApiGateway项目
1. 在网关项目中,配置ocelot文件
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
//客户端通过/ServiceA来访问ServiceA的服务
"UpstreamPathTemplate": "/ServiceA/{everything}",
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
//服务发现Consul用到
"ServiceName": "ServiceA",
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
},
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/ServiceB/{everything}",
"UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
"ServiceName": "ServiceB",
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
}
],
"GlobalConfiguration": {
//配置Consul的信息
"ServiceDiscoveryProvider": {
"Host": "172.168.18.201",
"Port": ,
"Type": "Consul"
}
}
}
2.启动时添加网关中间件
public static void Main(string[] args)
{
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddJsonFile("ocelot.json")
.AddEnvironmentVariables();
})
.ConfigureServices(services =>
{
services.AddOcelot().AddConsul();
})
.ConfigureLogging((hostingContext, logging) =>
{
//add your logging
})
.UseIISIntegration()
.Configure(app =>
{
app.UseOcelot().Wait();
})
.Build()
.Run();
}
五. IdentityServer令牌服务
参考开源IdentityServer项目代码,在令牌服务中,使用AddDeveloperSigningCredential来添加临时证书,在生产环境下,可以使用AddSigningCredential来添加证书。客户端基于用户名和密码的方式来获取令牌GrantTypes.ResourceOwnerPassword。
六 Consul搭建
1. consul安装
--下载安装包
[root@hsr opt]# wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
--将conusl命令移到bin目录下,方便启动
[root@hsr opt]# mv consul /usr/local/bin/
--测试安装是否成功,ok
[root@hsr ~]# consul
Usage: consul [--version] [--help] <command> [<args>]
2.添加服务注册放到/usr/etc/

3. 启动客户端agent 测试
consul agent -dev -data-dir=/usr/etc -config-dir=/usr/etc/consul.json -client 172.168.18.201
启动成功后,会每隔10秒检查一次服务的健康状态,如下所示:

-dev开发模式,启动该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
-config-file 指定服务注册文件
-client指定当前ip,默认是127.0.0.1
-data-dir指定agent储存状态的数据目录
4.关闭201防火墙, 在win系统上访问服务发现管理界面如下:
systemctl stop firewalld.service

七.fiddler测试
1. 测试开始步骤:
(1) 两个服务ServerA/ServerB发布到iis上。
(2) 在vs2017中启动ApiGateway网关项目和IS4项目。
(3) 在linux系统中启动consul(现只是监听服务是否健康)
2.测试ServerA服务
(1)通过用户名和密码,获取要访问ServerA服务的令牌

(2) 获取受保护的api接口,将拿到的令牌加到headers中去请求

(3) 请求http://localhost:38039/serviceA/values数据接口成功,如下所示:

参考文献
asp.net core系列 61 Ocelot 构建服务发现简单示例的更多相关文章
- asp.net core系列 60 Ocelot 构建服务认证示例
一.概述 在Ocelot中,为了保护下游api资源,用户访问时需要进行认证鉴权,这需要在Ocelot 网关中添加认证服务.添加认证后,ReRoutes路由会进行身份验证,并使用Ocelot的基于声明的 ...
- asp.net core系列 59 Ocelot 构建基础项目示例
一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...
- asp.net core 系列 3 依赖注入服务
一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S).开放封闭原则(O).里氏替换原则(L).接口分离原则(I).依赖反转原则(D). ...
- asp.net core microservices 架构之eureka服务发现
一 简介 微服务将需多的功能拆分为许多的轻量级的子应用,这些子应用相互调度.好处就是轻量级,完全符合了敏捷开发的精神.我们知道ut(单元测试),不仅仅提高我们的程序的健壮性,而且可以强制将类和方法的设 ...
- asp.net core 系列之webapi集成EFCore的简单操作教程
因为官网asp.net core webapi教程部分,给出的是使用内存中的数据即 UseInMemoryDatabase 的方式, 这里记录一下,使用SQL Server数据库的方式即 UseSql ...
- asp.net core 系列之webapi集成Dapper的简单操作教程
Dapper也是是一种ORM框架 这里记录下,使用ASP.NET 集成 Dapper 的过程,方便自己查看 至于Dapper的特性以及操作可以参考Dapper官方文档 1.创建数据库相关 在Sql S ...
- Asp.Net Core WebAPI入门整理(二)简单示例
一.Core WebAPI中的序列化 使用的是Newtonsoft.Json,自定义全局配置处理: // This method gets called by the runtime. Use thi ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- Asp.net Core 系列之--3.领域、仓储、服务简单实现
ChuanGoing 2019-11-11 距离上篇近两个月时间,一方面时因为其他事情耽搁,另一方面也是之前准备不足,关于领域驱动有几个地方没有想通透,也就没有继续码字.目前网络包括园子里大多领域驱 ...
随机推荐
- 选择Web框架的20条标准
原文观点由Matt Raible提出,关于Matt Rabile的介绍:http://www.infoq.com/cn/author/Matt-Raible 内容摘自<Java程序员修炼之道&g ...
- 使用Swashbuckle构建RESTful风格文档
本次和大家分享的是Swagger to WebApi的nuget包Swashbuckle:因为项目需要统一api文档的风格,并要支持多种开发语言(C#,java,python),所以首先想到的是swa ...
- Spring的断言工具类Assert的基本使用
org.springframework.util.Assert; Assert工具类,通常用于数据合法性检查. 平时做判断通常都是这样写: if(message == null || message. ...
- 程序员快递请查收,来自Python黑客大佬的一份DDOS攻击说明书!
DDoS攻击没有我们想象中的那么简单,并不是什么Python程序员都能够做到的. 若要知晓黑客利用DDOS攻击原理那么我们必须要知道是实行DDoS攻击比较难的原因是什么? 很简单的一句话概括:&quo ...
- HTML 标签小细节
简书地址:https://www.jianshu.com/p/03a23aa28a34 今天重新学习了一下HTML中标签的用法,补充并记录一下自己新学到的知识. a中的href href Contai ...
- 【读英文文档】Whetting Your Appetite(刺激你的食欲)
如果你有很多工作是通过计算机来完成的,那么你一定希望其中的很多事情能够自动地实现.比方说,你希望在文本文件中实现查找和替换的功能,以某一种机制实现照片的重命名以及重新排序的功能,一个小型的数据库甚至是 ...
- VueJs 权限管理
程序运行时,router只配置登陆 首页404 等基本页面 import Main from '@/views/Main.vue'; // 不作为Main组件的子页面展示的页面单独写,如下 expor ...
- Spring Boot使用RestTemplate消费REST服务的几个问题记录
我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Ap ...
- Activity的运行过程
今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...
- Eureka源码分析:Eureka不会进行二次Replication的原因
Eureka不会进行二次同步注册信息 Eureka会将本实例中的注册信息同步到它的peer节点上,这是我们都知道的特性.然而,当peer节点收到同步数据后,并不会将这些信息再同步到它自己的peer节点 ...