Hystrix Dashbord
Hystrix Metrics Stream的使用
Hystrix Metrics Stream可以监听当前项目中调用微服务的情况。
Hystrix(注意是单纯的Hystrix) 提供了对于微服务调用状态的监控(信息), 但是,需要结合spring-boot-actuator模块一起使用。
在已经引入Hystrix的项目中引入下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
需要注意的是, 在Spring Finchley 版本以前访问路径是/hystrix.stream,如果是Finchley 的话还得在yml里面加入下面的配置
management:
endpoints:
web:
exposure:
include: '*'
这里的配置是因为spring Boot 2.0.x以后的Actuator 只暴露了info 和health 2个端点,这里我们把所有端点开放。
然后访问/actuator/hystrix.stream便可以看见微服务调用的状态信息。
这里会发现没有任何信息
我们来调用几个接口看看
这些密密麻麻的,就是我们的微服务监控的信息, 但是, 这种json格式的字符串, 难免会让人不太好阅读, 所以, 这时候需要借助HystrixDashbord将这些json数据可视化成我们能接收的图表信息。
HystrixDashbord项目的启动
Dashbord 翻译一下的意思是 仪表盘, 顾名思义, hystrix监控信息的仪表盘, 那这个仪表盘到底是什么样子呢? 以及怎么来使用呢?
我们需要重新创建一个项目,负责查看这些监听到的信息。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- @EnableHystrixDashboard注解
在spring boot启动类上面加入注解@EnableHystrixDashboard
- 访问/hystrix
启动项目后访问/hystrix能看见一个类似tomcat的首页
在中间这个输入框中,填入需要监控的微服务的监控地址,也就是/actuator/hystrix.stream,比如上面的http://localhost:4001/actuator/hystrix.stream
,点击按钮Monitor Stream,就会跳转到仪表盘页面
Hystrix仪表盘解释
- 实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色因为失败会变成红色。
同时该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。
所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。 - 曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
Spring-Cloud-Config
概述
我们既然要做项目, 那么就少不了配置,传统的项目还好,但是我们微服务项目, 每个微服务就要做独立的配置, 这样难免有点复杂, 所以, config项目出现了,它就是为了解决这个问题, 把你所有的微服务配置通过某个平台。
比如 github, gitlib 或者其他的git仓库进行集中化管理(当然,也可以放在本地)。
可能这样讲有点抽象,我们来看一张图
config的使用
怎么配置这个confi呢? 我们刚刚说过 由一个config server 来管理所有的配置文件, 那么我们现在新建一个config server项目。
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- @EnableConfigServer注解
- yml配置
server:
port: 8080
spring:
application:
name: test
cloud:
config:
server:
git:
uri: https://github.com/513667225/my-spring-cloud-config.git #配置文件在github上的地址
# search-paths: foo,bar* #Configserver会在 Git仓库根目录、 foo子目录,以及所有以 bar开始的子目录中查找配置文件。
# clone-on-start: true #启动时就clone仓库到本地,默认是在配置被首次请求时,config server才会clone git仓库
#native:
#search-locations: classpath:/config #若配置中心在本地,本地的地址
- 启动项目
这里我在github上有一些配置文件
我们来看看test-config的内容
启动项目后, 我们可以通过名字来读取里面的配置信息,直接访问http://localhost:8082/test-config.yml
,这里访问的是最上面的配置
那我们要获取dev环境/或者test环境下的配置呢?通过-隔开即可。我们现在来访问 test-config-dev
同理如果要访问test环境下的配置, 改为test即可
- 访问规则
其实,config访问配置文件,是需要一个具体的访问规则的, 那么这个访问规则到底是什么呢? 我们可以在官网找到:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
- application:就是配置文件的名字
- profile:就是对应的环境
- label:就是不同的分支
由这个规则可见, 我们刚刚使用的是第二种规则。
- 查找子目录
config默认是从根目录查找的,所以如果配置文件放在根目录下的文件夹下那么是访问不到的,如下面这个foo文件夹下的test-config12.yml文件
所以我们可以配置search-paths属性,这样就可以读取到子文件夹下配置文件了
- 文件类型转换
而且对于yml和properties类型config可以完美转换, 也就是说你存的是yml但是可以读取为properties类型的反过来也是如此
客户端从config上获取配置
刚刚给大家简单演示了一下config 以及怎么读取配置, 不过实际开发中,更多的不是我们人为去获取,而是由微服务从config上加载配置,那么,怎么来加载呢?
首先,我们需要在我们的微服务加入一个依赖声明他是config的客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
需要注意的是,这个依赖不包括spring -boot依赖, 也就是说, 假设你这个项目要当作spring boot来启动的话, 还得依赖spring boot。
启动类不需要做改动, 标准的spring boot启动类即可,需要注意的是yml文件。
以前我们对于spring boot的配置 是在application.yml里面配置的,现在从config上读取配置的话,还得需要一个bootstrap.yml配置文件。
spring cloud有一个“引导上下文"的概念,这是主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。和主应用程序加载application.(yml或 properties)中的属性不同,引导上下文加载(bootstrap.)中的属性。配置在 bootstrap.*中的属性有更高的优先级,因此默认情况下它们不能被本地配置。
那么我们application.yml配置文件里面 只需要做一些简单的配置就可以了
spring:
application:
name: test-config
重点在于bootstrap.yml
spring:
cloud:
config:
name: test-config #这是我们要读取的配置文件名 对应获取规则的{application}
profile: dev #这个是要获取的环境 对应的便是{profile}
label: master #这个就是获取的节点 对应的是{label}
uri: http://localhost:8080/ #这就是我们config server的一个地址
那么他就会获取到我们刚刚看到的那个配置
server:
port: 8201
spring:
profiles: dev
application:
name: test-cloud-dev-2.0
我们来测试一下 看看他会不会使用这个8201端口启动
这里 我们查看启动信息,能发现他现在使用的是我们从config server上读取到的配置。
spring cloud config高可用
config 高可用可以通过很多种方式, 比如说搭建一个nginx
或者config server注册到eureka上,client端也注册到eureka上,则已经实现高可用。不过这样也只有eureka中注册的服务能够使用这些配置信息。
- 依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- application.yml
server:
port: 8082
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/513667225/my-spring-cloud-config.git #配置文件在github上的地址
search-paths: foo,bar* #Configserver会在 Git仓库根目录、 foo子目录,以及所有以 bar开始的子目录中查找配置文件。
clone-on-start: true #启动时就clone仓库到本地,默认是在配置被首次请求时,config server才会clone git仓库
#native:
#search-locations: classpath:/config #若配置中心在本地,本地的地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka #eureka服务端提供的注册地址 参考服务端配置的这个路径
instance:
instance-id: config-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
除了id不一样,集群中所有的config服务配置都一样
- 启动类
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigStart1 {
public static void main(String[] args) {
SpringApplication.run(ConfigStart1.class);
}
}
- 客户端读取配置
还需要注意的点就是当config server都注册完之后,client的配置文件bootstrap.yml进行以下改动
spring:
cloud:
config:
name: test-config
profile: dev
label: master
discovery:
enabled: true #支持eureka
service-id: test-config #服务名
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/