docker 环境下通过ocelot和consul 实现服务发现与自治

Ocelot介绍

Ocelot的目标对象是使用.NET运行面向微服务/服务的架构,需要统一的入口点进入他们的系统。

特别是我希望与IdentityServer引用和承载令牌轻松集成。

Ocelot是一组按特定顺序排列的中间件。

Ocelot将HttpRequest对象操作到其配置指定的状态,直到它到达请求构建器中间件,在该中间件中,它创建一个HttpRequestMessage对象,该对象用于向下游服务发出请求。发出请求的中间件是Ocelot管道中的最后一件事。它不会调用下一个中间件。来自下游服务的响应存储在每个请求范围的存储库中,并在请求返回Ocelot管道时进行检索。有一个中间件将HttpResponseMessage映射到HttpResponse对象并返回给客户端。基本上它具有许多其他功能

consul 介绍

Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全服务网格。Consul需要数据平面并支持代理和本机集成模型。Consul附带一个简单的内置代理,因此一切都可以开箱即用,但也支持第三方代理集成,如Envoy。

Consul的主要特点是:

  • 服务发现:Consul的客户可以注册服务,例如 apimysql,并且其他客户可以使用Consul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们所依赖的服务。

  • 运行状况检查:Consul客户端可以提供任意数量的运行状况检查,这些检查与给定服务(“是Web服务器返回200 OK”)或本地节点(“内存利用率低于90%”)相关联。运营商可以使用此信息来监控群集运行状况,服务发现组件使用此信息将流量路由远离不健康的主机。

  • KV商店:应用程序可以将Consul的分层键/值存储用于任何目的,包括动态配置,功能标记,协调,领导者选举等。简单的HTTP API使其易于使用。

  • 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。 意图 可用于定义允许哪些服务进行通信。可以使用可以实时更改的意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。

  • 多数据中心:Consul支持多个数据中心。这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。

Consul旨在对DevOps社区和应用程序开发人员友好,使其成为现代,弹性基础架构的理想选择。

通过consul实现动态转发

首先搭建consul集群  docker-compose.yml如下

consul-agent-1: &consul-agent
    image: consul:latest
    container_name: consul-agent-1
    networks: 
      - network
    command: "agent -retry-join consul-server-bootstrap -client 0.0.0.0"

  consul-agent-2:
    container_name: consul-agent-2
    <<: *consul-agent
  
  consul-agent-3:
    container_name: consul-agent-3
    <<: *consul-agent

  consul-server-1: &consul-server
    container_name: consul-server-1
    <<: *consul-agent
    command: "agent -server -retry-join consul-server-bootstrap -client 0.0.0.0"

  consul-server-2:
    container_name: consul-server-2
    <<: *consul-server

  consul-server-bootstrap:
    container_name: consul-server-bootstrap
    <<: *consul-agent
    ports:
     - "8400:8400"
     - "8500:8500"
     - "8600:8600"
     - "8600:8600/udp"
    command: "agent -server -bootstrap-expect 3 -ui -client 0.0.0.0"

 

搭建成功后进入http://localhost:8500 能进入consul的管理界面并查看当前的数据中心和consul节点以及注册的服务的健康状态

 

 

consul 集群搭建成功后,然后将自己的业务微服务注册进入consul ,相关功能的代码已经上传到github上 ,地址:https://github.com/singlewanderwolf/ConsuleRegister 可以参考下。

 记住业务微服务需要加上健康检查  不然consul是没法监控该服务的 

当将我们的微服务注册进入consul之后,就可以通过consul来实现ocelot的自动转发了, ocelot的配置如下

{
  "ReRoutes": [],
  "Aggregates": [],
  "GlobalConfiguration": {
    "BaseUrl": "http://phoenix.local.newv.com.cn",
    "RequestIdKey": "NewvOcRequestId",
    "AdministrationPath": "/administration",
    "ServiceDiscoveryProvider": {
      "Host": "consul-server-bootstrap",
      "Port": 8500,
      "Type": "Consul"
    },
    "DownstreamScheme": "http",
    "RateLimitOptions": {
      "ClientIdHeader": "ClientId",
      "QuotaExceededMessage": null,
      "RateLimitCounterPrefix": "ocelot",
      "DisableRateLimitHeaders": false,
      "HttpStatusCode": 429
    },
    "QoSOptions": {
      "ExceptionsAllowedBeforeBreaking": 0,
      "DurationOfBreak": 0,
      "TimeoutValue": 0
    },
    "LoadBalancerOptions": {
      "Type": "LeastConnection",
      "Key": null,
      "Expiry": 0
    },
    "HttpHandlerOptions": {
      "AllowAutoRedirect": false,
      "UseCookieContainer": false,
      "UseTracing": false
    }
  }
}

注意 ReRoutes中不能放入任何其他配置规则。

配置完成后并启动服务后。浏览器中输入localhots:5000/servicename/api/v1/value,ocelot会根据url的第一段servicename 去询问consul 并得到实际的服务地址进行转发,实际转发的地址为http:servicehost:serviceport/api/v1/value  

posted @ 2019-04-08 10:48  疯狂的柚子  阅读(825)  评论(0编辑  收藏  举报