微服务进阶(四):Spring Cloud netflix概览及架构设计
文章目录
- 一、Spring Cloud 简介
- 二、微服务架构
- 三、Spring Cloud Netflix 组件以及部署
- 四、Spring Cloud Netflix 组件开发
- 4.1 注册和监控中心的开发
- 4.2 服务间调用
- 4.2.1 RestTemplate
- 4.2.2 FeignClient
- 五、遇到的问题
- 5.1 请求超时问题
- 5.2 服务ID的问题
- 5.3 管理路径的问题
- 5.3.1 注册成功却找不到服务
- 5.3.2 设置了管理路径的Hystrix监控
- 5.3.3 管理路径的安全性
- 5.4 服务间调用的权限验证
一、Spring Cloud 简介
Spring Cloud
是基于Spring Boot
的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟spring boot
框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。 Spring Cloud
包含了非常多的子框架,其中,Spring Cloud Netflix
是其中一套框架,由Netflix
开发后来又并入Spring Cloud
大家庭,它主要提供的模块包括:服务发现、断路器和监控、智能路由、客户端负载均衡等。
Spring Cloud Netflix
项目的时间还不长,并入spring cloud
大家族还是2年前,所以相关的使用文档还比较少,除了官方文档,国内也有一个中文社区。但是,如果是刚开始接触这个,想使用它搭建一套微服务的应用架构,总是会有不知如何下手的感觉。所以,这篇文章就是从整体上来看看这个框架的各个组件、用处是什么、如何相互作用。最后再结合实际的经验,介绍一下可能会出现的问题,以及针对一些问题,采用什么样的解决方案。
二、微服务架构
首先,来看看一般的微服务架构需要的功能或使用场景:
- 把整个系统根据业务特性拆分成几个子系统。
- 每个子系统可以部署多个应用,多个应用之间使用负载均衡。
- 需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现。
- 所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个
URL
请求由哪个服务处理。请求转发到服务上的时候也使用负载均衡。- 服务之间有时候也需要相互访问。例如有一个用户模块,其他服务在处理一些业务的时候,要获取用户服务的用户数据。
- 需要一个断路器,及时处理服务调用时的超时和错误,防止由于其中一个服务的问题而导致整体系统的瘫痪。
- 还需要一个监控功能,监控每个服务调用花费的时间等。
三、Spring Cloud Netflix 组件以及部署
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
中文社区的这个系列文章,里面详细介绍了每一种组件的开发。这里,就只是来看一下服务注册中和监控模块的开发,还有服务调用的开发,其他的可以直接参考上面的系列文章。
4.1 注册和监控中心的开发
这个非常简单,就下面一个类:
import@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard
public class ApplicationRegistry {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}
这里使用spring boot
标签的 @SpringBootApplication
说明当前的应用是一个spring boot
应用。这样就可以直接用main函数在IDE里面启动这个应用,也可以打包后用命令行启动。当然也可以把打包的war包用tomcat之类的服务器启动。 使用标签 @EnableEurekaServer
,就能在启动过程中启动Eureka
服务注册中心的组件。它会监听一个端口,默认是8761
,来接收服务注册。并提供一个web页面,打开以后,可以看到注册的服务。 添加 @EnableHystrixDashboard
就会提供一个监控页面,可以在上面输入要监控的服务的地址,就可以查看启用了Hystrix
监控的接口的调用情况。 当然,为了使用上面的组件,需要在maven
的POM
文件里添加相应的依赖,比如使用 spring-boot-starter-parent
,依赖 spring-cloud-starter-eureka-server
和 spring-cloud-starter-hystrix-dashboard
等。
4.2 服务间调用
在网上的各种文档中,对服务间调用,都没有说明的很清楚,所以这里特别说明一下这个如何开发。 有两种方式可以进行服务调用,RestTemplate
和FeignClient
。不管采用何种方式,都是通过REST
接口调用服务的http
接口,参数和结果默认都是通过jackson
序列化和反序列化。因为Spring MVC
的RestController
定义的接口,返回的数据都是通过jackson
序列化成json数据。
4.2.1 RestTemplate
使用这种方式,只需要定义一个RestTemplate
的Bean,设置成 LoadBalanced
即可:
@Configurationpublic class SomeCloudConfiguration {@LoadBalanced@BeanRestTemplate restTemplate() {return new RestTemplate();}
}
这样就可以在需要用的地方注入这个bean使用:
public class SomeServiceClass {@Autowiredprivate RestTemplate restTemplate;public String getUserById(Long userId) {UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class);return results;}
}
其中, users 是服务ID,Ribbon
会从服务实例列表获得这个服务的一个实例,发送请求,并获得结果。对象 UserDTO
需要序列号,它的反序列号会自动完成。
4.2.2 FeignClient
除了上面的方式,我们还可以用 FeignClient
。
@FeignClient(value = "users", path = "/users")public interface UserCompositeService {@RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)UserDTO getUserById(@PathVariable Long id);
}
只需要使用 @FeignClient
定义一个借口,Spring Cloud Feign
会生成一个它的实现,从相应的users服务获取数据。 其中, @FeignClient(value = “users”, path = “/users/getUserDetail”)
里面的value是服务ID,path是这一组接口的path前缀。 在下面的方法定义里,就好像设置Spring MVC
的接口一样,对于这个方法,它对应的URL
是 /users/getUserDetail/{id}
。 然后,在使用它的时候,就像注入一个一般的服务一样注入后使用即可:
public class SomeOtherServiceClass {@Autowiredprivate UserCompositeService userService;public void doSomething() {// ..... UserDTO results = userService.getUserById(userId);// other operation... }
}
五、遇到的问题
由于Spring Cloud
说明文档较少,微服务的架构相对来说也比较复杂,在开发的时候,难免会遇到很多问题,有一些是如何更好地使用这套框架去搭建架构,也有一些问题是如何配置。
5.1 请求超时问题
ZUUL
网关默认的超时时间非常短,这是为了保证调用服务的时候能够很快的响应。但是,会有一些业务方法运行的时间比较长,特别是在测试服务器。这时候,就需要调整超时时间。这个超时有几个地方:
- 负载均衡
Ribbon
,负载均衡有一个超时的设置,包括链接时间和读取时间 Hystrix
断路器也有一个超时设置,它需要在适当的时候返回,而不是一直等在一个请求上。
对应的配置如下:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 30000ribbon:ReadTimeout: 30000ConnectTimeout: 15000
5.2 服务ID的问题
服务的ID,也就是服务名,可以通过在application.yml
或者bootstrap.yml
里面设置:
spring:application:name: users
5.3 管理路径的问题
Spring Boot
的应用默认都是开放一些管理的接口,如 /info 、 /health 和metrics监控的接口 /metrics 等。如果使用默认的路径,使用Hystrix
监控、服务注册中心的监听服务状态都不会有问题,但是,如果想使用别的路径,例如 /management/info 、 /management/health ,那就牵扯到很多地方,而且,每个版本可能会或多或少的有一些问题,导致你遇到的问题还会不一样。我遇到过的问题有:
5.3.1 注册成功却找不到服务
首先,注册可以成功,在Eureka
服务器页面上也可以看到各个服务。但是,当通过网关调用的时候,却总是提示服务找不到。这时候可能就需要在每个服务的application.yml
里面进行如下配置:
eureka:instance:nonSecurePort: ${server.port}appname: ${spring.application.name}statusPageUrlPath: ${management.context-path}/infohealthCheckUrlPath: ${management.context-path}/health
简单来说,这就是告诉在注册的时候,同时告诉Eureka
服务器,服务的端口是什么,用来监听状态的路径是什么。这是因为由于使用了不同的管理接口路径,而Eureka
服务器没有使用相应的路径。 如果一切正常,在Eureka
服务器上点击一个注册的服务,应该能打开一个info页面。他可能是空白的,但是,至少Eureka
服务器能通过这个知道服务的运行正常。 这个问题也不是在所有的版本都存在,只是在某一些spring cloud
的版本存在。
5.3.2 设置了管理路径的Hystrix监控
刚才说了Hystrix
监控的路径是 http://serviceIp:port/hystrix.stream
,如果设置了管理接口的路径,那么这个监控路径也会变成http://serviceIp:port/${management.context-path}/hystrix.stream
。如果这时候,再想使用Turbine
聚合,Turbine
就会找不到了,因为它默认使用Eureka服务器上的服务器地址和端口,在后面添加/hystrix.stream
。这时候,就需要设置
Turbine:
turbine:aggregator:clusterConfig: USERappConfig: USERinstanceUrlSuffix:USER: /user/hystrix.stream
5.3.3 管理路径的安全性
对于微服务部署的几台机器,可以通过开通防火墙来控制谁可以访问管理接口,但是,即使是这样,为了安全性等,一般还是会把管理端接口也用spring security
来保护。这样一来,监控接口就没法直接访问了。
5.4 服务间调用的权限验证
一般API
接口都需要某种授权才能访问,登陆成功以后,然后通过token
或者cookie
等方式才能调用接口。 使用Spring Cloud Netfix
框架的话,登录的时候,把登录请求转发到相应的用户服务上,登陆成功后,会设置cookie
或header token
等。然后客户端接下来的请求就会带着这些验证信息,从ZUUL
网关传到相应的服务上进行验证。
ZUUL
网关在把请求转发到后台的服务的时候,会默认把一些header
传到服务端,如:Cookie, Set-Cookie, Authorization
。这样,客户端请求的相关headers
就可以传递到服务端,服务端设置的cookie
也可以传到客户端。 但是,如果想禁止某些header
透传到服务端,可以在ZUUL
网关的application.yml
配置里通过下面的方式禁用:
zuul:routes:users:path: /users/**sensitiveHeaders: Cookie,Set-Cookie,AuthorizationserviceId: user
刚才说了我们的某个服务有时候需要调用另一个服务,这时候,这个请求不是客户端发起,他的请求的header
里面也不会有任何验证信息。这时候,要么,通过防火墙等设置,保证服务间调用的接口,只能某几个地址访问;要么,就通过某种方式设置header
。 同时,如果想在某个服务里面获得这个请求的真实IP,(因为请求的通过网关转发而来,直接通过request
获得ip得到的是网关的IP),就可以从 headerX-Forwarded-Host
获得。如果想禁用这个header
,也可以:
zuul.addProxyHeaders = false
如果使用 RestTemplate
的方式调用,可以在请求里面添加一个有header
的Options
。 也可以通过如下的拦截器的方式设置,它对 RestTemplate
方式和 FeignClient
的方式都可以起作用:
@Beanpublic RequestInterceptor requestInterceptor() {return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate template) {String authToken= getToken();template.header(AUTH_TOKEN_HEADER, authToken);}};
}
微服务进阶(四):Spring Cloud netflix概览及架构设计相关推荐
- 微服务治理框架- - -Spring Cloud
前言:最近微服务很是火热,那么什么是微服务?相信小伙伴们对此也是一知半解,那么今天叶秋学长带领大家一起学习微服务治理框架Spring Cloud,快来跟着学长一起学习吧~~ 目录 对SpringCl ...
- 微服务为什么选Spring Cloud
转载自 微服务为什么选Spring Cloud 现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性.同时,支持微服务的技术栈也是多种多样的,本系列文章主要介绍这些技术 ...
- 微服务理念与Spring Cloud入门-----父工程与API子工程的创建教程
前言 随着软件工程的规模的迅速扩大,对响应的速度的要求的越来越高,软件的开发过程面临越来越大的挑战.为了提高开发的效率,和质量,以及对成本的压缩,对软件的模块化,以及希望像硬件模块一样,能即插即用,成 ...
- openfeign调用服务是否需要网关_阿里新一代微服务解决方案:Spring Cloud Alibaba
1.Spring Cloud Alibaba 是什么 Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合. ...
- turbine java_微服务搭建集成Spring Cloud Turbine详解
1.概述 本文中,我将向你介绍Spring Cloud Netflix Turbine.它将多个Hystrix Metrics Streams 聚合为一个,以便显示在一个仪表板视图中. 简要介绍Hys ...
- 微服务应用-基于Spring Cloud和Reactor构建网上商店微服务(下)
前言 上篇主要是讲解理论知识和项目架构要点,这篇将集中在微服务中使用spring Boot.Spring Cloud和Project Reactor实现事件溯源的原始主题.文章中也会介绍项目实现一些技 ...
- python微服务 企业管理_Python写的微服务如何融入Spring Cloud体系?
前言 在今天的文章中小码哥将会给大家分享一个目前工作中遇到的一个比较有趣的案例,就是如何将Python写的微服务融入到以Java技术栈为主的Spring Cloud微服务体系中?也许有朋友会有疑问,到 ...
- 01 | 顶层设计:微服务生态与 Spring Cloud Alibaba
通用的微服务架构应包含哪些组件 相对于单体式架构的简单粗暴,微服务架构将应用打散,形成多个微服务进行独立开发.测试.部署与运维.虽然从管理与逻辑上更符合业务需要,但微服务架构也带来了诸多急需解决的核心 ...
- 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway
作者:博云BoCloud| 前言 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用. ...
最新文章
- linux的套接口和管道
- 最新的SqlHelper 类
- 转】MYSQL性能调优与架构设计之select count(*)的思考
- C语言实验 圆周率1193,【圆周率】小数点后10000位,4个4个分,你能找到那些配对?...
- python调用ipython_在IPython中执行Python程序文件的示例
- 移动端的1px边框问题
- boost::geometry模块多边形叠加示例
- 零基础学Android之常用控件
- java多线程(一)-Thread类和Runnable接口
- matlab 置顶曲线,matlab figure 最大,最小,置顶
- 实习踩坑之路:集群场景下,我的redis锁为什么不生效啊?别的机器上的线程给解锁了?
- 纯css实现icon的网站,代码可复制
- 蚂蚁迷宫—有限状态机设计(ANT MAZE)
- 蓝牙技术|伦茨科技智能语音遥控器方案简介
- 阿西莫夫定律:自动驾驶汽车算不算机器人?该不该伤人?
- 使用Xcode的Instruments检测内存泄漏
- Windows 系统cmd设置添加静态路由方式
- 嵌入式文件服务器,嵌入式文件服务器
- 实现点击图片放大查看功能
- Java中ch.ethz.ssh2.Connection对象的使用
热门文章
- Android:安卓学习笔记之OkHttp原理的简单理解和使用
- 如何增强服务器io性能,云服务器磁盘io性能提升
- 阿里云怎样配置数据库服务器配置?
- 2020年稳超2019年,UCloud优刻得营收高速增长!
- 山东计算机一级选择题,计算机一级考试试题选择题(完整)
- python 最短路径算法_最短路径python
- AndroidStudio项目组件化maven上传gradle-router table注解产生库
- 原币金额与本币金额的区别
- 串口调试工具QCOM_V1.6安装包免费下载
- 【SemiDrive源码分析】【X9芯片启动流程】14 - freertos_safetyos目录Cortex-R5 SafetyOS/RTOS工作流程分析