使微服务支持回调的构想
2017-08-05 本文已影响15人
go_mars
高级编程语言几乎都支持把方法(函数)作为参数传递,在分布式环境下只要我们能定位方法的位置一样可以实现类似的功能,本文以目前流行的微服务框架Spring Cloud为例说明如何操作。
通过微服务框架中使用的服务发现和服务注册机制,我们可以获取关于服务的元数据,假设客户端在消费服务接口时可以使用这些元数据来创建访问该实例的代理,则传递这些元数据等同于传递了方法。
Spring Cloud中负责提供服务注册/发现功能的是Netflix Eureka(也可以使用其他方式),还有一个称为Netflix Feign的工具用于简化消费服务接口的过程,实现过程主要涉及到这两者。
@Import(FeignClientsConfiguration.class)
class FooController {
private FooClient fooClient;
private FooClient adminClient;
@Autowired
public FooController(
ResponseEntityDecoder decoder, SpringEncoder encoder, Client client) {
this.fooClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
.target(FooClient.class, "http://PROD-SVC");
this.adminClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
.target(FooClient.class, "http://PROD-SVC");
}
}
在上面这段代码中我们看到了创建一个服务代理所需要的信息,我们的目的是让这个过程自动化,形成一个闭环:让所有服务实例启动后向注册中心提交注册信息的时候都包含这些必要的信息。