我现在有一个asp.net core web api的新项目,我用它作为主要语言,但是有些接口是用java完成的,现在公司已经改为asp.net core作为主要语言。我可以再次使用asp.net core来完成这些接口,但是没有意义。于是网上查了资料,建议我用rpc来调用之前的接口。我该怎么办?
以其中一个java接口为例
@ApiOperation(value = "Send email registration verification code")
@GetMapping("send_code")
public JsonData sendRegisterCode(@ApiParam("Recipient") @RequestParam(value = "to", required = true) String to,
@ApiParam("Verification code") @RequestParam(value = "captcha", required = true) String captcha,
HttpServletRequest request
) {
String key = getCaptchaKey(request);
String cacheCaptcha = redisTemplate.opsForValue().get(key);
//Matching graphic verification code
if (captcha != null && cacheCaptcha != null && captcha.equalsIgnoreCase(cacheCaptcha)) {
//success
redisTemplate.delete(key);
JsonData jsonData = notifyService.sendCode(SendCodeEnum.USER_REGISTER, to);
return jsonData;
} else {
return JsonData.buildResult(BizCodeEnum.CODE_CAPTCHA_ERROR);
}
}
private String getCaptchaKey(HttpServletRequest request) {
String ip = CommonUtil.getIpAddr(request);
String userAgent = request.getHeader("User-Agent");
String key = "user-service:captcha:" + CommonUtil.MD5(ip + userAgent);
return key;
}
如何调用修改后的api?非常感谢有关文档和代码的任何建议!
现在是2024/05/21了,我也有类似的需求,写了一个Library来实现一个基于ASP.NET Core的简单的RPC框架:
ProjectFolder/
|
├── ServiceA/
| ├── SampleRpcController.cs <-- Implement RPC via interface (Server Side)
| ├── Program.cs
| └── ...
|
├── ServiceA.Shared/
| ├── ISampleRpcService.cs <-- Define RPC interface (Shared Project)
| └── ...
|
├── ServiceB/
| ├── AppController.cs <-- Call RPC via interface (Client Side)
| ├── Program.cs
| └── ...
跟着感觉走:
RPC Interface
提供的一些
Attributes
定义
ASP.NET Core
// In ServiceA.Shared/ISampleRpcService.cs
[HttpRoute("/api/v1/public")]
public interface ISampleRpcService : IRpcController
{
[HttpGet("int")]
int Add(int a, int b);
}
RPC Interface
// In ServiceA/SampleRpcService.cs
public class SampleRpcController : ControllerBase, ISampleRpcService
{
public int Add(int a, int b)
{
return a + b;
}
}
RPC Interface
调用RPC服务器// In ServiceB/AppController.cs
public class AppController
{
private readonly ISampleRpcService _sampleRpcService;
public AppController(ISampleRpcService sampleRpcService)
{
_sampleRpcService = sampleRpcService;
}
public int CallRPC()
{
return _sampleRpcService.Add(1, 2);
}
}
如果您有兴趣,欢迎使用这个库!
可以使用grpc模板创建项目:
参考文档:
https://learn.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-3.1
如果你想在现有项目上使用,可以这样做:
1.添加所需的NuGet包:
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
2.添加greet.proto
在 gRPC 客户端项目中创建 Protos 文件夹。
将 gRPC Greeter 服务中的 Protos\greet.proto 文件复制到 gRPC 客户端项目中的 Protos 文件夹。
将greet.proto文件中的命名空间更新为项目的命名空间 命名空间: 选项 csharp_namespace = "GrpcGreeterClient";
添加一个项目组,其中包含引用greet.proto文件的元素:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
3.创建Greeter客户端和使用gRPC Greeter服务测试gRPC客户端的具体步骤可参考官方文档: