【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

原文:【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!

一.什么Ocelot?

API网关是一个服务器,是系统的唯一入口。API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。

Ocelot 是一个使用在 .NET Core 平台上的一个 API Gateway,这个项目的目标是在 .NET 上面运行微服务架构。Ocelot 框架内部集成了 IdentityServer(身份验证)和 Consul(服务注册发现),还引入了 Polly 来处理进行故障处理。目前,腾讯和微软Ocelot 在官网贴出来的客户。

手把手搭建一个网关

在此之前你应该去学一学如何搭建服务集群,那么这将有效与你学习API网关服务,传送门,再此基础上再添加一个名为  MicroService.APIGetway 的ASP.NET WebApi项目。

在该项目中,我们通过Nuget安装Ocelot,或者通过m命令行进行安装。

注意:最新版的不建议使用,会出现一些内部错误,建议使用10.0.1以下的版本。

创建相关文件夹

在其中应该创建服务注册以及网关文件夹,那么效果图如下:

添加网关配置文件

在项目中,添加一个配置文件 ocelot.json ,并将文件属性中 “赋值到输出目录” 的值修改为 “如果较新则复制”。

在ocelot.json文件夹中,加入以下内容。

{
  "ReRoutes": [
    {
      "UseServiceDiscovery": true,
      "DownstreamPathTemplate": "/api/values",
      "DownstreamScheme": "http",
      "ServiceName": "T169.OcelotConsul.Service",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UpstreamPathTemplate": "/ss",
      "UpstreamHttpMethod": [ "Get", "Post" ],
      "ReRoutesCaseSensitive": false // non case sensitive
    }
  ],
  "GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
      "Host": "localhost", // Consul Service IP
      "Port": 8500 // Consul Service Port
    }
  }
}

以下是 Ocelot 官方给出的配置文件的节点说明

{
  //官?方?文档ReRoutes全节点示例例
  "ReRoutes": [
    {
      //Upstream表示上游请求,即客户端请求到API Gateway的请求
      "UpstreamPathTemplate": "/", //请求路路径模板
      "UpstreamHttpMethod": [ //请求?方法数组
        "Get",
        "POST",
        "PUT",
        "DELETE",
        "OPTIONS"
      ],
      //Downstreamb表示下游请求,即API Gateway转发的?目标服务地址
      "DownstreamScheme": "http", //请求协议,?目前应该是?支持http和https
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost", //请求服务地址,应该是可以是IP及域名
          "Port": 8081 //端?口号
        }
      ],
      "DownstreamPathTemplate": "/", //下游请求地址模板
      // 以下节点可选
      "RouteClaimsRequirement": { //标记该路路由是否需要认证
        "UserType": "registered" //示例例,K/V形式,授权声明,授权token中
        会包含?一些claim,如填写则会判断是否和token中的?一致,不不?一致则不不准访问
      },
      //以下三个是将access claims转为?用户的Header Claims,QueryString,该
      功能只有认证后可?用
      "AddHeadersToRequest": { //
        "UserType": "Claims[sub] > value[0] > |", //示例例
        "UserId": "Claims[sub] > value[1] > |" //示例例
      },
      "AddClaimsToRequest": {},
      "AddQueriesToRequest": {},
      "RequestIdKey": "", //设置客户端的请求标识key,此key在请求header中
      ,会转发到下游请求中
      "FileCacheOptions": { //缓存设置
        "TtlSeconds": 15, //ttl秒被设置为15,这意味着缓存将在15秒后过期
        。
        "Region": "" //缓存region,可以使?用administrator API清除
      },
      "ReRouteIsCaseSensitive": false, //路路由是否匹配?大?小写
      "ServiceName": "", //服务名称,服务发现时必填
      "QoSOptions": { //断路路器?配置,?目前Ocelot使?用的Polly
        "ExceptionsAllowedBeforeBreaking": 0, //打开断路路器?之前允许的例例
        外数量量。
        "DurationOfBreak": 0, //断路路器?复位之前,打开的时间(毫秒)
        "TimeoutValue": 0 //请求超时时间(毫秒)
      },
      "LoadBalancer": "", //负载均衡 RoundRobin(轮询)/LeastConnection(
      最少连接数)
      "RateLimitOptions": { //官?方?文档未说明
        "ClientWhitelist": [], // 客户端?白明代 ?
        "EnableRateLimiting": false, // 是否限流 ?
        "Period": "",
        "PeriodTimespan": 0,
        "Limit": 0
      },
      "AuthenticationOptions": { //认证配置
        "AuthenticationProviderKey": "", //这个key对应的是代码中.AddJW
        TBreark中的Key
        "AllowedScopes": [] //使?用范围
      },
      "HttpHandlerOptions": {
        "AllowAutoRedirect": true, //指示请求是否应该遵循重定向响应。
        如果请求应该?自动遵循来?自Downstream资源的重定向响应,则将其设置为true; 否则为假。
        默认值是true。
        "UseCookieContainer": true //该值指示处理理程序是否使?用CookieCon
        tainer属性来存储服务器?Cookie,并在发送请求时使?用这些Cookie。 默认值是true。
      },
      "UseServiceDiscovery": false //使?用服务发现,?目前Ocelot只?支持Consu
      l的服务发现
    }
  ],
  "GlobalConfiguration": {}
}

