网关部署
1、在网关服务器上,安装.net core 3.1运行环境;
2、到 https://www.cnblogs.com/IWings/p/13354541.html 下载Gateway.zip,解压到网关服务器
3、打开appsettings.json配置文件,修改里面的配置,我的配置如下所示:
{ "Port": 7900, "UnLockKeyTimeout": 10000, //当微服务掉线后,lockkey有效期(单位:毫秒) "DataFolder": "./data", //数据存放目录 "AllowIps": [], //允许哪些ip成为微服务,为空表示允许所有ip //"SSL": { //SSL为可选项 // "Cert": "../../../../pfx/gateway_server.pfx", // "Password": "123456", // //配置client.pfx的哈希值,仅接受client.pfx证书请求 // "AcceptCertHash": [ "ACE9C81C11688415DBFA1B39702450A8590BDB0B" ] //被接受的对方证书的hash值,空数组表示信任所有证书 // }, //"Cluster": { //配置集群里的裁判地址,不做集群此项可移除 // "Referee": { // "Address": "127.0.0.1", // "Port": 8919 // } //}, //"ShareFolder": "./shares",//共享文件目录 "ServiceProviderAllocator": { "FullName": "JMS.ServiceProviderAllocator", "Assembly": "JMS.Gateway" }, "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } } }
然后运行命令 dotnet JMS.Gateway.dll ,启动网关程序。(建议用xshell启动,因为控制台能输出中文)
看到以下信息,表示启动成功
创建微服务项目
打开vs,新建一个.net core 3.1控制台项目,名称为:MyHelloworldService
引用下面的 nuget 包:
Microsoft.Extensions.Logging.Console
JMS.ServiceProvider
然后Program.cs代码如下:
using JMS; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; namespace MyHelloworldService { class Program { static void Main(string[] args) { var port = 7902; //提供微服务的端口 var gateways = new NetAddress[] { new NetAddress("192.168.40.131" , 7900) //网关地址 }; ServiceCollection services = new ServiceCollection(); services.AddLogging(loggingBuilder => { loggingBuilder.SetMinimumLevel(LogLevel.Debug); loggingBuilder.AddConsole(); }); var msp = new MicroServiceHost(services); msp.Build(port, gateways) .Run(); } } }
运行控制台,如果成功连接网关,会如下显示:
编写提供的服务
在项目中,新建一个类,名称为:HelloworldController,继承 JMS.MicroServiceControllerBase
namespace MyHelloworldService { class HelloworldController : MicroServiceControllerBase { public string Hello() { return $"你好,现在时间是: {DateTime.Now.ToShortDateString()}"; } } }
然后回到Program.cs代码中,在 new MicroServiceHost(services) 的后面加入服务注册语句
var msp = new MicroServiceHost(services); msp.Register<HelloworldController>("Hello world");//服务名称为Hello world msp.Build(port, gateways) .Run();
到这里,一个最简单的微服务就写完了。
编写调用端
下面,我们再创建一个控制台项目,用来调用微服务,项目名称为:TestApplication
引用下面的 nuget 包:
Microsoft.Extensions.Logging.Console
JMS.Invoker
Program.cs代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System; using System.Threading; namespace TestApplication { class Program { static IServiceProvider ServiceProvider; static JMSClient CreateMST() { var logger = ServiceProvider.GetService<ILogger<JMSClient>>(); return new JMSClient("192.168.40.131", 7900, null, logger); } static void Main(string[] args) { Thread.Sleep(3000);//等服务启动完毕 ServiceCollection services = new ServiceCollection(); services.AddLogging(loggingBuilder => { loggingBuilder.SetMinimumLevel(LogLevel.Debug); loggingBuilder.AddConsole(); }); ServiceProvider = services.BuildServiceProvider(); using ( var client = CreateMST() ) {
//找网关分配一个Hello world微服务实例 var api = client.GetMicroService("Hello world");
//调用服务的Hello函数 var ret = api.Invoke<string>("Hello"); Console.WriteLine(ret); } } } }
鼠标右键解决方案-》设置启动项目...
F5启动调试,两个控制台输出如下:
大家回看调用端的代码,这个地方:
是用字符串的方式,指明了调用微服务的Hello方法,这种方式,调用者如果没有一个微服务的api列表(类似 swagger ),很难搞清楚服务端提供的方法有哪些,
下面,我们用另一种方式调用。
给服务端加注释
我把服务端HelloworldController代码,加上注释,并追加一个time参数
class HelloworldController : MicroServiceControllerBase { /// <summary> /// 哈喽方法 /// </summary> /// <param name="time">我当前的时间</param> /// <returns>中文问候语</returns> public string Hello(DateTime time) { return $"你好,你给的时间是: {time.ToShortDateString()}"; } }
并且指定项目编译时,需要生成xml文档
调用端代码改为:
using ( var client = CreateMST() ) { var api = client.GetMicroService("Hello world"); var code = api.GetServiceClassCode("TestApplication" , "HelloWorldApi"); File.WriteAllText("../../../HelloWorldApi.cs", code, Encoding.UTF8); }
api.GetServiceClassCode生成客户端代码(服务端必须是debug模式),把代码写到HelloWorldApi.cs文件当中
打开生成的HelloWorldApi.cs文件,效果如下:
然后,调用端代码,就可以这么写了:
using ( var client = CreateMST() ) { var api = client.GetMicroService<HelloWorldApi>(); var ret = api.Hello(DateTime.Now); Console.WriteLine(ret); }
服务器的方法该怎么用,是一目了然了