JMS微服務開發示例(一)Hello world

網關部署

一、在網關服務器上,安裝.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);
            }

 服務器的方法該怎麼用,是一目瞭然了

 

上一篇 概述    下一篇 編寫分佈式事務

相關文章
相關標籤/搜索