Spring Cloud包含了非常多的子框架,其中,Spring Cloud Netflix是其中一套框架,由Netflix开发后来又并入Spring Cloud大家庭,它主要提供的模块包括:服务发现、断路器和监控、智能路由、客户端负载均衡等。
组件
Spring Cloud Netflix框架刚好就满足了上面所有的需求,而且最重要的是,使用起来非常的简单。Spring Cloud Netflix包含的组件及其主要功能大致如下:
1、Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。
2、Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。
3、Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。
4、Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。
5、Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。
6、Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。
7、Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。
一个web项目使用spring cloud大致是这样的,如下图
Eureka(服务的发现和注册)
具体的用法的话,我看了也跟Spring Cloud config一样,也是分为server,client,具体配置其实网上很多,也比较简单,这里我就不多说server,client怎么弄的问题。具体的可以看一下我的github,里面有我简单写的eurekas项目,大家可以参考一下https://github.com/zfh1038030621/spring-cloud/tree/master/eureka(里面有server集群,服务注册的案例)。我以前是用dubbo+zk的,所以这个eureka的作用就是zk,差不多,很好理解
这里先讲一下一些概念。
1,Eureka构架
这是官方的一个图
重要的点:
1,eureka的自我保护机制(简单的说就是因为调用方跟server之间因为网络问题之类的导致超过80百分之的服务都不能调用,这时候eureka采用的机制),eureka.server.enable-self-preservation # 设为false,关闭自我保护(一般本地调式的时候最好是关闭的,默认是打开的)
2,zone可以理解为机房,region理解为区域(好比我们的游戏之类的,有什么华东区,华北区这种概念),一个region包含多个zone,下面会更详细的讲一下
3,eureka.client.registry-fetch-interval-seconds设置eureka-client获取服务信息的间隔时间,默认是30秒
4,通过eureka.instance.lease-renewal-interval-in-seconds来设置发送心跳的频率
5,eureka.instance.lease-expiration-duration-in-seconds设置视为失效的时间(上次收到心跳时间和下一次收到心跳的时间),默认90秒,大小要适当写,至少要大于第4个值的心跳频率时间
Eureka支持Region和Zone的概念。其中一个Region可以包含多个Zone。Eureka在启动时需要指定一个Zone名,即当前Eureka属于哪个zone, 如果不指定则属于defaultZone。Eureka Client也需要指定Zone, Client(当与Ribbon配置使用时)在向Server获取注册列表时会优先向自己Zone的Eureka发请求,如果自己Zone中的Eureka全挂了才会尝试向其它Zone。当获取到远程服务列表后,Client也会优先向同一个Zone的服务发起远程调用。Region和Zone可以对应于现实中的大区和机房,如在华北地区有10个机房,在华南地区有20个机房,那么分别为Eureka指定合理的Region和Zone能有效避免跨机房调用,同时一个地区的Eureka坏掉不会导致整个该地区的服务都不可用。
对于eureka中的region和zone的关系,网上还有这么一个图
eureka 的一些技术整合
1,eureka增加权限
Eureka自带了一个web的管理页面,方便我们查询注册到上面的实例信息
但是有一个问题是如果这个地址有公网IP的话,必然能直接访问到,这样是不安全的
如何解决这个问题呢?加用户认证即可
通过spring-security来开始用户认证
org.springframework.boot
spring-boot-starter-security
然后在application.properties中加上认证的配置信息
security.basic.enabled=true #开启认证
security.user.name=goojia #用户名
security.user.password=goojia123456 #密码
重新启动注册中心,访问 http://localhost:8761/ 此时浏览器会提示你输入用户名和密码,输入正确后才能继续访问Eureka提供的管理页面。
注册中心开启认证后,项目中的注册中心地址的配置也需要改变,需要加上认证的用户名和密码
eureka.client.serviceUrl.defaultZone=http://用户名:密码localhostr:8761/eureka/
2,整合eureka和swagger
在服务比较多的情况下,突然想看某个服务的API 文档
虽然外面使用了Swagger来进行API的管理,但是还是得找到对应的服务,然后访问Swagger的管理页面才行。
为了方便查询文档,把这个功能集成到Eureka中,这样就很方便了
默认的Instances也是有链接跳转的,外面需要把这个跳转改成Swagger的管理页面
这样直接点击fsh-house:192.168.10.170:2101
就能跳转到Swagger
很简单,只需要加上下面的配置即可:
eureka.instance.status-page-url=http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html
3,Eureka事件监听
今天为大家介绍另外一种实现的方式,在Eureka服务中进行检测通知,Eureka中提供了事件监听的方式来支持扩展。
- EurekaInstanceCanceledEvent 服务下线事件
- EurekaInstanceRegisteredEvent 服务注册事件
- EurekaInstanceRenewedEvent 服务续约事件
- EurekaRegistryAvailableEvent Eureka注册中心启动事件
- EurekaServerStartedEvent Eureka Server启动事件
import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.netflix.eureka.server.event.*;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* Eureka事件监听
*
* @author yinjihuan
* @create 2018-03-09 13:45
**/
@Component
public class EurekaStateChangeListener {
@EventListener
public void listen(EurekaInstanceCanceledEvent event) {
System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务下线");
}
@EventListener
public void listen(EurekaInstanceRegisteredEvent event) {
InstanceInfo instanceInfo = event.getInstanceInfo();
System.err.println(instanceInfo.getAppName() + "进行注册");
}
@EventListener
public void listen(EurekaInstanceRenewedEvent event) {
System.err.println(event.getServerId() + "\t" + event.getAppName() + " 服务进行续约");
}
@EventListener
public void listen(EurekaRegistryAvailableEvent event) {
System.err.println("注册中心 启动");
}
@EventListener
public void listen(EurekaServerStartedEvent event) {
System.err.println("Eureka Server 启动");
}
}
上面只是演示事件的效果,具体在什么事件中需要做什么操作,需要发邮件还是发短信,需要大家自己去实现。
监听的大概的实现机制大家可以看这篇文章
https://blog.csdn.net/qq_18416057/article/details/80912147