一、在網關服務器上,安裝.net core 3.1運行環境;html
二、到 http://www.javashuo.com/article/p-vuyioahw-nk.html 下載Gateway.zip,解壓到網關服務器shell
三、打開appsettings.json配置文件,修改裏面的配置,個人配置以下所示: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啓動,由於控制檯能輸出中文)api
看到如下信息,表示啓動成功數組
打開vs,新建一個.net core 3.1控制檯項目,名稱爲:MyHelloworldService服務器
引用下面的 nuget 包:app
Microsoft.Extensions.Logging.Console分佈式
JMS.ServiceProvideride
而後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 tran = CreateMST() ) { var api = tran.GetMicroService("Hello world"); 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 tran = CreateMST() ) { var api = tran.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 tran = CreateMST() ) { var api = tran.GetMicroService<HelloWorldApi>(); var ret = api.Hello(DateTime.Now); Console.WriteLine(ret); }
服務器的方法該怎麼用,是一目瞭然了