专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
zartbot  ·  从AI落地的视角看看Infra的需求 ·  2 天前  
zartbot  ·  从AI落地的视角看看Infra的需求 ·  2 天前  
51好读  ›  专栏  ›  分布式实验室

Spring Cloud Netflix概览和架构设计

分布式实验室  · 公众号  · 后端  · 2017-04-08 07:58

正文

请到「今天看啥」查看全文


Spring Cloud Netflix框架刚好就满足了上面所有的需求,而且最重要的是,使用起来非常的简单。Spring Cloud Netflix包含的组件及其主要功能大致如下:


  • Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。


  • Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。


  • Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。


  • Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。


  • Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。


  • Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。


  • Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。


下面就是使用上述的子框架实现的为服务架构的组架构图:



在上图中,有几个需要说明的地方:


  • Zuul网关也在注册中心注册,把它也当成一个服务来统一查看。 负载均衡不是一个独立的组件,它运行在网关、服务调用等地方,每当需要访问一个服务的时候,就会通过Ribbon来获得一个该服务的实例去掉用。Ribbon从Eureka注册中心获得服务和实例的列表,而不是发送每个请求的时候从注册中心获得。


  • 我们可以使用RestTemplate来进行服务间调用,也可以配置FeignClient来使用,不管什么方式,只要使用服务注册,就会默认使用Ribbon负载均衡。(RestTemplate需要添加@LoadBalanced)


  • 每个服务都可以开启监控功能,开启监控的服务会提供一个servlet接口/hystrix.stream,如果你需要监控这个服务的某一个方法的运行统计,就在这个方法上加一个@HystrixCommand的标签。


  • 查看监控信息,就是在Hystrix Dashboard上输入这个服务的监控url: http://serviceIp:port/hystrix.stream,就可以用图表的方式查看运行监控信息。


  • 如果要把所有的服务的监控信息聚合在一起统一查看,就需要使用Turbine来聚合所需要的服务的监控信息。


我们也可以从上图中看出该架构的部署方式:


  • 独立部署一个网关应用


  • 服务注册中心和监控可以配置在一个应用里,也可以是2个应用。


  • 服务注册中心也可以部署多个,通过区域zone来区分,来实现高可用。


  • 每个服务,根据负载和高可用的需要,部署一个或多个实例。


Spring Cloud Netflix组件开发


上面说到,开发基于Spring Cloud Netflix的微服务非常简单,一般我们是和Spring Boot一起使用,如果你想在自己原先的Java Web应用中使用也可以通过添加相关配置来实践。

有关开发的详细内容,可以参考Spring Cloud中文社区的这个系列文章,里面详细介绍了每一种组件的开发。这里,就只是来看一下服务注册中和监控模块的开发,还有服务调用的开发,其他的可以直接参考上面的系列文章。


注册和监控中心的开发


这个非常简单,就下面一个类:


// 省略import
@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard
public class ApplicationRegistry {
public static void main(String[] args) {
   new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}






请到「今天看啥」查看全文


推荐文章
全球见证分享网  ·  当你无可指望时,可以做这两件事
8 年前
机器学习研究会  ·  2017年6月历史文章汇总
8 年前