03 .NET CORE 2.2 使用OCELOT -- Docker中的Consul
部署consul-docker镜像
先搜索consul的docker镜像
docker search consul
然后选择了第一个,也就是官方镜像
下载镜像
docker pull consul
然后运行镜像
docker run -d --name consul -v /home/root/config:/config --restart=always\
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
consul agent -server \
-bootstrap-expect 1 \
-ui \
-client 0.0.0.0
consul中每个启动参数的含义,参考了以下链接:
https://www.cnblogs.com/pearlran/p/11225953.html
注册服务
参考链接:
新建一个common项目
新建consulbuilderextensions.cs 、consulservice.cs、healthservice.cs
1 using consul; 2 using microsoft.aspnetcore.builder; 3 using microsoft.aspnetcore.hosting; 4 using system; 5 using system.collections.generic; 6 using system.linq; 7 using system.threading.tasks; 8 9 namespace test.webapi.common 10 { 11 public static class consulbuilderextensions 12 13 { 14 15 // 服务注册 16 17 public static iapplicationbuilder registerconsul(this iapplicationbuilder app, iapplicationlifetime lifetime, healthservice healthservice, consulservice consulservice) 18 19 { 20 21 var consulclient = new consulclient(x => x.address = new uri($"http://{consulservice.ip}:{consulservice.port}"));//请求注册的 consul 地址 22 23 var httpcheck = new agentservicecheck() 24 25 { 26 27 deregistercriticalserviceafter = timespan.fromseconds(5),//服务启动多久后注册 28 29 interval = timespan.fromseconds(10),//健康检查时间间隔,或者称为心跳间隔 30 31 http = $"http://{healthservice.ip}:{healthservice.port}/api/health",//健康检查地址 32 33 timeout = timespan.fromseconds(5) 34 35 }; 36 37 // register service with consul 38 39 var registration = new agentserviceregistration() 40 41 { 42 43 checks = new[] { httpcheck }, 44 45 id = healthservice.name + "_" + healthservice.port, 46 47 name = healthservice.name, 48 49 address = healthservice.ip, 50 51 port = healthservice.port, 52 53 tags = new[] { $"urlprefix-/{healthservice.name}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 fabio 识别 54 55 }; 56 57 consulclient.agent.serviceregister(registration).wait();//服务启动时注册,内部实现其实就是使用 consul api 进行注册(httpclient发起) 58 59 lifetime.applicationstopping.register(() => 60 61 { 62 63 consulclient.agent.servicederegister(registration.id).wait();//服务停止时取消注册 64 65 }); 66 67 return app; 68 69 } 70 71 } 72 }
1 namespace test.webapi.common 2 { 3 public class consulservice 4 5 { 6 7 public string ip { get; set; } 8 9 public int port { get; set; } 10 11 } 12 }
1 namespace test.webapi.common 2 { 3 public class healthservice 4 { 5 public string name { get; set; } 6 7 public string ip { get; set; } 8 9 public int port { get; set; } 10 } 11 }
两个webapi项目引用这个common项目
并修改各自的 startup.cs
1 public void configure(iapplicationbuilder app, ihostingenvironment env, iapplicationlifetime lifetime) 2 { 3 if (env.isdevelopment()) 4 { 5 app.usedeveloperexceptionpage(); 6 } 7 else 8 { 9 // the default hsts value is 30 days. you may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 10 app.usehsts(); 11 } 12 consulservice consulservice = new consulservice() 13 { 14 ip = configuration["consul:ip"], 15 port = convert.toint32(configuration["consul:port"]) 16 }; 17 healthservice healthservice = new healthservice() 18 { 19 ip = configuration["service:ip"], 20 port = convert.toint32(configuration["service:port"]), 21 name = configuration["service:name"], 22 }; 23 24 app.registerconsul(lifetime, healthservice, consulservice); 25 26 //app.useconsul(); 27 app.usehttpsredirection(); 28 app.usemvc(); 29 }
修改 appsettings.json。 192.168.2.16是本机地址。192.168.2.29是docker中consul的地址。 两个项目的配置类似,区别是本地项目的端口9001、9002。
1 { 2 "logging": { 3 "loglevel": { 4 "default": "warning" 5 } 6 }, 7 "allowedhosts": "*", 8 9 "service": { 10 "name": "apiservice", 11 "ip": "192.168.2.16", 12 "port": "9001" 13 }, 14 "consul": { 15 "ip": "192.168.2.29", 16 "port": "8500" 17 } 18 }
iis部署 .net core 2.2
参考链接:
部署期间遇到过以下问题
http error 500.35 - ancm multiple in-process applications in same process asp.net core 3
解决方法:两个webapi项目 用不一样的应用池。
部署完成后,测试下 各自项目的 /api/health接口是否正常。
测试网关项目
修改网关项目的配置configuration.json
1 { 2 "reroutes": [ 3 { 4 "useservicediscovery": true, 5 "downstreampathtemplate": "/{url}", 6 "downstreamscheme": "http", 7 "servicename": "apiservice", 8 "loadbalanceroptions": { 9 "type": "roundrobin" 10 }, 11 "upstreampathtemplate": "/{url}", 12 "upstreamhttpmethod": [ "get" ], 13 "reroutescasesensitive": false 14 } 15 ], 16 "globalconfiguration": { 17 "servicediscoveryprovider": { 18 "host": "192.168.2.29", 19 "port": 8500, 20 "type": "pollconsul", 21 "pollinginterval": 100 22 } 23 } 24 }
修改 startup.cs
1 public void configureservices(iservicecollection services) 2 { 3 services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2); 4 services.addocelot(new configurationbuilder() 5 .addjsonfile("configuration.json") 6 .build()) 7 .addconsul(); 8 } 9 10 // this method gets called by the runtime. use this method to configure the http request pipeline. 11 public async void configure(iapplicationbuilder app, ihostingenvironment env) 12 { 13 if (env.isdevelopment()) 14 { 15 app.usedeveloperexceptionpage(); 16 } 17 else 18 { 19 // the default hsts value is 30 days. you may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 20 app.usehsts(); 21 } 22 await app.useocelot(); 23 app.usehttpsredirection(); 24 app.usemvc(); 25 }
f5启动项目
上一篇: 常用的Shell脚本
下一篇: 面向对象:反射,双下方法