Skip to content

启动客户端

Owen edited this page Apr 26, 2019 · 8 revisions

客户端跟服务端基本一样,也支持Web Host和Generic host

调用AddClient方法启用客户端

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddUragano(Configuration, builder =>
             {
                 builder.AddClient();
                 builder.AddConsul();
             });
        }

在实际微服务应用中,肯定会有一个服务调用另一个服务的情况,也就是说一个服务它既是服务端也是客户端,Uragano也是支持这种情况的,只需要同时调用AddClient和AddServer启动客户端和服务端即可

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddUragano(Configuration, builder =>
             {
                 builder.AddServer();
                 builder.AddClient();
                 builder.AddConsul();
             });
        }

调用服务

在客户端项目引入服务接口项目,注入对应的服务接口即可,就像调用本地方法一样调用远程方法

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private IHelloService HelloService { get; }
        public ValuesController(IHelloService helloService)
        {
            HelloService = helloService;
        }

        // GET api/values
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            return Ok(await HelloService.SayHello("Jack"));
        }
    }

元数据

元数据你可以理解成http里的headers,是k/v类型的。

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private IHelloService HelloService { get; }
        public ValuesController(IHelloService helloService)
        {
            HelloService = helloService;
        }

        // GET api/values
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            return Ok(await HelloService.SetMeta(("token", "Bearer .....")).SayHello("Jack"));
        }
    }

注意:元数据在服务对象实例的生命周期(Scoped)内,是共享一个字典对象,可能存在并发问题,目前还没有好的解决方案,如果你有好的建议请开一个issue。

那元数据在哪里接收呢?请查看拦截器

配置

"Uragano": {
    "Client": {
      "DefaultCert": {
        "url": "",
        "pwd": ""
      },
      "ServicesCert": {
        "RPC": {
          "url": "",
          "pwd": ""
        }
      }
    },
    "ServiceDiscovery": {
      "Consul": {
        "Client": {
          "Address": "http://localhost:8500"
        }
      }
    }
  }

如服务器端启用了Tls,客户需就要配置相应的证书:

ServicesCert:客户端需要连接的服务验证证书,Key是对应的服务名称,上面示例“RPC”即为服务的名称.

DefaultCert:默认证书,如果服务端启用了Tls,并且ServicesCert下找不到对应的证书时会默认采用此项配置。当所有的服务都使用相同的证书时就可以只配置默认证书即可。

Clone this wiki locally