设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 开源资讯 查看内容

如何将Spring Cloud Netflix框架集成到现有API中

2016-11-24 21:48| 发布者: joejoe0332| 查看: 1966| 评论: 0|原作者: 花间_拾零, debugging, 无若, 爱不爱吃鱼, Tocy, 武汉加油|来自: oschina

摘要: 当前,RESTful API可能已经在你所在的组织中达到了某种程度的成功。当越来越多的微服务或API涌现出来时,API间的依赖也随之增长,对服务的要求也更多的落在了提供尽可能稳定的API或微服务。通常,这个过程以多实例运 ...

当前,RESTful API可能已经在你所在的组织中达到了某种程度的成功。当越来越多的微服务或API涌现出来时,API间的依赖也随之增长,对服务的要求也更多的落在了提供尽可能稳定的API或微服务。通常,这个过程以多实例运行及某种形式的负载均衡展开,以满足需求。

Netflix (OSS) Spring Cloud项目

随着Netflix's (OSS) Spring Cloud项目的流行和成功,或许可以考虑将它集成到那些以任务为关键的API里。Netflix的项目建立在Spring Boot框架之上,提供了如下组件:

  • Eureka用于Spring管理下的bean服务发现

  • Zuul处理路由服务,被视为请求的”守门员“

  • Ribbon用于动态路由和负载均衡

  • Hystrix提供了断路器功能,以处理无响应的API调用

  • Turbine提供了关于Hystrix的全部可用断路器的信息

同时推荐使用Spring Cloud Config,它把应用配置集中到了一个Git仓库。

第一步:使用Spring Boot

如果你的API或微服务是在Spring Boot的基础上构建的,那么你的当前准备已就绪,可以直接进入下节。然而,你的服务很可能并没有在Spring Boot上运行,如果是这样,你需要采取一些措施,才能使用Netflix提供给社区的OSS工具。

对于初学者,请参考当前Spring Boot文档中的将已有项目转换到Spring Boot章节。文中对转换的过程提供了一些注意事项和建议(文章还指出,将非web应用,如API服务,转换到Spring Boot会更容易一些)。此时需要将创建ApplicationContext的代码替换为调用SpringApplication的代码。Application类需要继承SpringBootServletInitializer,然后启用Spring Boot自动配置:

1
2
3
4
5
6
7
8
9
10
11
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends
SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(
    SpringApplicationBuilder application) {
        return application;
    }
}

可以添加如下的main方法,以启动应用:

1
2
3
public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

对于已有的Servlet应用,如果用的是3.0以上的版本,转换工作会简单很多,尤其是用了Spring Servlet初始化工具支持类的。

对于更复杂的应用,需要先进行分析,以决定最佳实践是否是重新开始一个Spring Boot应用,然后将原有类和方法迁移到这个新应用中。

当你可以启动Spring Boot应用,并且也验证过API之后,就可以引入Netflix的组件了。

创建Eureka和Zuul服务器

