Hudson是pistencup工具包的dotNET部分, 关于pistencup工具包请参考:pistencup.
如果你在寻找其他语言支持, 请参考: 已提供的支持
-
目前需要自行编译Hudson.Core并加入到项目依赖中.
-
在包含服务Api定义的项目中, 需要从nuget或自行编译添加对Refit项目的依赖.
-
Hudson依赖Steeltoe.Discovery来提供向eureka注册服务和从eureka获取服务列表的能力. 所以需要向appsetting.json文件添加相关配置:
"spring": {
"application": {
"name": "sample-server"
}
},
"eureka": {
"client": {
"serviceUrl": "http://eureka-server:10001/eureka/",
"shouldRegisterWithEureka": true
},
"instance": {
"port": 5000
}
}
using Refit;
using System.Threading.Tasks;
namespace SampleServer.Api
{
[WorkWithEureka("sample-server")]
//equals to [ServiceClient("http://cheok.com/", true)]
public interface ISample
{
[Get("/home/get123")]
Task<string> Get123();
[Get("/get321")]
Task<string> Get321();
}
}
WorkWithEurekaAttribute
是对ServiceClientAttribute
的简单扩展, 默认指定了workWithEureka
参数为true
. 被ServiceClientAttribute
或WorkWithEurekaAttribute
标记的接口, 会在应用启动时自动向IOC注册对应的HttpClient
. 在项目中可以直接通过ServiceProvider
获得实例并进行远程调用:
public class HomeController : Controller
{
private readonly CloudContext cloudContext;
private readonly ISample sampleClient;
private readonly ISampleApi sampleApiClient;
//从构造函数获得Api对象
public HomeController(ISample sampleClient, ISampleApi sampleApiClient, CloudContext cloudContext)
{
this.cloudContext = cloudContext;
this.sampleClient = sampleClient;
this.sampleApiClient = sampleApiClient;
}
public async Task<IActionResult> Index()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
//发起远程调用
string rst = await sampleClient.Get123();
dic.Add("sampleClient.Get123()", rst);
dic.Add("sampleClient.Get321()", await sampleClient.Get321());
dic.Add("sampleApiClient.Get(\"whosyourdaddy\")", Newtonsoft.Json.JsonConvert.SerializeObject(await sampleApiClient.Get("whosyourdaddy")));
dic.Add("cloudcontext", Newtonsoft.Json.JsonConvert.SerializeObject(cloudContext));
ViewData["dic"] = dic;
return View();
}
}
- 关于
CloudContext
对象:CloudContext
是调用上下文的持有者, 主要提供以下成员:
Field | 功能 | 描述 |
---|---|---|
RequestID | 请求标识 | 当前请求第一次到达服务端时生成的唯一标识, 这个标识会在所有后续调用中传递 |
PreviousSpanID | 上一个处理节点标识 | 请求头中获得的上一个处理块的标识, 用于构造请求链, 如果请求头中这个数据为空, 则说明这是第一个处理节点 |
CurrentSpanID | 当前处理块的标识 | 为当前处理节点生成的标识, 对于请求链中的第一个请求,这个值与RequestID一致 |
CallIndex | 调用序号 | 从请求头中获得的当前处理块在同级处理过程中的调用序号 |
GroupName | 处理分组 | 未完成功能, 用于标记当前请求由哪个分组的服务节点处理 |
CloudContext
的传递策略:
应用中请 不要 从构造函数构造CloudContext
对象, 使用ServiceProvider
来获取对每个请求共享的对象,避免对调用过程分析造成困扰.
- 更多例子,请clone并参考示例项目.