其中,我们需要了解一下微服务的上游服务器和下游服务器,以下是我个人的总结,下游服务器是提供Api接口,那么上游提供访问的规则,下游服务器配置就是我们刚才创建的json里面的,我们指定Host,port,以及PathTemplate。

通过配置文件,我们可以可以知道Ocelot是通过我们的json配置规则映射成了它自己可以识别的对象,转发给了后台的httpservice,从后端返回结果。

通过配置文件可以完成对 Ocelot 的功能配置: 路由、服务聚合、服务发现、认证、鉴权、限流、熔断、缓存、 Header 头传递 等。我们上面的配置说明都已经写好了,比较重要的就是如下,下面你可以多留意。

  • DownstreamPathTemplate:下游戏
  • DownstreamScheme:下游服务http schema
  • DownstreamHostAndPorts:下游服务的地址,如果使用LoadBalancer的话这里可以填多项
  • UpstreamPathTemplate: 上游也就是用户输入的请求Url模板
  • UpstreamHttpMethod: 上游请求http方法,可使用数组

修改启动文件

public class Program
    {
        public static void Main(string[] args)
        {

            IWebHostBuilder builder = new WebHostBuilder();

            builder.ConfigureServices(s => {
                s.AddSingleton(builder);
            });

            builder.UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .ConfigureAppConfiguration((hostingContext, cfg) => {
                    cfg.AddJsonFile("ocelot.json", false, true);
                })
                .UseStartup<Startup>();

            var host = builder.Build();

            host.Run();
        }
    }

这里需要引用一下包:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

加载中间件

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddOcelot(Configuration);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
            app.UseOcelot().Wait();
        }

修改项目加载配置文件(launchsettings.json)

