下面的是markdown格式的文档,懒得排版了,有兴趣的话可以去github上看,有源码

Github:https://github.com/yuchengao0721/Consul-Ocelot.git

# <center>Consul+Ocelot的服务网关与注册等功能的实现</center>
此文档主要提供给开发人员使用,
暂时仅实现服务注册、服务发现、负载均衡等功能,
更多功能需配合官方文档或第三方文档进行更细致化开发。

###`有兴趣可以了解一下`

* #### Consul相关:

* [Consul官网](https://www.consul.io/)
* [Consul简介](https://blog.51cto.com/firephoenix/2131616)
* [Consul使用手册](https://blog.csdn.net/liuzhuchen/article/details/81913562)
* [Consul配置手册](https://www.cnblogs.com/sunsky303/p/9209024.html)

* #### Ocelot相关:

* [Ocelot官网](https://ocelot.readthedocs.io/en/latest/)
* [Ocelot简介](https://blog.csdn.net/qin_yu_2010/article/details/82323003)

## 1. Windows环境的搭建

在Windows环境下搭建consul进行服务注册、服务网关等
此次环境配置:
Server
ip:192.168.199.203
Windows版本:WS 2012 R2 Standard
处理器:i5-4570
内存:8G
系统类型:X64
Client
ip:192.168.199.40
Windows版本:W10企业版
处理器:i7-3720QM
内存:8G
系统类型:X64

### 1.1 服务器环境搭建

* #### 1.1.1 Consul_Server端
* ##### step1
前往Consul官网[下载](https://www.consul.io/downloads.html) windows版本的Consul安装程序

* ##### step2
将下好的软件复制到一个新建好的文件夹A,在文件夹A内部新建server.json文件,写入内容
```javascript
{
"datacenter": "dc1",
"data_dir": "opt/consul/data",
"node_name": "consul-server01",//你的Consul服务的别名
"server": true,
"bootstrap_expect": 1,
"bind_addr": "192.168.199.203",//你服务器的ip或者外网域名
"client_addr": "0.0.0.1",//此处固定写法,方便其他机器查看你的ConsulUI
"ui":true
}
```

* ##### step3
在文件夹A内部新建runconsul.bat文件,写入内容
'''
consul agent -config-dir server.json
pause
'''

* ##### step4
运行runconsul.bat文件,出现下列内容即为开启成功
![](WindowsServerStep4.jpg)
在服务器上打开浏览器输入127.0.0.1:8500,可以查看Consul运行情况,

* #### 1.1.2 Consul_Client端
* ##### step1
前往Consul官网[下载](https://www.consul.io/downloads.html) windows版本的Consul安装程序

* ##### step2
将下好的软件复制到一个新建好的文件夹A,在文件夹A内部新建server.json文件,写入内容
```javascript
{
"datacenter": "dc1",
"data_dir": "opt/consul/data",
"node_name": "ych-Client",//你的Client的别名(仅支持全字母、数字、破折号)
"server": false,//是否是Server
"bind_addr": "192.168.199.40",//当前服务器IP或者域名
"client_addr": "192.168.199.40",//可以写当前服务器的ip,也可以写0.0.0.0,主要区别是是否可以在本机查看UI
"ui":true,//是否开启UI
"retry_join": ["192.168.199.203"],//重新加入的Server服务器的IP,可为多个,直到成功
"retry_interval": "30s",//失败重连间隔
"rejoin_after_leave": true,
"start_join":["192.168.199.203"]//第一次加入的Server服务器的IP,可为多个,直到成功
}
```

* ##### step3
在文件夹A内部新建runconsul.bat文件,写入内容
'''
consul agent -config-dir server.json
pause
'''

* ##### step4
运行runconsul.bat文件,出现下列内容即为开启成功
![](WindowsClientStep4.jpg)
在server服务器上打开浏览器输入127.0.0.1:8500,可以查看Node加入新节点。

### 1.2 API注册
* ##### step1
引入下列两个Nuget包
```javascript
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
```

* ##### step2

添加公司Nuget上的ConsulRegister引用

在Program添加下列代码:
```javascript
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIIS()
.UseStartup<Startup>();
```
在Startup添加下列代码:
```javascript
public void ConfigureServices(IServiceCollection services)
{
services.AddConsul(Configuration);//注册Consul中间件
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors();
app.UseHttpsRedirection();
app.UseConsul();//使用Consul中间件
app.UseMvc();
}
```
* ##### step3
在appsettings.json内添加下列内容
```javascript
"Host": "http://192.168.199.40:8041",//当前API的ip或者域名
"ServiceDiscovery": {
"ServiceName": "API_1",//注册的API名称,用以进行服务查找,以及负载均衡
"Consul": {
"HttpEndpoint": "http://192.168.199.40:8500"//API需要注册的Client地址(端口未固定8500,或者可映射为8500的端口)
}
}
```

* ##### step4
运行程序然后打开server的ConsulUI即可查看注册了该API

### 1.3 Ocelot进行服务网关搭建和服务发现
这个程序建议部署在Consul-Server服务器上

* ##### step1
新建一个webAPI core项目

引入下列两个Nuget包
```javascript
<PackageReference Include="Ocelot" Version="13.5.2" />
<PackageReference Include="Ocelot.Provider.Consul" Version="13.5.2" />
```

* ##### step2(重要)
此处为配置项,暂时需要手动实现

根目录下新建ocelot.json文件,写入内容
```javascript
{
"ReRoutes": [
{
"UseServiceDiscovery": true,
"DownstreamPathTemplate": "/{url}",//下游路由规则
"DownstreamScheme": "http",//请求协议
"ServiceName": "API_1",//对应的服务名称
"LoadBalancerOptions": {
"Type": "RoundRobin"//负载均衡规则:轮询
},
"UpstreamPathTemplate": "/Client1/{url}",//上游路由规则不可重复,否则上游无法寻址到正确的下游路由
"UpstreamHttpMethod": [ "Get", "Post" ],//允许的请求方法
"ReRoutesCaseSensitive": false
},
{
"UseServiceDiscovery": true,
"DownstreamPathTemplate": "/{url}",
"DownstreamScheme": "http",
"ServiceName": "API_2",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UpstreamPathTemplate": "/Client2/{url}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"ReRoutesCaseSensitive": false
}
],
"GlobalConfiguration": {
// 使用Consul服务治理
"ServiceDiscoveryProvider": {
"Host": "192.168.199.203",//想要发现的Server服务IP
"Port": 8500,//固定端口或者可映射到该端口的映射端口
"PollingInterval": 100, //健康检查时间间隔ms
"Type": "Consul",
"Token": null,
"ConfigurationKey": null
}
}
}
```
在Program添加下列代码:
```javascript
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddJsonFile("ocelot.json")
.AddEnvironmentVariables();
})
.UseStartup<Startup>();
```
在Startup添加下列代码:
```javascript
public void ConfigureServices(IServiceCollection services)
{
//添加Ocelot中间件
services.AddOcelot(
new ConfigurationBuilder()
.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true).Build())
.AddConsul()
.AddConfigStoredInConsul();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
//添加程序健康启动检查
app.Map("/HealthCheck", s =>
{
s.Run(async context =>
{
await context.Response.WriteAsync("ok");
});
});
app.UseOcelot().Wait();//使用Ocelot中间件
}
```
* ##### step3
运行程序即可

### 1.3 小结
至此windows环境下的服务网关与服务发现雏形已经搭建好,
下面是一些可能遇到的问题
####1.3.1 问题?S
#####Q:遇到服务器积极拒绝怎么解决?
A:检查8500端口是否已经开放,[具体做法](https://jingyan.baidu.com/article/37bce2be40cf921002f3a229.html);如果端口以开放仍有问题,关闭防火墙。

windows环境下如何搭建Consul+Ocelot的更多相关文章

  1. MemCache在Windows环境下的搭建及启动

    MemCache在Windows环境下的搭建及启动 一.memcache服务器端的安装 1.下载memcached的安装包,memcached_en32or64.zip,下载链接:http://pan ...

  2. RabbitMQ,Windows环境下安装搭建

    切入正题:RabbitMQ的Windows环境下安装搭建 一.首先安装otp_win64_20.1.exe,,, 二.然后安装,rabbitmq-server-3.6.12.exe, 安装完成后,在服 ...

  3. XAMPP、PHPstorm和PHPcharm和Windows环境下Python搭建+暴力破解

    XAMPP的安装和使用 一.什么是XAMPP? XAMPP是最流行的PHP开发环境. XAMPP是完全免费且易于安装的Apache发行版,其中包含Apache.MariaDB.PHP和Perl. 类似 ...

  4. go语言环境搭建+sublime text3(windows环境下)

    感觉有点坑,整了一下午~搞定 go语言环境搭建+sublime text3(windows环境下) 1.安装sublime text3 2.安装go语言程序包 3.测试go语言是否安装成功     键 ...

  5. Android SDK +Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建

    Android SDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建 这几天一直在研究 Android SDK  C/C++平台的搭建,尽管以前有成功在Windows ...

  6. PHP.6-PHP环境搭建(Windows环境下)-LAMP

    PHP环境搭建(Windows环境下)-LAMP Windows系统上分别独立安装Apache2.PHP5.MySQL5和phpMyAdmin等几个软件.独立安装的好处是可以自由选择这些组件的具体版本 ...

  7. 【转】Windows环境下Android NDK环境搭建

    原文网址:http://www.metsky.com/archives/525.html 前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员 ...

  8. windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...

  9. Windows环境下Android NDK环境搭建

    前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员来讲,基本够用了,由于Linux系统的权限限制和Android封装架构限制,很多涉及底层设 ...

随机推荐

  1. TypeScript的泛型接口 泛型类接口

    /* typeScript中的泛型 泛型接口 */ //函数类型接口 /* interface ConfigFn{ (value1:string,value2:string):string; } va ...

  2. DRBD UpToDate/DUnknown 故障恢复

    故障如下: root@drbd1:~# drbd-overview 0:data/0 StandAlone Primary/Unknown UpToDate/DUnknown /data/mysql ...

  3. C++类成员存储大小

    1.对象分布图 2.解析 每个类的大小只有其成员变量大小,其中包括:类成员属性,虚函数指针: 而其他没有如:静态变量[静态区],普通函数.静态函数[代码区] 3.总结 类对象的sizeof只包含成员变 ...

  4. 123457123456#1#----com.MC.CarWashKidsGames234----前拼后广--洗车游戏mc-mc1111

    com.MC.CarWashKidsGames234----前拼后广--洗车游戏mc-mc1111

  5. Django自定义用户认证系统之自定义用户模型

    参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...

  6. mysql.yaml

    [root@lab2 mysql]# cat mysql.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my ...

  7. LODOP判断没成功发送任务-重打一下

    一般情况下打印执行了PRINT()或PRINTA(),就会加入打印机队列,如果打印机脱机,就会在队列里排队,当打印机连上并取消脱机的时候,正在排队的任务就会打出,所以一般建议用是否加入队列来判断打印成 ...

  8. 【linux基础-err】 tar命令-stdin: not in gzip format

    problem gzip: stdin: not in gzip format tar: Error is not recoverable: exiting now 解决方法 最后发现下载的压缩文件有 ...

  9. css文本超出部分省略号&CSS强制换行总结

    word-break:break-all单词截断自动换行 word-break:break-all 例如div宽200px,它的内容就会到200px自动换行,如果该行末端有个英文单词很长(congra ...

  10. 【OpenGL开发】GLUT/freeglut 是什么? OpenGL 和它们有什么关系?

    GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用OpenGL, ...