查看原文
其他

.NET Core JMS微服务开发示例

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:IWing
cnblogs.com/IWings/p/13354518.html

系列文章


《.NET Core自带分布式事务的微服务开源框架JMS》


网关部署


1、在网关服务器上,安装.NET Core 3.1运行环境;


2、下载Gateway.zip:

https://files.cnblogs.com/files/IWings/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 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);
}


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


- EOF -


推荐阅读  点击标题可跳转
.NET Core WebApi使用JWT验证签名.NET Core ResponseCache 缓存篇ASP.NET Core在.NET 5 Preview 7的更新

看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存