Spring Cloud 学习笔记二——Netflix

4 Spring Cloud Netflix

Spring Cloud 通过自动配置和绑定到Spring环境和其他Spring编程模型惯例,为Spring Boot应用程序提供Netflix OSS集成。 通过几个简单的注释,可以快速启用和配置应用程序中的常见功能模块,并使用久经考验的Netflix组件构建大型分布式系统。 提供的功能模块包括服务发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载均衡(Ribbon)。

4.1 服务发现:Eureka客户端

服务发现是microservice基础架构的关键原则之一。Eureka是Netflix服务发现的一种服务和客户端。

4.1.1 注册到Eureka

当一个客户端注册到Eureka,它提供关于自己的元数据(诸如主机和端口,健康指标URL,首页等)Eureka通过一个服务从各个实例接收心跳信息。如果心跳接收失败超过配置的时间,实例将会正常从注册里面移除。

可以使用@EnableEurekaClient@EnableDiscoveryClient注解。
配置eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/属性,注意修改URL地址。
确保spring.application.name有默认值。

@EnableEurekaClient只能用于Eureka,@EnableDiscoveryClient能用于zookeeper等其他注册组件。

@EnableEurekaClient使其成为Eureka实例(被其他服务发现)和客户端(能发现其他服务)注册到应用里面。可通过eureka.instance.*进行相关配置的修改。

4.1.2 对Eureka服务的身份验证

如果其中一个eureka.client.serviceUrl.defaultZone的url已经把凭证嵌入到它里面,那么HTTP基本的身份验证将会被自动添加到你的eureka客户端(curl风格,如http://user:password@localhost:8761/eureka)。 对于更复杂的需求,可以创建一个带“@Bean”注解的“DiscoveryClientOptionalArgs”类型并且为它注入“ClientFilter”实例。

4.1.3 健康指标和状态页面

健康指标和状态页面分别对应一个Eureka实例的“/health”和“/info”。

4.1.4 注册一个安全应用

若要用HTTPS,需要设置两个标记,分别是EurekaInstanceConfig,即eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true]

4.1.5 Eureka 健康检查

默认情况下,Eureka使用客户端心跳来确定一个客户端是否活着(状态为“UP”)。

4.1.6 Eureka给客户端和实例的元数据

有标准的元数据,如主机名、IP地址、端口号、状态页面和健康检查。额外的元数据可以被添加到实例注册在eureka.instance.metadataMap里面。

在 Cloudfoundry 使用 Eureka
Cloudfoundry有总的路由,所有在同个应用的实例有相同的主机名。

在AWS上使用Eureka
定制EurekaInstanceConfigBean

修改Eureka实例ID
通过eureka.instance.instanceId进行配置。

4.1.7 使用EurekaClient

使用@EnableDiscoveryClient(或@EnableEurekaClient),使它从Eureka Server发现服务实例。

注:不要在@PostConstruct方法或@Scheduled方法使用EurekaClient(或任何ApplicationContext还没被启动的地方)。

4.1.8 代替原生的Netflix EurekaClient

Spring Cloud已经支持Feign(一个REST客户端构建)跟Spring RestTemplate(使用逻辑Eureka服务标识符(VIPs)代替物理的URL)。

4.1.9 为什么注册一个服务这么慢?

实例默认与注册中心持续30秒的周期心跳(通过客户的serviceUrl)。当实例、服务端和客户端全都在它们的缓存里面拥有相同的元数据(这可能还需要3次心跳),那么服务对于客户端的discovery将变为不可用。可通过eureka.instance.leaseRenewalIntervalInSeconds这个修改配置,可以加快这一进程的客户端连接到其他服务。

4.2 服务发现: Eureka Server

例子,添加依赖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功能。

4.2.1 高可用

Eureka服务端没有后台存储,但是服务实例在注册里面全都得发送心跳去保持注册更新(在内存里操作)客户端们也有一份内存缓存着eureka的注册信息。

