docker 环境下通过ocelot和consul 实现服务发现与自治
Ocelot介绍
Ocelot的目标对象是使用.NET运行面向微服务/服务的架构,需要统一的入口点进入他们的系统。
特别是我希望与IdentityServer引用和承载令牌轻松集成。
Ocelot是一组按特定顺序排列的中间件。
Ocelot将HttpRequest对象操作到其配置指定的状态,直到它到达请求构建器中间件,在该中间件中,它创建一个HttpRequestMessage对象,该对象用于向下游服务发出请求。发出请求的中间件是Ocelot管道中的最后一件事。它不会调用下一个中间件。来自下游服务的响应存储在每个请求范围的存储库中,并在请求返回Ocelot管道时进行检索。有一个中间件将HttpResponseMessage映射到HttpResponse对象并返回给客户端。基本上它具有许多其他功能
consul 介绍
Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全服务网格。Consul需要数据平面并支持代理和本机集成模型。Consul附带一个简单的内置代理,因此一切都可以开箱即用,但也支持第三方代理集成,如Envoy。
Consul的主要特点是:
-
服务发现:Consul的客户可以注册服务,例如
api
或mysql
,并且其他客户可以使用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