要添加的第一个服务器是Eureka服务器,它将用于处理服务发现。 Eureka服务器是一个标准的Spring Boot应用程序,使用简单的main()方法:

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableEurekaServer 
@EnableDiscoveryClient
public class EurekaApplication {
    public static void main(String[] args) { 
        SpringApplication.run(
           EurekaApplication.class, args);
    
 }

Zuul服务器将充当网守,或者最终为您的微服务连接主服务器。这里,使用以下main()方法创建另一个标准的Spring Boot应用程序实例:

1
2
3
4
5
6
7
8
9
10
@SpringBootApplication 
@Controller
@EnableZuulProxy
public class ZuulApplication {
    public static void main(String[] args) { 
        new SpringApplicationBuilder(
            ZuulApplication.class
            .web(true).run(args);
    }
}

此时,Zuul服务器已启动,正在运行,并准备好处理使用Eureka注册的请求。 默认情况下,功能区服务也将运行,作为负载平衡器,客户端通过Zuul访问该服务。

更新微服务/API

为了用Eureka注册服务, 需要把@EnableDiscoveryClient注解加到应用程序的类中, 如下面的例子:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) { 
        SpringApplication.run(Application.class, args);
    
}

当服务启动时, 会开启Eureka注册, 这样就可以通过Zuul网关服务器访问Eureka。这时候,你可以引进服务的多个实例。这些实例会通过Zuul服务器中的Ribbon进行自动注册和加载.

添加 Hystrix 和 Turbine 到 Mix 中

这时,客户端可以通过Zuul服务来访问你的服务。从监查的角度来看, 添加Hystrix和引入Eureka 及Zuul服务器一样容易——只需启动基础Spring Boot应用,然后使用@EnableHystrixDashboard注解。

1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
@Controller
@EnableHystrixDashboard
public class HystrixDashboardApplication extends 
SpringBootServletInitializer {
   public static void main(String[] args) { 
       new SpringgApplicationBuilder(
           HystrixDashboardApplication.class
           .web(true).run(args);
   
}

设置Turbine,添加@EnableTurbineAmqp注解到其他基础Spring Boot应用:

1
2
3
4
5
6
7
8
9
@SpringBootApplication 
@EnableTurbineAmqp 
@EnableDiscoveryClient
public class TurbineApplication {
    public static void main(String[] args) { 
        new SpringApplicationBuilder(
            TurbineApplication.class).run(args);
    
}

增加"断路器"功能

Netflix Hystrix 为此服务的使用者提供了断路器功能。如果服务器停止响应,Hystrix 能够把 API 调用重定向到此服务的内部方法中去。这样,应用程序就能处理服务不响应的情况。

Hystrix 拥有以下功能:它能在此后的每次调用都打开回路并且“快速失败”(忽略当前的服务调用只使用内部的方法),这种状况将持续,直到服务变得可用为止。

Hystrix 产品提供了一个看板,能提供被监测的服务的动态列表。

在上面的 Hystrix 看板图中,能看到 getMovie 这个 API 调用当前没有响应,导致回路一直处于打开状态,从而会一直调用已经配置好的回调方法。

为了在程序中使用"断路器"功能,你需要在 Spring 启动程序中添加使用 @EnableCircuitBreaker 注释标签。从那里,可以使用 @HystrixCommand() 注释标签,示例如下:

1
2
3
4
5
6
7
8
9
@HystrixCommand(fallbackMethod = "baseResults")
public ResponseEntity<List<Result>> getResults(Long id) {
    ...
}
 
public ResponseEntity<List<Result>> getBaseResults(Long 
id) {
    ... 
}

在上面的代码示例中,当服务调用 getResults() 方法遇到服务超时的错误时候,getBaseResults() 方法就会被调用直到回路被关闭——一旦失败的服务问题重新联机,就会发生这种情况


挑战

到了这一步,你的核心应用程序或API将作为一个拥有单个或多个实例的Spring Boot应用运行。这些实例在Eureka服务中注册,并为Zuul网关的请求提供服务,其中也包括用于负载平衡的Ribbon。当一项服务停止响应时,由于网络和服务的超时设定,Hystrix断路器会打开并提供可用的后降方法。Netflix的Spring Cloud项目功能也相当不错,但它也面临着一些挑战。

最大的挑战是对开发者的影响,他们可能已经习惯于一种单一的应用程序服务实例运行。而现在,开发者不得不确保额外的两个服务(Eureka和Zuul)运行——这就增加了本地开发的工作复杂度。

当然,依赖另一个通过Eureka传达的服务也会让工作变得复杂——这可能会使本地运行受限。在这种情况下,开发者或许会需要用另一个名字在Eureka上注册一个当地服务器实例——当它与集中式配置服务一起使用时可能存在挑战。


展望未来

本文的目的是回顾 Netfix Spring Cloud 项目包含的组件。因为考虑到生产环境,此文故意省略了多个 Zuul 和 Eureka 实例。此外,由于类似的原因,我没有深入 Spring 配置的细节, RabbitMQ 的使用, Hystrix 和 Turbine 的功能。

如果您的 API 或者微服务已经达到这一步,那么,由 Netflix 的 Spring Cloud 项目提供的特性和功能将使它成为不二之选,我强烈建议您为解决方案多花些时间,以评估使用的开源软件。尽管将您的服务转换为 Spring Boot需要时间和精力,但是从长期收益来看,这短时间内的付出是值得的。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部