为了让网关更好地了解内部服务的情况,我们需要服务发现组件,如:Consul。
Consul 的安装与运行
选择下载后,解压,确定里面的 exe 文件名为 consul.exe
如果不是,请修改成 consul.exe
。
然后将 consul.exe
剪切到 D:\cmd
中,至于为什么请,请看
打开 cmd
输入命令 consul version
,显示版本号,则说明安装成功~
1 | > consul version |
然后继续输入以下命令启动 Consul,这里不解释命令各个参数的意义,
把注意力集中用于理解 Consul 和 Ocelot 是怎么配合运作的。
1 | > consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -node=s1 -bind=127.0.0.1 -ui |
在浏览器中输入:http://127.0.0.1:8500
如果能成功浏览则说明成功启动 consul,
内容大约如下:
| Service | Health Checks | Tag |
| ——- | ————- | — |
| consul | √ 1 | |
如果不能访问,那么很大可能是 8500
端口被其中程序占用了。
可以使用 netstat -ano
命令查看哪个程序占用了 8500
,将程序关闭之。
服务注册
使用 NuGet
给 Catalog
项目,添加 Consul
。
然后将 Catalog
项目的 Startup.cs
修改成内容如下:
1 | using System; |
在 Catalog
项目下的 Controllers
下创建 HealthController.cs
,
然后将其内容修改成如下:
1 | using System; |
编译 Catalog
项目,
打开一个新的 cmd
,cd
到 Catalog.ddl
所在的目录路径。
路径大约:xxx\eShop\Catalog\bin\Debug\netcoreapp2.1
1
2
3
4
5> dotnet catalog.dll --server.urls "http://127.0.0.1:8001"
...
Now listening on: http://127.0.0.1:8001
Application started. Press Ctrl+C to shut down.
在浏览器中输入:http://127.0.0.1:8001/api/values
显示:1
["value from Catalog","http://127.0.0.1:8001/api/values"]
说明我们的服务已经正常运行了~
在浏览器中输入:http://127.0.0.1:8500
可以看到服务已经注册到 consul 中了
Service | Health Checks | Tag |
---|---|---|
CatalogService | √ 2 | |
consul | √ 1 |
Ocelot 与 Consul
使用 NuGet
给 OcelotGateWay
项目,添加 Ocelot.Provider.Consul
。
修改 OcelotGateWay
项目的 ocelot.json
,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/catalog/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"UseServiceDiscovery": true,
"ServiceName": "CatalogService",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
},
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/order/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"UseServiceDiscovery": true,
"ServiceName": "OrderingApiServer",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
}
}
特别说明:"UseServiceDiscovery": true,
: 使用服务发现。"ServiceName": "CatalogService",
: 服务的名称一定要对应上。GlobalConfiguration
中什么都没有配置,是因为 Ocelot 默认使用 Consul。
修改 OcelotGateWay
项目的 Program.cs
,内容如下:
1 | using System; |
将 OcelotGateWay
设为启动项目,按 F5
运行我们的网关~
在浏览器中输入:http://localhost:7000/catalog/values
可以看到:1
["value from Catalog","http://127.0.0.1:8001/api/values"]
打开一个新的 cmd
,cd
到 Catalog.ddl
所在的目录路径。
路径大约:xxx\eShop\Catalog\bin\Debug\netcoreapp2.1
1
> dotnet catalog.dll --server.urls "http://127.0.0.1:8002"
打开一个新的 cmd
,cd
到 Catalog.ddl
所在的目录路径。
路径大约:xxx\eShop\Catalog\bin\Debug\netcoreapp2.1
1
> dotnet catalog.dll --server.urls "http://127.0.0.1:8003"
在浏览器中输入:http://127.0.0.1:8500
可以新启动的服务都已经注册到 consul 中了
| Service | Health Checks | Tag |
| ————– | ————- | — |
| CatalogService | √ 6 | |
| consul | √ 1 | |
点击 CatalogService
看看~
不断地刷新:http://localhost:7000/catalog/values
会看到以下内容轮流替换:
1 | ["value from Catalog","http://127.0.0.1:8001/api/values"] |
1 | ["value from Catalog","http://127.0.0.1:8002/api/values"] |
1 | ["value from Catalog","http://127.0.0.1:8003/api/values"] |
结束语
可以看出用 Consul 来搭建网关很简单方便,
然而使用起来简单方便不是我们选择的标准,
网关作为流量汇总的入口,它除了能正常运转外,还必须快!快!!快!!!,
所以,我会将更多的时间投入到: Kong 和 traefik
小流量项目使用 Consul,
大流量项目则必须用牛刀了。