第一批了解如何在云环境中运行其应用程序和服务的组织是大型互联网公司,其中许多都是我们今天所熟悉的云基础架构的先驱。这些公司投入了大量的时间和资源来构建库和框架,以便为基于某种语言框架的应用程序提供帮助,解决在云原生架构中运行服务的挑战。幸运的是这些早期的微服务实践者已经慷慨地分享了他们在微服务方面的实践,并贡献了源代码到社区中,例如阿里巴巴开源的微服务框架Dubbo、Netf lix向开源社区开放的微服务库、Spring Cloud微服务开发体系等。
具体来说,在实际项目开发过程中,对于Java程序员,如果采用了Netf lix或者Spring Cloud等微服务框架,那么势必会使用其程序库处理了云原生的一些问题,包括:
·Hystrix——熔断
·Ribbon——客户端负载均衡
·Eureka——服务注册和发现
·Zuul——动态代理
由于这些库是针对Java运行时的,因此只能用于Java项目。要使用它们,必须创建一个应用程序依赖项,将它们加入类路径,然后在应用程序代码中使用这些依赖库。通常来说,在Java应用程序构建中如果使用到Netf lix OSS程序库(譬如在应用系统中依赖Hystrix),就需要在依赖配置中添加如下信息:
<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>x.y.z</version> </dependency>
具体来说,要使用Hystrix,就需要使用基本的Hystrix类包装命令HystrixCommand,例如:
public class CommandHelloWorld extends HystrixCommand<String> {
private final String name;
public CommandHelloWorld(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
@Override
protected String run() {
// a real example would do work like a network call here
return "Hello " + name + "!";
}
}可能读者会疑惑为什么在服务网格的书籍中,会讲述类似于Netf lix OSS的开源微服务框架。其实,两者所解决的问题是类似的,即微服务架构中分布式特点带来的复杂性问题;然而,两者解决相同问题的方式手段不尽相同,在后续章节中我们希望能通过对Istio网格的讲解,让读者理解它们之间的差异。