Spring Cloud 经过自动配置和绑定到Spring环境和其余Spring编程模型惯例,为Spring Boot应用程序提供Netflix OSS集成。 经过几个简单的注释,能够快速启用和配置应用程序中的常见功能模块,并使用久经考验的Netflix组件构建大型分布式系统。 提供的功能模块包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载均衡(Ribbon)。前端
服务发现是microservice基础架构的关键原则之一。Eureka是Netflix服务发现的一种服务和客户端。java
当一个客户端注册到Eureka,它提供关于本身的元数据(诸如主机和端口,健康指标URL,首页等)Eureka经过一个服务从各个实例接收心跳信息。若是心跳接收失败超过配置的时间,实例将会正常从注册里面移除。web
可使用@EnableEurekaClient
或@EnableDiscoveryClient
注解。
配置eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
属性,注意修改URL地址。
确保spring.application.name
有默认值。spring
注:@EnableEurekaClient
只能用于Eureka,@EnableDiscoveryClient
能用于zookeeper等其余注册组件。编程
@EnableEurekaClient
使其成为Eureka实例(被其余服务发现)和客户端(能发现其余服务)注册到应用里面。可经过eureka.instance.*
进行相关配置的修改。后端
若是其中一个eureka.client.serviceUrl.defaultZone
的url已经把凭证嵌入到它里面,那么HTTP基本的身份验证将会被自动添加到你的eureka客户端(curl风格,如http://user:password@localhost:8761/eureka
)。 对于更复杂的需求,能够建立一个带“@Bean”注解的“DiscoveryClientOptionalArgs”类型而且为它注入“ClientFilter”实例。api
健康指标和状态页面分别对应一个Eureka实例的“/health”和“/info”。spring-mvc
若要用HTTPS,须要设置两个标记,分别是EurekaInstanceConfig
,即eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true]
。缓存
默认状况下,Eureka使用客户端心跳来肯定一个客户端是否活着(状态为“UP”)。安全
有标准的元数据,如主机名、IP地址、端口号、状态页面和健康检查。额外的元数据能够被添加到实例注册在eureka.instance.metadataMap
里面。
在 Cloudfoundry 使用 Eureka
Cloudfoundry有总的路由,全部在同个应用的实例有相同的主机名。
在AWS上使用Eureka
定制EurekaInstanceConfigBean
修改Eureka实例ID
经过eureka.instance.instanceId
进行配置。
使用@EnableDiscoveryClient
(或@EnableEurekaClient
),使它从Eureka Server发现服务实例。
注:不要在@PostConstruct
方法或@Scheduled
方法使用EurekaClient(或任何ApplicationContext还没被启动的地方)。
Spring Cloud已经支持Feign(一个REST客户端构建)跟Spring RestTemplate(使用逻辑Eureka服务标识符(VIPs)代替物理的URL)。
实例默认与注册中心持续30秒的周期心跳(经过客户的serviceUrl
)。当实例、服务端和客户端全都在它们的缓存里面拥有相同的元数据(这可能还须要3次心跳),那么服务对于客户端的discovery将变为不可用。可经过eureka.instance.leaseRenewalIntervalInSeconds
这个修改配置,能够加快这一进程的客户端链接到其余服务。
例子,添加依赖spring-cloud-starter-eureka-server
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
服务端有一个带UI的首页,HTTP API端点在/eureka/*
下提供标准的Eureka功能。
Eureka服务端没有后台存储,可是服务实例在注册里面全都得发送心跳去保持注册更新(在内存里操做)客户端们也有一分内存缓存着eureka的注册信息。
eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
运行多个Eureka Servers。
Eureka甚至能够更有弹性和可用的运行多个实例,并让他们互相注册。事实上,这也是默认的行为,所以全部你须要让它工做的,只要添加一个有效的节点serviceUrl,例如:
--- spring: profiles: peer1 eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2/eureka/ --- spring: profiles: peer2 eureka: instance: hostname: peer2 client: serviceUrl: defaultZone: http://peer1/eureka/
而后经过不一样的“profile”进行运行不一样的Eureka Server。
设置eureka.instance.preferIpAddress=true
使应用注册到eureka的是IP地址而不是主机名。
Netflix建立了一个库实现断路器模式,名为Hystrix。一个低水平的服务群中一个服务挂掉会给用户致使级联失效的。当调用一个特定的服务达到必定阈值(在Hystrix里默认是5秒内20个失败),断路器开启而且调用没有成功的。开发人员可以提供错误缘由和开启一个断路由回调。
例子,需添加依赖org.springframework.cloud.spring-cloud-starter-hystrix
@SpringBootApplication @EnableCircuitBreaker public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } @Component public class StoreIntegration { @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { //do stuff that might fail } public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } }
经测试,失败就直接调用defaultStores()方法了。
若是你想一些线程的本地的上下文传播到一个@HystrixCommand,默认声明将不会工做,由于他在线程池里执行命令。(在超时的状况下)。你能够切换Hystrix去使用同个线程让调用者使用一些配置,或直接在注解中,让它去使用不一样的“隔离策略”。举例:
@HystrixCommand(fallbackMethod = "stubMyService", commandProperties = { @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE") } ) ...
若是你使用@SessionScope
或@RequestScope
一样适用。你会知道你要这么作,由于一个runtime异常说他不能找到做用域上下文。
链接的断路器的状态也暴露在应用程序的/health
端点中。
添加依赖org.springframework.boot.spring-boot-starter-actuator
,使/hystrix.stream
流做为一个管理端点。
Hystrix的主要做用是会采集每个HystrixCommand的信息指标,把每个断路器的信息指标显示的Hystrix仪表盘上。
环境须要
org.springframework.cloud.spring-cloud-starter-hystrix-dashboard
@EnableHystrixDashboard
/hystrix
http://host:port/hystrix.stream
略
略
Ribbon是一个客户端负载均衡器,有不少控制HTTP和TCP客户端的行为,可以使用@FeignClient
注解。
略
略
略
略
public class MyClass { @Autowired private LoadBalancerClient loadBalancer; public void doStuff() { ServiceInstance instance = loadBalancer.choose("stores"); URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort())); // ... do something with the URI } }
略
略
Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
Spring Cloud建立了一个嵌入式Zuul代理来缓和急需一个UI应用程序来代理调用一个或多个后端服务的通用需求,这个功能对于代理前端须要访问的后端服务很是有用,避免了全部后端服务须要关心管理CORS和认证的问题。
。
在Spring Boot主函数上经过注解@EnableZuulProxy
来开启。
使用@EnableZuulProxy
同时引入了Spring Boot Actuator,默认将增长一个endpoint,提供http服务的/routes
。
逐步替代旧的接口是一种通用的迁移现有应用程序或者API的方式,使用不一样的具体实现逐步替换它们。Zuul代理是一种颇有用的工具,由于你可使用这种方式处理全部客户端到旧接口的请求。只是重定向了一些请求到新的接口。
Spring Cloud Netflix 包含 RxJava。
Spring Cloud Netflix提供并支持从Spring MVC Controllers返回rx.Single
对象,还支持使用rx.Observable
对象。
略