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


    网关部署

    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);
                }

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

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

  • 相关阅读:
    docker in docker
    docker社区的geodata/gdal镜像dockerfile分析
    howto:在构建基于debian的docker基础镜像时,更换国内包源
    使用Visual Studio 2017构建.Net Core的Docker镜像
    步骤:asp.net core中使用identifyserver4颁发令牌
    部署:阿里云ECS部署Docker CE
    问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null
    《.NET 微服务:适用于容器化 .NET 应用的体系结构》关键结论
    SQL数据库注入防范 ASP.NET Globle警告
    数据库中的恶意字符批处理
  • 原文地址:https://www.cnblogs.com/IWings/p/13354518.html
Copyright © 2020-2023  润新知