Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器

Consul   自动服务发现    健康检查

通过Ocelot搭建API网关   服务注册   负载均衡

1.创建三个空API项目  Api.Gateway(Ocelot网关服务器)      Api.ServiceA(资源服务器A)     Api.ServiceB(资源服务器B)

2.Api.Gateway项目中  添加Ocelot包   添加Ocelot.Json配置文件  Ocelot服务器端口配成5000

{
"ReRoutes": [
{
//暴露出去的地址
"UpstreamPathTemplate": "/api/{controller}",
"UpstreamHttpMethod": [ "Get" ],
//转发到下面这个地址
"DownstreamPathTemplate": "/api/{controller}",
"DownstreamScheme": "http",
//资源服务器列表
"DownstreamHostAndPorts": [
{
"host": "localhost",
"port":
},
{
"host": "localhost",
"port":
}
],
//决定负载均衡的算法
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
}
],
//对外暴露的访问地址 也就是Ocelot所在的服务器地址
"GlobalConfiguration": {
"BaseUrl": "http://localhost:5000"
}
}
LeastConnection – 将请求发往最空闲的那个服务器
RoundRobin – 轮流发送
NoLoadBalance – 总是发往第一个请求或者是服务发现

3.项目启动读取Ocelot配置

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) => {
builder
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("Ocelot.json");
})
.UseStartup<Startup>();
}

把Ocelot注册到DI容器

services.AddOcelot();

管道中开启Ocelot

app.UseOcelot().Wait();

4.配置资源服务器 在Ocelot中配置好了  把对应的/api/{controller}地址会进行转发

    [Route("apiservice/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public string Get()
{
return "这是A资源服务器API";
}

5.通过localhost:5000/api/value访问    实现了负载均衡       测试的时候修改了端口或者其他的  最要先把iis对应端口进程关闭  不然可能没有更新过来

这种做法  如果其中一台服务器挂了   Ocelot没办法知道  还是会转发接口过去   如果新增服务器    就需要修改配置文件    可以通过Ocelot+Consul实现自动服务发现和服务健康监测

*********************************************************************

Ocelot+Consul实现服务发现和健康监测

下载了consul后   就是一个exe文件  通过cmd进入目录      consul agent --dev运行    consul默认ui地址 http://localhost:8500

API项目配置consul   项目启动后 自动被consul发现

1.添加consul Nuget包    启动consul服务

2.在管道中配置

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//注册项目启动的方法
lifetime.ApplicationStarted.Register(OnStart);
//注册项目关闭的方法
lifetime.ApplicationStarted.Register(OnStopped);
app.UseMvc();
}
private void OnStart()
{
var client = new ConsulClient();
//健康检查
var httpCheck = new AgentServiceCheck()
{
//服务出错一分钟后 会自动移除
DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(),
//每10秒发送一次请求到 下面的这个地址 这个地址就是当前API资源的地址
Interval = TimeSpan.FromSeconds(),
HTTP = $"http://localhost:5011/HealthCheck"
}; var agentReg = new AgentServiceRegistration()
{
//这台资源服务的唯一ID
ID = "JcbServiceA",
Check = httpCheck,
Address = "localhost",
Name = "servicename",
Port =
};
client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
}
//关闭的时候在consul中移除
private void OnStopped()
{
var client = new ConsulClient();
//根据ID在consul中移除当前服务
client.Agent.ServiceDeregister("JcbServiceA");
}

3.启动项目后  进入consul发现 当前项目已经被consul发现   这样就实现了服务的自动发现

4.然后在把Consul结合到Ocelot中   在Ocelot中安装Ocelot.Provider.Consul  包

在管道中把Consul注册到DI容器

services.AddOcelot().AddConsul();

修改Ocelot.Json配置文件

{
"ReRoutes": [
{
//暴露出去的地址
"UpstreamPathTemplate": "/api/{controller}",
"UpstreamHttpMethod": [ "Get" ],
//转发到下面这个地址
"DownstreamPathTemplate": "/api/{controller}",
"DownstreamScheme": "http",
//资源服务器列表
//"DownstreamHostAndPorts": [
// {
// "host": "localhost",
// "port": 5011
// },
// {
// "host": "localhost",
// "port": 5012
// }
//],
//决定负载均衡的算法
"LoadBalancerOptions": {
"Type": "LeastConnection"
},
"ServiceName": "servicename", //服务注册标识, 这个需要和资源API注册的名称相同
"UseServiceDiscovery": true //启用服务发现
//"ReRoutesCaseSensitive": false
}
],
//对外暴露的访问地址 也就是Ocelot所在的服务器地址
"GlobalConfiguration": {
"BaseUrl": "http://localhost:5000",
"ServiceDiscoveryProvider": {
"Host": "localhost", // Consul Service IP
"Port": , // Consul Service Port
//"Type": "PollConsul",
//"PollingInterval": 100 //健康检查时间端
}
}
}

5.这样就实现了动态的服务注册

如果其中一台服务挂了    一分钟后还是连接不上   consul会自动移除这台服务  并且不会再将请求转发到这台服务上     这时候就可以动态的实现服务的新增

注意:在这里通过Consul发现服务的时候

当资源API只有一台   启用和关闭当前资源API   Consul都能正常检查到

当资源API有两台的时候  关闭其中一台资源API是正常的        然后在关闭另外一台 Consul的控制台已经检测到这台API连接失败了  但是Localhost:8500界面上显示还是正常的(并且这台关闭的API会一直显示正常)   不清楚为什么

************************

Ocelot +IdentityServer4     在网关实现统一身份验证

1.在Ocelot项目中添加  IdentityServer4.AccessTokenValidation  包

DI容器添加身份验证    这里的authenticationProviderKey 要和Ocelot.Json中的authenticationProviderKey 相同

        public void ConfigureServices(IServiceCollection services)
{ var authenticationProviderKey = "finbook"; services.AddAuthentication()
.AddIdentityServerAuthentication(authenticationProviderKey, options =>
{
options.Authority = "http://localhost:3000";
options.ApiName = "gateway_api";
options.SupportedTokens = SupportedTokens.Both;
options.ApiSecret = "secret";
options.RequireHttpsMetadata = false;
});
services.AddOcelot().AddConsul();
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }

2.修改Ocelot.Json配置文件

      "AuthenticationOptions": {
//这个名称要和Startup中配置的权限key相同
"AuthenticationProviderKey": "finbook",
//允许访问的资源API 在IdentityServer中配置
"AllowedScopes": [ "gateway_api" ]
}

https://www.cnblogs.com/weiBlog/p/9833807.html

关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面的更多相关文章

  1. .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡

    大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...

  2. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  3. .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡

    本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...

  4. Spring Cloud gateway 网关服务二 断言、过滤器

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  5. Asp.Net Core + Ocelot 网关搭建:负载均衡的配置

    前言   上一篇中简单做了一个网关Demo.本篇中也记录一下负载均衡的配置实现. 演示   首先开三个服务,端口分别为 60001,60003,60005,然后分别启动三个服务.接下来在ApiGate ...

  6. 微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现

    原文:微服务学习笔记(2)--使用Consul 实现 MagicOnion(GRpc) 服务注册和发现 1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载w ...

  7. C#使用Consul集群进行服务注册与发现

    前言 我个人觉得,中间件的部署与使用是非常难记忆的:也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用. 所以,我觉得学习中间件的文章,越详细越好:因为,这对作者而言也是一份珍贵 ...

  8. 搭建服务与负载均衡的客户端-Spring Cloud学习第二天(非原创)

    文章大纲 一.Eureka中的核心概念二.Spring RestTemplate详解三.代码实战服务与负载均衡的客户端四.项目源码与参考资料下载五.参考文章 一.Eureka中的核心概念 1. 服务提 ...

  9. 一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)

    一.负载均衡的简介: 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力. 1.服务端负载均衡 ...