4.2.2 标准模式

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

4.2.3 节点感知

运行多个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。

4.2.4 IP偏好

设置eureka.instance.preferIpAddress=true使应用注册到eureka的是IP地址而不是主机名。

4.3 断路器:Hystrix

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()方法了。

4.3.1 传播安全上下文或使用 Spring Scopes

如果你想一些线程的本地的上下文传播到一个@HystrixCommand,默认声明将不会工作,因为他在线程池里执行命令。(在超时的情况下)。你可以切换Hystrix去使用同个线程让调用者使用一些配置,或直接在注解中,让它去使用不同的“隔离策略”。举例:

@HystrixCommand(fallbackMethod = "stubMyService",commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy",value="SEMAPHORE")
    }
)
...

如果你使用@SessionScope@RequestScope同样适用。你会知道你要这么做,因为一个runtime异常说他不能找到作用域上下文。

4.3.2 健康指标

连接的断路器的状态也暴露在应用程序的/health端点中。

4.3.3 Hystrix 指标流

添加依赖org.springframework.boot.spring-boot-starter-actuator,使/hystrix.stream流作为一个管理端点。

4.4 断路器: Hystrix仪表盘

Hystrix的主要作用是会采集每一个HystrixCommand的信息指标,把每一个断路器的信息指标显示的Hystrix仪表盘上。

Hystrix仪表盘

环境需要

  • 添加依赖org.springframework.cloud.spring-cloud-starter-hystrix-dashboard
  • 主类上注解@EnableHystrixDashboard
  • 访问/hystrix
  • 填写链接http://host:port/hystrix.stream

4.4.1 Turbine

4.4.2 Turbine Stream

4.5 客户端负载均衡器:Ribbon

Ribbon是一个客户端负载均衡器,有很多控制HTTP和TCP客户端的行为,可使用@FeignClient注解。

4.5.1 自定义Ribbon客户端

4.5.2 在Eureka中使用Ribbon

4.5.3 示例: 没有Eureka时如何使用Ribbon

4.5.4 示例:禁用Eureka使用Ribbon

4.5.5 直接使用Ribbon的API

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
    }
}

4.6 声明REST客户端:Feign

4.7 外部配置:Archaius

4.8 路由和过滤器:Zuul

Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

  • 认证
  • Insights
  • 压力测试
  • 金丝雀测试(Canary Testing)
  • 动态路由
  • 服务迁移
  • 负载削减
  • 安全
  • 静态响应处理
  • 主动/主动交换管理

4.8.1 嵌入Zuul反向代理

Spring Cloud创建了一个嵌入式Zuul代理来缓和急需一个UI应用程序来代理调用一个或多个后端服务的通用需求,这个功能对于代理前端需要访问的后端服务非常有用,避免了所有后端服务需要关心管理CORS和认证的问题。

在Spring Boot主函数上通过注解@EnableZuulProxy来开启。

4.8.2 Cookies和敏感HTTP头

4.8.3 路由Endpoint

使用@EnableZuulProxy同时引入了Spring Boot Actuator,默认将增加一个endpoint,提供http服务的/routes

4.8.4 窒息模式和本地跳转

逐步替代旧的接口是一种通用的迁移现有应用程序或者API的方式,使用不同的具体实现逐步替换它们。Zuul代理是一种很有用的工具,因为你可以使用这种方式处理所有客户端到旧接口的请求。只是重定向了一些请求到新的接口。

4.8.5 通过Zuul上传文件

4.8.6 简单的嵌入Zuul

4.8.7 关闭Zuul过滤器

4.8.8 通过Sidecar进行多语言支持

4.9 RxJava with Spring MVC

Spring Cloud Netflix 包含 RxJava。

Spring Cloud Netflix提供并支持从Spring MVC Controllers返回rx.Single对象,还支持使用rx.Observable对象。

4.10 指标:Spectator,Servo,and Atlas

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下