JMS微服务开发示例(一)Hello world
网关部署
1、在网关服务器上,安装.net core 3.1运行环境;
2、到 https://www.cnblogs.com/IWings/p/13354541.html 下载Gateway.zip,解压到网关服务器
3、打开appsettings.json配置文件,修改里面的配置,我的配置如下所示:
{
"Port": ,
"UnLockKeyTimeout": , //当微服务掉线后,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 = ; //提供微服务的端口 var gateways = new NetAddress[] {
new NetAddress("192.168.40.131" , ) //网关地址
}; 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", , null, logger);
}
static void Main(string[] args)
{
Thread.Sleep();//等服务启动完毕 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);
}
服务器的方法该怎么用,是一目了然了
JMS微服务开发示例(一)Hello world的更多相关文章
- 微软微服务eShopOnContainers示例之EventBusRabbitMq解析与实践
eShopOnContainers eShopOnContainers是微软官方的微服务架构示例,GitHub地址https://github.com/dotnet-architecture/eSho ...
- 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发
<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...
- 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)
1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...
- 构建微服务开发环境4————安装Docker及下载常用镜像
[内容指引] 下载Docker: Mac下安装Docker: Windows下安装Docker; 下载常用docker镜像. 一.下载Docker 1.Mac适用Docker下载地址:https:// ...
- 构建微服务开发环境8————Hello 微服务
[内容指引] 1.用IDEA打开微服务项目; 2.更新Maven依赖: 3.IntelliJ IDEA JDK配置; 4.修改代码: 5.运行微服务: 6.将代码变更提交到Github. 经过前面的努 ...
- 黑少微服务商店之Iron Cloud微服务开发云
近日,由黑少微服务研发团队推出的Iron Cloud微服务开发云已经正式对外提供服务,这是国内第一家基于云端操作的微服务专业开发工具. Iron Cloud 微服务开发云(www.ironz.com) ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- mPass多租户系统微服务开发平台
目录 项目总体架构图 基于SpringBoot2.x.SpringCloud并采用前后端分离的企业级微服务,多租户系统架构微服务开发平台 mPaaS(Microservice PaaS)为租户业务开发 ...
- python 微服务开发书中几个方便的python框架
python 微服务开发是一本讲python 如果进行微服务开发的实战类书籍,里面包含了几个很不错的python 模块,记录下,方便后期回顾学习 处理并发的模块 greenlet && ...
随机推荐
- java读写Excel模板文件,应用于负载均衡多个服务器
首先,需要大家明白一点,对于多服务器就不能用导出文件用a标签访问链接方式去导出excel文件了,原因相信大家也明白,可能也做过尝试. 现在开始第一步:get请求,productPath 为你的项目路径 ...
- 一条SQL删除重复记录,重复的只保留一条
情景: 我们的数据库中可能会存在很多因各种原因而重复的记录,我们需要对这些重复的记录进行删除,每组组重复的记录只保留一条就行 例如我们有这么个表:两个框框都是有重复记录的,红框和绿框都只需要留下一条, ...
- 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset
作者:Jules S. Damji 译者:足下 本文翻译自 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets ,翻译已 ...
- LeetCode63. 不同路径 II
这题和62题类似,只不过这里多了障碍物,只需要把有障碍物的格子的方案数设置为0即可,其他格子还是原来的走法. class Solution { public: int uniquePathsWithO ...
- Windows常用注册表文件
内容转载自我的博客 目录 1. 删除Visual Studio的右键菜单 2. 恢复Visual Studio的右键菜单 3. 右键菜单添加功能 4. USB3.0连接安卓手机刷机出现问题 1. 删除 ...
- css实现左边定宽右边自适应的5种方法总汇
在网页布局中,通常需要实现左边定宽右边自适应布局,默认html的结构如下: <div class="box"> <div class="left&quo ...
- HTML5(二)音频视频画布
HTML5 Audio(音频) 定义和用法 <audio src="someaudio.wav" controls="controls"> 您的浏览 ...
- SQL基础随记3 范式 键
SQL基础随记3 范式 键 什么是范式?哈,自己设计会使用但是一问还真说不上来.遂将不太明晰的概念整体下 什么是 & 分类 范式(NF),一种规范,设计数据库模型时对关系内部各个属性之间的 ...
- 免费馅饼——移动dp
免费馅饼 题目描述 SERKOI最新推出了一种叫做"免费馅饼"的游戏: 游戏在一个舞台上进行.舞台的宽度为 \(W\) 格,天幕的高度为 \(H\) 格,游戏者占一格. 开始时游戏 ...
- 【线型DP】洛谷P2066 机器分配
[线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...