{
  "profiles": {
    "WebApplication1": {
      "commandName": "Project",
      "launchBrowser": false,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

设置启动多个项目

因为我们需要启动服务,还有网关,我们就需要设置启动多个项目了。右击项目属性。

讲解

当然我们,还是要回顾以下服务器集群的服务发现是如何进行的。

这是一个很基本的json,如下图,节点与项目之间的关系。

{
  "services": [
    {
      "ID": "OcelotConsul1_service",
      "name": "T169.OcelotConsul.Service",
      "tags": [
        "urlprefix-/T169.Studeent.Service"
      ],
      "address": "localhost",
      "port": 8081,
      "checks": [
        {
          "name": "Student Service check",
          "http": "http://localhost:8081/api/health",
          "interval": "10s",
          "timeout": "5s"
        }
      ]
    },{
      "ID": "OcelotConsul2_service",
      "name": "T169.OcelotConsul.Service",
      "tags": [
        "urlprefix-/T169.Studeent.Service"
      ],
      "address": "localhost",
      "port": 8080,
      "checks": [
        {
          "name": "Student Service check",
          "http": "http://localhost:8080/api/health",
          "interval": "10s",
          "timeout": "5s"
        }
      ]
    }
  ]
}

大家都知道我们在我们的服务中写好了启动端口和和ip地址,如以下定义。

{
  "profiles": {
    "ConsulGoForProject": {
      "commandName": "Project",
      "applicationUrl": "http://localhost:8081",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

那么我们的配置文件就是通过address和port进行寻找的,寻找到之后,如果启动集群,那么就会将这些节点转换成对象,通过httpclient向集群进行映射,达到了一个这么一个功能,其中的ID应该是一个唯一的。那么name可以是相同的,可以让网关进行一个发现,那么网关是根据什么进行分发的呢?

那么我们的网关是如何找到我们的服务的呢?

其中的DownstreamPathTemplate是向下的模板路径,DownstreamScheme是访问的方式,有http和https,ServiceName是服务发现的路径,在此其中,你的配置文件中,如果和这个名字相同,那么就会根据对应的address和port  去访问DownStreamPathTemplate,那么UpstreamPathTemplate是你要写的别名,也就是说我们的台服务器无法达到匹配的时候,我们可以使用这个属性(类似我们访问www.baidu.com 第一次访问和这个ServiceName相同的服务,第二次找第二个,当然这和Type:"RoundRobin" 这个属性有极大的关联,这个就叫做轮询,这个属性是Ocelot的精髓)。我们分别通过网关地址和服务的真实地址来访问服务,看一看效果如何。

再此其中,我们使用开发模式进行启动服务器集群。

consul agent -dev -config-dir=/tmp/consul/config

我们逐一将其中的api/values的控制器返回值改以下,这里就不贴代码了,我们启动项目,看一个细节。如下是刚启动项目,还没有启动集群的时候是这个样子的,这是大家都经常看到的。

我们开始部署集群,回车!,发现诸多的代码在执行,如下图所示,这是我们通过consul的命令去扫描了tmp/consul/config/ 这里面的json,当然它只认识json,读取其中的节点,通过Consul的自动代理HttpClient注册我们的服务,那么这就是一个通俗易懂的解释了。

我们看一下网关的效果如何,我们发现这是非常榜的,这也就是轮询机制,通过网关代理给我们带来了极大的好处。

那么大家都知道WebApi限流机制,限流这个名词我就不再解释了,对请求进行限流可以防止下游服务器因为访问过载而崩溃,这个功能就是我们的张善友张队进添加进去的。非常优雅的实现,我们只需要在路由下加一些简单的配置即可以完成。

"RateLimitOptions": {
    "ClientWhitelist": [],
    "EnableRateLimiting": true,
    "Period": "1s",
    "PeriodTimespan": 1,
    "Limit": 1
}
  • ClientWihteList 白名单
  • EnableRateLimiting 是否启用限流
  • Period 统计时间段:1s, 5m, 1h, 1d
  • PeroidTimeSpan 多少秒之后客户端可以重试
  • Limit 在统计时间段内允许的最大请求数量

总结

希望大家看完这篇可以有所收获吧,Ocelot开源地址:https://github.com/TomPallister/Ocelot,如果有问题的话在下方留言。谢谢。!

原文地址:https://www.cnblogs.com/lonelyxmas/p/10223121.html

时间: 2024-11-07 12:33:53

【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!的相关文章

在五分钟内创建,运行和部署Spring微服务

通过优锐课中的java学习分享中,我们可以看到在五分钟内创建,运行和部署Spring微服务的一些相关信息,码了很多知识点,整理给大家参考学习.对微服务架构又有了更深的了解,其中的架构思维导图梳理起来太清晰了. 使用IBM Cloud Developer Tools CLI插件创建,运行和部署Spring微服务 学习目标 使用IBM Cloud Developer Tools CLI生成Spring微服务,为其配置和绑定服务,然后部署到IBM Cloud. 了解所生成的代码,以及如何为你开始添加自

微服务系列(一):微服务架构的优势与不足

微服务在当下引起广泛关注,成为文章.博客.社交媒体讨论和大会演讲的热点:在 Gartner 的 “Hype Cycle” 上排名也非常靠前.与此同时,在软件社区也有人质疑微服务并非新事物.反对者认为微服务只是 SOA (Service Oriented Architecture)的二度包装.然而,无论是追捧还是质疑,微服务架构拥有巨大优势,尤其是它让敏捷开发和复杂的企业应用交付成为可能. 本系列包含 7 篇文章,介绍了微服务的设计.构建和部署,并与传统的单体架构进行了比较.本系列将分析微服务架构

SpringCloud(八)Consul的微服务注册

将微服务注册到Consul 1 入门案例 提供一个商品微服务 提供一个订单系统 将微服务注册到Consul 依赖 provider  <!--SpringCloud提供的对于Consul的服务发现-->         <dependency>             <groupId>org.springframework.cloud</groupId>             <artifactId>spring-cloud-starter-

.Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关

1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderExtensions { public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLifetime lifetime,ServiceEntity serviceEntity) {

三分钟彻底弄懂什么是分布式和微服务架构

一.微服务简介 1. 微服务的诞生 微服务是基于分而治之的思想演化出来的.过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们从单独架构发展到分布式架构,又从分布式架构发展到 SOA 架构,服务不断的被拆分和分解,粒度也越来越小,直到微服务架构的诞生. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值. 每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP

.Net Core 微服务容器系列基础目录篇

1.开场白 HI,各位老铁,大家端午好,之前写了些关于.net core商城系列的文章,有点乱,今天心血来潮想着整理一下(今天只是先把目录列出来,后面的每篇文章这两天会进行重新修改的,目前先将就看下). 简单介绍一下,博主目前就职于某电商公司,目前工作用的是.net core,业余时间也会看下Java,公司内部目前也是多语言并存,毕竟很多工具和技术对于这两种语言都是相通的,所以多了解下哈. 本系列项目将会以.net core+Docker+K8s来搭建,当然你用java来改写一下也是没问题的,因

微服务 consul使用

前言 常见的注册中心有zookeeper .eureka.consul.etcd.从生态发展.便利性.语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩展为配置中心.github地址:https://github.com/hashicorp/consulconsul官网:https://learn.hashicorp.com/consul consul特性 consul是分布式的.高可用.横向扩展的.consul提供的一些关键特性: service discove

微服务之:从零搭建ocelot网关和consul集群

原文:微服务之:从零搭建ocelot网关和consul集群 介绍 微服务中有关键的几项技术,其中网关和服务服务发现,服务注册相辅相成. 首先解释几个本次教程中需要的术语 网关 Gateway(API GW / API 网关),顾名思义,是企业 IT 在系统边界上提供给外部访问内部接口服务的统一入口,简化了外部由于多服务协同完成任务时的繁琐配置.网关组件有Kong,ocelot, 服务发现:通过网关访问内部各个微服务,网关要找到所需服务的过程称为服务发现 服务注册:既然有服务发现,前提是要把所需服

8分钟学会Consul集群搭建及微服务概念

原文:8分钟学会Consul集群搭建及微服务概念 Consul介绍: Consul 是由 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单. Consul的如何实现的? Consul 用 Golang 实现,因此具有天然可移植性(支