调用微服务的接口
约 780 字大约 3 分钟
2025-02-12
新增接口
首先,我们打开微服务的工程,在 DemoController 里面添加一个 HelloWorld 函数
public class DemoController : BaseController
{
/// <summary>
/// 我的第一个接口
/// </summary>
/// <param name="name">姓名</param>
/// <param name="age">年龄</param>
/// <returns></returns>
public string HelloWorld(string name,int age)
{
return $"Hi,{name} - {age}";
}
}
.Net 环境下调用微服务
新建一个.net 控制台工程,引用 nuget 包:Mirage.Invoker
var gateways = new NetAddress[]{ new NetAddress("127.0.0.1" , 8912) };
using (var rc = new Mirage.RemoteClient(gateways))
{
var service = rc.GetMicroService("DemoService");
var ret = service.Invoke<string>("HelloWorld", "Jack", 666);
//如果你的微服务是一个Asp.Net工程,方法名称应该传入asp.net controller的路由路径:
//var ret = service.Invoke<string>("/Demo/HelloWorld", "Jack", 666);
Console.WriteLine($"执行结果:{ret}");
}
.Net 下用客户端代码调用微服务
新建一个.net 控制台工程,引用 nuget 包:Mirage.Invoker
打开 状态浏览工具,点击【获取客户端代码】按钮
填写命名空间等基本信息
点击【确定】,把 DemoService.cs 文件生成到新建的控制台工程当中。
然后就可以通过对象的方式,去调用该服务。
var gateways = new NetAddress[]{ new NetAddress("127.0.0.1" , 8912) };
using (var rc = new Mirage.RemoteClient(gateways))
{
var service = rc.GetMicroService<Test.DemoService>();
var ret = service.HelloWorld("Jack", 666);
Console.WriteLine($"执行结果:{ret}");
}
这种方式的优势在于能看清楚服务里有什么方法、每个方法的注释、每个参数的注释,几乎等于一个 api 文档了。
基于Asp.Net工程改造的微服务,无法获取客户端代码。
前端调用微服务
提示
考虑到大部分微服务,都是只提供给内部使用,所以默认情况下,前端是无法访问的,需要在注册服务时,把 allowGatewayProxy 参数设置为“true”,前端才能通过 WebApi 访问。
打开微服务工程的Program.cs文件,找到 msp.Register<Controllers.DemoController> 这句代码,把第三个参数改为 true:
msp.Register<Controllers.DemoController>("DemoService", "测试服务", true);
“true”表示前端可以通过 http 协议来调用这个微服务。如果是“false”,则只有用特定的 sdk,并且可以直接访问到这个微服务所在服务器的情况下,才能调用它的接口。
所以,如果传“false”,通常是为了把这个微服务隐藏在内网,不给外网访问。
运行工程,我们再用工具去查看服务状态,可以看到服务名称呈现为绿色,表示这个服务是可以通过 http 访问的。
呈现前端接口文档
打开一个网页浏览器,在地址栏中输入以下 URL:http://webapi 地址/Miragedoc,这样就可以显示所有微服务的前端 API 文档。
从文档描述来看,通过 post json 的方式,把参数组合成数组,提交到WebApi即可。 简单写个 js 代码测试一下:
<script>
async function test(name,age) {
var ret = await fetch("http://127.0.0.1:5002/DemoService/HelloWorld",
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify([name, age])
});
if (ret.status == 200) {
alert(await ret.text());
}
else
alert("error");
}
test("Jack", 666);
</script>
运行结果: