JMS微服务开发示例(一)Hello world

网关部署

1、在网关服务器上,安装.net 5.0运行环境;

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启动,因为控制台能输出中文)

看到以下信息,表示启动成功

  

 创建微服务项目

(题外话)这里有一个封装性更高的项目模板,可以直接创建一个JMS微服务。

打开vs,新建一个.net core 3.1控制台项目,名称为:MyHelloworldService

引用下面的 nuget 包:

Microsoft.Extensions.Logging.Console

Microsoft.Extensions.Configuration.Json

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.ServiceAddress = new NetAddress(serviceAddress, port); 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);
            }

 服务器的方法该怎么用,是一目了然了

 

上一篇 概述    下一篇 编写分布式事务

posted @ 2020-07-23 09:56  IWing  阅读(2076)  评论(0编辑  收藏  举报