随机推荐

  1. U盘安装Windows原版系统(安装方式有很多,我讲我的安装方式)

    我陈某人,也是安装过至少200部台式或笔记本的人物. 低调,低调,开个玩笑~ 安装方式有很多,我讲我的安装方式,欢迎收藏. 1.下载准备文件下载.iso原版系统镜像文件http://msdn.itel ...

  2. 关于element-ui表格table设置header-cell-class-name样式不起作用的原因分析

    在编写表格的时候想给表头添加样式,使用 header-cell-class-name怎么都添加不上样式,检查元素发现连class都没添加上,查了很多资料有人说element之前版本不支持这属性,但我使 ...

  3. python导入.py文件

    1.from . import D # 导入A.B.D 2.from .. import E # 导入A.E 3.from ..F import G # 导入A.F.G,.. 和 F是连着的,中间没有 ...

  4. Linux运维跳槽40道面试精华题

    Linux运维跳槽40道面试精华题 运维派 3天前 1.什么是运维?什么是游戏运维? 1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护 ...

  5. sql多行多列重复

      在sql的查询中我们会遇到查询的结果比如这样的: 查询这张表的sql语句: select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_ ...

  6. CentOS 7 安装MySQL5.7.25

    STEP 1. 下载 去往官方下载MySQL包.http://dev.mysql.com mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz [root@study ...

  7. 福州大学软件工程1916|W班 第2次作业成绩排名

    作业链接: 结对第一次-原型设计(文献摘要热词统计) 评分准则: 本次作业评分分为两部分,一部分是博客分数(满分25分),另一部分是工程能力分数(满分30分). 博客分数评分标准: 1.在随笔开头请加 ...

  8. 为fastdfs文件服务器新增一个storage

    一.前言: 前期,已经搭建好了一套fastdfs文件服务器,一个tracker和一个storage,且部署在同一台服务器上,已经正式投入运行快半年了,1T的空间现在只剩下100G容量了,现在需要扩容, ...

  9. springmvc <mvc:default-servlet-handler/> & <mvc:annotation-driven>

    1. mvc 标签内部加载的基础类: 1). <mvc:view-controller> 1 org.springframework.web.servlet.handler.SimpleU ...

  10. Java 中 this 和 super 的用法总结

    his this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this 的用法在 Java 中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this 相当于是指向当 ...