优化阅读格式

This commit is contained in:
heibaiying
2019-07-31 17:39:13 +08:00
parent 3020ff8efa
commit 246e5cfca1
55 changed files with 10521 additions and 10482 deletions

View File

@ -12,7 +12,7 @@
## 一、config 简介
spring cloud config 分为服务端和客户端服务端称为分布式配置中心集中管理配置文件客户端为各个业务单元它们从配置中心获取相关配置同时config 还实现了配置热更新,在服务不停机的情况下刷新配置。
spring cloud config 分为服务端和客户端,服务端称为分布式配置中心,集中管理配置文件,客户端为各个业务单元,它们从配置中心获取相关配置,同时 config 还实现了配置热更新,在服务不停机的情况下刷新配置。
@ -117,13 +117,13 @@ spring:
password:
# 指定拉取的配置文件的存放位置,配置文件最后存储的目录为 basedir + search-paths
# 这个地方还需要注意的是,配置文件的仓库最好只放配置文件
# 因为配置中心不仅会拉取search-paths下的文件还会把uri指定仓库中的全部文件拉取到basedir下
# 因为配置中心不仅会拉取 search-paths 下的文件,还会把 uri 指定仓库中的全部文件拉取到 basedir
basedir: D:\git-config
# 指定分支
label: master
```
这里的git 仓库就是本用例的仓库,是公开的仓库,所以不用配置用户名和密码,配置文件如下
这里的 git 仓库就是本用例的仓库,是公开的仓库,所以不用配置用户名和密码,配置文件如下
- application.yml 为主配置;
- application-dev.yml 为开发环境配置。
@ -136,19 +136,19 @@ spring:
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/config-application-dev.png"/> </div>
这里需要注意的拉取配置的时候我们此时指定拉取的是dev配置application.yml实际 配置如下:
这里需要注意的拉取配置的时候,我们此时指定拉取的是 dev 配置application.yml 实际 配置如下:
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/config-dev.png"/> </div>
这说明在用配置中心拉取配置的时候和我们在本地开发的时候是一致的配置是互补的即dev中的实际配置应该是主配置和dev配置的结合且遵循同名属性精确优先的原则。
这说明在用配置中心拉取配置的时候,和我们在本地开发的时候是一致的,配置是互补的,即 dev 中的实际配置应该是主配置和 dev 配置的结合,且遵循同名属性精确优先的原则。
#### 3.5 http请求地址和资源文件映射
在本用例中如果我们想要直接访问主配置,用以下路径 http://localhost:8020/application.yml 是不行的,会得到错误页面。如果想要访问主配置,可以用http://localhost:8020/application-X.yml其中可以是任意字符原因是
在本用例中如果我们想要直接访问主配置,用以下路径 http://localhost:8020/application.yml 是不行的,会得到错误页面。如果想要访问主配置,,可以用 http://localhost:8020/application-X.yml其中可以是任意字符原因是
请求地址和实际的配置文件应该遵循以下规则application为配置文件名profile 为环境label为分支如果不指定默认就是master分支
请求地址和实际的配置文件应该遵循以下规则application 为配置文件名profile 为环境label 为分支(如果不指定默认就是 master 分支)。
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
@ -212,9 +212,9 @@ spring:
#### 4.2 新建 `bootstrap.yml`配置文件,指定注册中心地址和配置中心服务名,并在启动类上开启自动注册@EnableDiscoveryClient
这里需要特别说明的是在之前的所有项目中我们采用的配置文件都是application.yml,但是这里**一定要采用bootstrap.yml**。
这里需要特别说明的是,在之前的所有项目中我们采用的配置文件都是 application.yml,但是这里**一定要采用 bootstrap.yml**。
假设我们的数据库配置是放在远程配置中心的那么我们应该先去远程配置中心拉取配置然后再去进行数据库的自动化配置反之如果我们先进行了数据库的自动化配置那么就会因为找不到url或驱动而抛出异常。
假设我们的数据库配置是放在远程配置中心的,那么我们应该先去远程配置中心拉取配置,然后再去进行数据库的自动化配置,反之如果我们先进行了数据库的自动化配置,那么就会因为找不到 url 或驱动而抛出异常。
- bootstrap.ymlbootstrap.properties用来程序引导时执行应用于更加早期配置信息读取bootstrap.yml 先于 application.yml 加载。
@ -298,7 +298,7 @@ public class ConfigController {
#### 4.4 依次启动eureka,config-server,config-client ,访问 http://localhost:8030/programmer
这里需要注意是在启动eurekaconfig-server要稍等一会在启动config-client这里是为了确保config-server已经将服务注册到eureka然后我们的config-client才能从eureka中获取配置中心的服务。
这里需要注意是在启动 eurekaconfig-server要稍等一会在启动 config-client这里是为了确保 config-server 已经将服务注册到 eureka然后我们的 config-client 才能从 eureka 中获取配置中心的服务。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/config-client-programmer.png"/> </div>
@ -317,7 +317,7 @@ Located environment: name=config-client, profiles=[dev], label=master, version=5
在微服务的架构中我们通常想要构建一个共同的消息主题被所有微服务实例所监听以便对所有微服务实例的管理和通知这就是消息总线spring cloud bus 就是消息总线的一种实现。
目前spring cloud bus 支持的消息中间件有 RabbitMQkafka, 我们下面的整合采用的是RrabbitMQ。
目前 spring cloud bus 支持的消息中间件有 RabbitMQkafka, 我们下面的整合采用的是 RrabbitMQ。
关于热更新只需要对配置客户端config-client做更改不需要对config-server做改动。
@ -356,10 +356,10 @@ spring:
bus:
#开启总线
enabled: true
# 打开ack跟踪的标志默认关闭
# 打开 ack 跟踪的标志(默认关闭)
trace:
enabled: true
# 使用bus实现热更新
# 使用 bus 实现热更新
rabbitmq:
host: 127.0.0.1
port: 5672
@ -408,7 +408,7 @@ public class Programmer{
#### 5.4 依次启动eurekaconfig-server, config-client 服务
在client服务端启动时候可以在控制台 看到bus 自动创建了交换机、队列等
client 服务端启动时候,可以在控制台 看到 bus 自动创建了交换机、队列等
```
Created new connection: rabbitConnectionFactory#496c6d94:22/SimpleConnection@185d85d2 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 63713]

View File

@ -19,9 +19,9 @@
## 一、项目结构
eureka-server为服务注册中心负责服务的管理
eureka-server 为服务注册中心,负责服务的管理;
eureka-client 为eureka客户端
eureka-client 为 eureka 客户端;
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-eureka-cluster.png"/> </div>
@ -103,7 +103,7 @@ eureka:
defaultZone: http://127.0.0.1:8010/eureka/,http://localhost:8020/eureka/
```
需要注意的是Eureka互相注册要求各个Eureka实例的eureka.instance.hostname不同如果相同则会被Eureka标记为unavailable-replicas不可用副本
需要注意的是 Eureka 互相注册要求各个 Eureka 实例的 eureka.instance.hostname 不同,如果相同,则会被 Eureka 标记为 unavailable-replicas不可用副本
#### 2.3 启动类上增加注解@EnableEurekaServer激活eureka服务端自动配置
@ -170,22 +170,22 @@ public class EurekaClientApplication {
### 4.2 高可用集群搭建成功的判定
这里需要主要的是仅仅status中出现其他注册中心时并不一定是搭建成功的**一定是当注册中心的DS Replicas 和 available replicas中显示其余的注册中心时候**,才代表搭建成功。
这里需要主要的是仅仅 status 中出现其他注册中心时,并不一定是搭建成功的,**一定是当注册中心的 DS Replicas 和 available replicas 中显示其余的注册中心时候**,才代表搭建成功。
#### 4.2.1 点击下面注册中心的可用实例列表中的地址,访问链接分以下几个情况:
1. hostnameprefer-ip-address都没有配置则访问 主机名:服务名:端口号,
1. hostnameprefer-ip-address 都没有配置,则访问 主机名:服务名:端口号,
```
http://desktop-8jgsflj:8761/info
```
2. 配置了hostname而没有配置prefer-ip-address则访问 hostname:服务名:端口号,
2. 配置了 hostname 而没有配置 prefer-ip-address则访问 hostname:服务名:端口号,
```
http://server:8761/info
```
3. 如果配置了prefer-ip-address则访问 ipAddress:服务名:端口号,
3. 如果配置了 prefer-ip-address则访问 ipAddress:服务名:端口号,
```
http://192.168.200.228:8761/info
```
@ -203,10 +203,10 @@ public class EurekaClientApplication {
### 4.3 prefer-ip-address 参数说明
在有的配置示例中配置了prefer-ip-addresstrue。
在有的配置示例中,配置了 prefer-ip-addresstrue。
```properties
eureka.instance.prefer-ip-address=true
```
在多机器独立部署的情况下是没有问题的配置prefer-ip-addressture代表发现服务时候优先按照ip去搜寻对于多集群而言可以保证尽快准确搜索到服务。而对于单机部署来说ip地址都是相同的这会导致其余注册中心出现在unavailable-replicas(不可用副本)中。所以单机部署时候不建议开启这个参数默认值为false多机部署时候可以开启。
在多机器独立部署的情况下是没有问题的,配置 prefer-ip-addressture代表发现服务时候优先按照 ip 去搜寻对于多集群而言可以保证尽快准确搜索到服务。而对于单机部署来说ip 地址都是相同的,这会导致其余注册中心出现在 unavailable-replicas(不可用副本) 中。所以单机部署时候不建议开启这个参数(默认值为 false多机部署时候可以开启。

View File

@ -1,5 +1,6 @@
# eureka 服务的注册与发现
# eureka 服务的注册与发现
## 目录<br/>
<a href="#一eureka-简介">一、eureka 简介</a><br/>
<a href="#二项目结构">二、项目结构</a><br/>
<a href="#三三步搭建eureka-服务注册中心">三、三步搭建eureka 服务注册中心</a><br/>
@ -15,113 +16,113 @@
## 正文<br/>
## 一、eureka 简介
Spring Cloud Eureka使用Netflix Eureka来实现服务注册与发现它既包含了服务端组件也包含了客户端组件。
**Eureka服务端**:服务的注册中心,负责维护注册的服务列表。
**Eureka客户端** 在应用程序运行时Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时它也能把从服务端查询到服务信息缓存到本地并周期性地刷新服务状态。
## 二、项目结构
eureka-server为服务注册中心负责服务的管理
eureka-client 为eureka客户端
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-eureka.png"/> </div>
## 三、三步搭建eureka 服务注册中心
#### 3.1 引入eureka服务端依赖
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
```
#### 3.2 eureka 服务端配置
```yaml
server:
port: 8010
eureka:
instance:
hostname: localhost
client:
# 设置为false,代表不向注册中心注册自己
register-with-eureka: false
# 注册中心主要用于维护服务,并不需要检索服务,所以设置为false
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
```
#### 3.3 启动类上增加注解@EnableEurekaServer激活eureka服务端自动配置
```java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
```
## 四、三步搭建eureka 客户端
#### 4.1 引入eureka客户端依赖
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
#### 4.2 eureka 客户端配置
```yaml
server:
port: 8020
# 指定服务命名
spring:
application:
name: eureka-client
# 指定注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8010/eureka/
```
#### 4.3 启动类上增加注解@EnableDiscoveryClient激活eureka客户端自动配置
```java
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
```
## 五、启动项目
#### 5.1 进入注册中心控制台,查看服务注册情况
## 一、eureka 简介
Spring Cloud Eureka 使用 Netflix Eureka 来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件。
**Eureka 服务端**:服务的注册中心,负责维护注册的服务列表。
**Eureka 客户端** 在应用程序运行时Eureka 客户端向注册中心注册自身提供的服务,并周期性地发送心跳来更新它的服务租约。同时它也能把从服务端查询到服务信息缓存到本地,并周期性地刷新服务状态。
## 二、项目结构
eureka-server 为服务注册中心,负责服务的管理;
eureka-client 为 eureka 客户端;
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-eureka.png"/> </div>
## 三、三步搭建eureka 服务注册中心
#### 3.1 引入eureka服务端依赖
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
```
#### 3.2 eureka 服务端配置
```yaml
server:
port: 8010
eureka:
instance:
hostname: localhost
client:
# 设置为 false,代表不向注册中心注册自己
register-with-eureka: false
# 注册中心主要用于维护服务,并不需要检索服务,所以设置为 false
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
```
#### 3.3 启动类上增加注解@EnableEurekaServer激活eureka服务端自动配置
```java
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
```
## 四、三步搭建eureka 客户端
#### 4.1 引入eureka客户端依赖
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
#### 4.2 eureka 客户端配置
```yaml
server:
port: 8020
# 指定服务命名
spring:
application:
name: eureka-client
# 指定注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8010/eureka/
```
#### 4.3 启动类上增加注解@EnableDiscoveryClient激活eureka客户端自动配置
```java
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
```
## 五、启动项目
#### 5.1 进入注册中心控制台,查看服务注册情况
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/eureka.png"/> </div>

View File

@ -12,14 +12,14 @@
## 一、feign 简介
在上一个用例中我们使用ribbon+restTemplate 实现服务之间的远程调用实际上每一个调用都是模板化的内容所以spring cloud Feign 在此基础上进行了进一步的封装。我们只需要定义一个接口并使用feign注解的方式来进行配置同时采用springMvc 注解进行参数绑定就可以完成服务的调用。feign同时还内置实现了负载均衡、服务容错等功能。
在上一个用例中,我们使用 ribbon+restTemplate 实现服务之间的远程调用,实际上每一个调用都是模板化的内容,所以 spring cloud Feign 在此基础上进行了进一步的封装。我们只需要定义一个接口并使用 feign 注解的方式来进行配置,同时采用 springMvc 注解进行参数绑定就可以完成服务的调用。feign 同时还内置实现了负载均衡、服务容错等功能。
## 二、项目结构
+ common: 公共的接口和实体类;
+ consumer: 服务的消费者采用feign调用产品服务
+ consumer: 服务的消费者,采用 feign 调用产品服务;
+ producer服务的提供者
+ eureka: 注册中心。
@ -186,7 +186,7 @@ public interface ProductFeign {
List<Product> productList();
/**
* 这是需要强调的是使用feign时候@PathVariable一定要用value指明参数
* 这是需要强调的是使用 feign 时候@PathVariable 一定要用 value 指明参数,
* 不然会抛出.IllegalStateException: PathVariable annotation was empty on param 异常
*/
@GetMapping("product/{id}")
@ -259,7 +259,7 @@ public class SellController {
#### 5.1 启动一个Eureka服务、三个producer服务注意区分端口、和一个消费者服务
feign 的依赖中导入了spring-cloud-starter-netflix-ribbon依赖并且在内部实现了基于ribbon的客户端负载均衡所以我们这里启动三个producer实例来观察负载均衡的情况。
feign 的依赖中导入了 spring-cloud-starter-netflix-ribbon 依赖,并且在内部实现了基于 ribbon 的客户端负载均衡,所以我们这里启动三个 producer 实例来观察负载均衡的情况。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-ribbon-app.png"/> </div>
@ -292,7 +292,7 @@ feign 的依赖中导入了spring-cloud-starter-netflix-ribbon依赖并且在
```yml
feign:
hystrix:
# 如果为true则OpenFign客户端将使用Hystrix断路器进行封装 默认为false
# 如果为 true OpenFign 客户端将使用 Hystrix 断路器进行封装 默认为 false
enabled: true
```
@ -301,7 +301,7 @@ feign:
```java
/**
* @author : heibaiying
* @description : 定义发生熔断时候的回退处理。除了继承自CProductFeign,还需要用@Component声明为spring的组件
* @description : 定义发生熔断时候的回退处理。除了继承自 CProductFeign,还需要用@Component 声明为 spring 的组件
*/
@Component
public class CProductFeignImpl implements CProductFeign {
@ -368,7 +368,7 @@ public interface CProductFeign extends ProductFeign {
#### 6.5 测试熔断处理
hystrix 默认调用超时时间为2s ,这里我们使用线程休眠的方式来模拟超时熔断。
hystrix 默认调用超时时间为 2s ,这里我们使用线程休眠的方式来模拟超时熔断。
```java
public List<Product> queryAllProducts() {
@ -385,4 +385,4 @@ public List<Product> queryAllProducts() {
测试结果:
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/feign-hystrix.png"/> </div>
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/feign-hystrix.png"/> </div>

View File

@ -19,7 +19,7 @@
在分布式系统中,由于服务之间相互的依赖调用,如果一个服务单元发生了故障就有可能导致故障蔓延至整个系统,从而衍生出一系列的保护机制,断路器就是其中之一。
断路器可以在服务单元发生故障的时候及时切断与服务单元的连接避免资源被长时间占用。spring cloud hystrix组件实现了断路器、线程隔离等一系列基本功能并具有服务降级、服务熔断、请求缓存、请求合并以及服务监控等配套功能。
断路器可以在服务单元发生故障的时候及时切断与服务单元的连接避免资源被长时间占用。spring cloud hystrix 组件实现了断路器、线程隔离等一系列基本功能,并具有服务降级、服务熔断、请求缓存、请求合并以及服务监控等配套功能。
@ -33,10 +33,10 @@
## 二、项目结构
[spring-cloud-ribbon](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-ribbon)用例已经实现通过ribbon+restTemplate实现服务间的调用本用例在其基础上进行hystrix 的整合。
[spring-cloud-ribbon](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-ribbon) 用例已经实现通过 ribbon+restTemplate 实现服务间的调用,本用例在其基础上进行 hystrix 的整合。
+ common: 公共的接口和实体类;
+ consumer: 服务的消费者采用RestTemplate调用产品服务
+ consumer: 服务的消费者,采用 RestTemplate 调用产品服务;
+ producer服务的提供者
+ eureka: 注册中心;
+ turbine:多个熔断器的聚合监控。
@ -49,7 +49,7 @@
#### 3.1 引入依赖
hystrix的仪表盘功能实际上是从[端点](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-actuator)获取数据所以需要actuator starter开启端点的相关功能。
hystrix 的仪表盘功能实际上是从[端点](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-boot/spring-boot-actuator) 获取数据,所以需要 actuator starter 开启端点的相关功能。
```xml
<!--hystrix 依赖-->
@ -76,7 +76,7 @@ management:
endpoints:
web:
exposure:
# 需要开启hystrix.stream端点的暴露 这样才能获取到监控信息 * 代表开启所有可监控端点
# 需要开启 hystrix.stream 端点的暴露 这样才能获取到监控信息 * 代表开启所有可监控端点
include: "*"
```
@ -140,11 +140,11 @@ public List<Product> queryProductsFail() {
#### 3.5 模拟熔断
这里被调用方采用线程休眠的方式模拟服务超时Hystrix默认超时时间为2s,调用远程服务时候超过这个时间,会触发熔断。
这里被调用方采用线程休眠的方式模拟服务超时Hystrix 默认超时时间为 2s,调用远程服务时候超过这个时间,会触发熔断。
```java
public List<Product> queryAllProducts() {
// hystrix 默认超时是2
// hystrix 默认超时是 2
int i = new Random().nextInt(2500);
try {
Thread.sleep(i);
@ -155,15 +155,15 @@ public List<Product> queryAllProducts() {
}
```
3.5 启动服务访问http://localhost:8030/sell/products ,多次刷新查看熔断情况
3.5 启动服务,访问 http://localhost:8030/sell/products ,多次刷新查看熔断情况
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/hystrix-8030.png"/> </div>
#### 3.5 启动服务,访问 localhost:8030/hystrix
依次输出http://localhost:8030/actuator/hystrix.stream监控地址 2000延迟时间title可以任意填写进入监控台。
依次输出 http://localhost:8030/actuator/hystrix.stream监控地址 2000延迟时间title 可以任意填写,进入监控台。
需要注意的是在spring cloud Finchley.SR2监控地址中都是有/actuator的因为在spring boot 2.x 的所有端点(包括自定义端点)都是暴露在这个路径下,在启动时候的控制台输出的日志可以查看到所有暴露端点的映射。
需要注意的是在 spring cloud Finchley.SR2监控地址中都是有/actuator 的,因为在 spring boot 2.x 的所有端点(包括自定义端点)都是暴露在这个路径下,在启动时候的控制台输出的日志可以查看到所有暴露端点的映射。
**登录页面**
@ -173,7 +173,7 @@ public List<Product> queryAllProducts() {
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/hystrix-8030-login.png"/> </div>
**关于各个参数的说明参见[官方wiki](https://github.com/Netflix-Skunkworks/hystrix-dashboard/wiki)提供的图**
**关于各个参数的说明参见[官方 wiki](https://github.com/Netflix-Skunkworks/hystrix-dashboard/wiki) 提供的图**
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/dashboard.png"/> </div>
@ -290,7 +290,7 @@ public class TurbineApplication {
#### 4.4 依次启动eureka、producer、consumer、turbine四个项目
在 localhost:8030/hystrix或者localhost:8030/hystrixconsumerproducer都集成了hystrix 页面输入http://localhost:8040/turbine.stream查看断路器聚合信息
在 localhost:8030/hystrix 或者 localhost:8030/hystrixconsumerproducer 都集成了 hystrix 页面输入 http://localhost:8040/turbine.stream查看断路器聚合信息
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/hystrix-cluster-login.png"/> </div>
@ -302,7 +302,7 @@ public class TurbineApplication {
#### 5.1 无法访问监控页面
1. 一般是端点链接输入不对,在F版本的spring cloud 中,输入监控的端点链接是 http://localhost:8030/actuator/hystrix.stream ,中间是有/actuator/(之前版本的没有/actuator/
1. 一般是端点链接输入不对,在 F 版本的 spring cloud 中,输入监控的端点链接是 http://localhost:8030/actuator/hystrix.stream ,中间是有/actuator/(之前版本的没有/actuator/
2. 没有暴露端点链接,暴露端点链接有两种方式,一种是我们在上文中提到的基于配置的方式
@ -311,7 +311,7 @@ public class TurbineApplication {
endpoints:
web:
exposure:
# 需要开启hystrix.stream端点的暴露 这样才能获取到监控信息 * 代表开启所有可监控端点
# 需要开启 hystrix.stream 端点的暴露 这样才能获取到监控信息 * 代表开启所有可监控端点
include: "*"
```
@ -329,7 +329,7 @@ public class TurbineApplication {
}
```
这两种方式二选一即可,就算是采用代码的方式,还是建议将地址设置为/actuator/hystrix.stream而不是原来的hystrix.stream因为turbine默认也是从/actuator/hystrix.stream去获取信息。
这两种方式二选一即可,就算是采用代码的方式,还是建议将地址设置为/actuator/hystrix.stream而不是原来的 hystrix.stream因为 turbine 默认也是从/actuator/hystrix.stream 去获取信息。
#### 5.2 页面一直loading 或者访问端点页面一直出现ping

View File

@ -18,16 +18,16 @@
## 一、ribbon 简介
ribbonNetfix公司开源的负载均衡组件采用服务端负载均衡的方式即消费者客户端维护可用的服务列表并通过负载均衡的方式将请求按照指定的策略分摊给消费者从而达到负载均衡的方式。
ribbonNetfix 公司开源的负载均衡组件,采用服务端负载均衡的方式,即消费者客户端维护可用的服务列表,并通过负载均衡的方式将请求按照指定的策略分摊给消费者,从而达到负载均衡的方式。
## 二、项目结构
+ common: 公共的接口和实体类;
+ consumer: 服务的消费者采用RestTemplate调用产品服务
+ consumer: 服务的消费者,采用 RestTemplate 调用产品服务;
+ producer服务的提供者
+ eureka: 注册中心ribbon 从注册中心获取可用的服务列表,是实现负载均衡的基础。这里使用我们在[服务的注册与发现](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-eureka)这个用例中搭建的简单注册中心作为测试即可。
+ eureka: 注册中心ribbon 从注册中心获取可用的服务列表,是实现负载均衡的基础。这里使用我们在[服务的注册与发现](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-eureka) 这个用例中搭建的简单注册中心作为测试即可。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-ribbon.png"/> </div>
@ -200,7 +200,7 @@ public class RibbonConfig {
#### 4.4 使用RestTemplate调用远程服务
这里我们在调用远程服务的时候url填写的是服务名+具体接口地址 ,由于我们的同一个服务会存在多个实例,在使用@LoadBalanced配置RestTemplate调用服务时客户端就会从按照指定的负载均衡的方式将请求分摊到多个实例上。默认的负载均衡采用的是RoundRobinRule轮询的策略有特殊需求时候可以采用其他内置的策略规则或者实现IRule来定义自己的负载均衡策略
这里我们在调用远程服务的时候url 填写的是服务名 + 具体接口地址 ,由于我们的同一个服务会存在多个实例,在使用@LoadBalanced 配置 RestTemplate 调用服务时,客户端就会从按照指定的负载均衡的方式将请求分摊到多个实例上。(默认的负载均衡采用的是 RoundRobinRule轮询的策略有特殊需求时候可以采用其他内置的策略规则或者实现 IRule 来定义自己的负载均衡策略)。
```java
@Service
@ -250,18 +250,18 @@ public class ProductService implements IProductService {
#### 6.1 restTemplate 规范
restTemplate 调用对应resultful接口时候使用的方法应该与接口声明方式@GetMapping@PostMapping@PutMapping@DeleteMapping)保持一致。请求类型与对应的调用方法如下。
restTemplate 调用对应 resultful 接口时候,使用的方法应该与接口声明方式(@GetMapping@PostMapping@PutMapping@DeleteMapping)保持一致。请求类型与对应的调用方法如下。
- GET请求(getForObject 、getForEntity)
- POST请求postForObject 、postForEntity
- PUT请求put
- DELETE请求 delete
- GET 请求 (getForObject 、getForEntity)
- POST 请求postForObject 、postForEntity
- PUT 请求put
- DELETE 请求 delete
#### 6.2 ForEntity()和ForObject()的区别
- `ForEntity()`发送一个请求返回的ResponseEntity包含了响应体所映射成的对象
- `ForEntity()` 发送一个请求,返回的 ResponseEntity 包含了响应体所映射成的对象
- `ForObject()`发送一个请求,返回的请求体将映射为一个对象
- `ForObject()` 发送一个请求,返回的请求体将映射为一个对象
例如:
@ -274,19 +274,19 @@ Product product = restTemplate.getForObject("http://producer/product/{1}", Produ
## 七、 附2 关于ribbon更多负载均衡的策略
Ribbon内置了多种负载均衡策略如果有更复杂的需求可以自己实现IRule。
Ribbon 内置了多种负载均衡策略,如果有更复杂的需求,可以自己实现 IRule。
#### 7.1 内置的负载均衡的策略如下图
![Ribbon负载均衡策略.png](http://upload-images.jianshu.io/upload_images/6944619-0355d316f5df9b3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Ribbon 负载均衡策略.png](http://upload-images.jianshu.io/upload_images/6944619-0355d316f5df9b3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
图片来源于博客:[Ribbon负载均衡策略与自定义配置](https://blog.csdn.net/jrn1012/article/details/77837680)
图片来源于博客:[Ribbon 负载均衡策略与自定义配置](https://blog.csdn.net/jrn1012/article/details/77837680)
#### 7.2 配置文件指定负载均衡的方式
要设置`IRule`名为的服务名称`users`,您可以设置以下属性:
要设置 `IRule` 名为的服务名称 `users`,您可以设置以下属性:
```yaml
users:
@ -316,10 +316,10 @@ public class CustomConfiguration {
}
```
在使用代码方式的时候需要注意 [官方文档](http://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#_customizing_the_ribbon_client)中关于注解方式有以下强调:
在使用代码方式的时候需要注意 [官方文档](http://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#_customizing_the_ribbon_client) 中关于注解方式有以下强调:
The CustomConfiguration clas must be a @Configuration class, but take care that it is not in a @ComponentScan for the main application context. Otherwise, it is shared by all the @RibbonClients. If you use @ComponentScan (or @SpringBootApplication), you need to take steps to avoid it being included (for instance, you can put it in a separate, non-overlapping package or specify the packages to scan explicitly in the @ComponentScan).
`CustomConfiguration`类必须是`@Configuration`标注的,但需要注意的它不是在`@ComponentScan`主应用程序上下文。否则,它将由所有`@RibbonClients`共享。如果你使用`@ComponentScan`(或`@SpringBootApplication`),你需要采取一些措施来避免它被扫描到(例如,你可以把它放在一个独立的,非重叠的包,或用`@ComponentScan`时显示扫描指定的包)。
`CustomConfiguration` 类必须是 `@Configuration` 标注的,但需要注意的它不是在 `@ComponentScan` 主应用程序上下文。否则,它将由所有 `@RibbonClients` 共享。如果你使用 `@ComponentScan`(或 `@SpringBootApplication`),你需要采取一些措施来避免它被扫描到(例如,你可以把它放在一个独立的,非重叠的包,或用 `@ComponentScan` 时显示扫描指定的包)。

View File

@ -1,5 +1,6 @@
# spring-sleuth-zipkin
# spring-sleuth-zipkin
## 目录<br/>
<a href="#一简介">一、简介</a><br/>
<a href="#二项目结构">二、项目结构</a><br/>
<a href="#三构建-zipkin-服务端">三、构建 zipkin 服务端</a><br/>
@ -10,94 +11,94 @@
## 正文<br/>
## 一、简介
在微服务架构中,几乎每一个前端的请求都会经过多个服务单元协调来提供服务,形成复杂的服务调用链路。当服务发生问题时候,很难知道问题来源于链路的哪一个环节,这时候就需要进行链路追踪。
zipkin 是一个开源的分布式跟踪系统可以使用spring cloud sleuth 来轻松的集成 zipkin。
## 二、项目结构
这里的项目是在之前的 [spring-cloud-zuul](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-zuul) 进行集成zuul 项目的产品接口调用链路从 网关 -> consumer -> producer,历经三个环节的调用链路可以直观展示zipkin对链路追踪可视化的好处。
+ common: 公共的接口和实体类
+ consumer: 服务的消费者采用feign调用产品服务
+ producer服务的提供者
+ eureka: 注册中心;
+ zuul: api网关。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-sleuth-zipkin.png"/> </div>
## 三、构建 zipkin 服务端
zipkin 客户端可以不用自己构建,直接从[官网](https://zipkin.io/pages/quickstart)上下载对应的jar 包启动即可,默认端口 9411
```shell
java -jar zipkin.jar
```
可以直接从docker仓库拉取然后启动容器
```shell
docker run -d -p 9411:9411 openzipkin/zipkin
```
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin-download.png"/> </div>
## 四、集成zipkin
这里我们对zuul、consumer、producer 三个模块都进行集成
#### 4.1 对三个模块(zuul、consumer、producer )添加依赖
```xml
<!--zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
```
#### 4.2 分别在三个模块的application.yml 配置文件中指定zipkin的地址
```yaml
spring:
zipkin:
base-url: http://localhost:9411/
# 可以指定监控数据的采样率
sleuth:
sampler:
probability: 1
```
## 五、启动项目
分别启动eurekazuulconsumerproducerzuul ,访问 http://localhost:9411/ ,查看我们的服务调用链路
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin.png"/> </div>
点击链路,则可以查看具体的调用情况
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin-detail.png"/> </div>
展示信息说明:
Span 基本工作单元,发送一个远程调度任务就会产生一个 Span。
Trace由一系列 Span 组成的,呈树状结构。 所有由这个请求产生的 Span 组成了这个 Trace 。
SpanId ; 工作单元 (Span) 的唯一标识。
TraceId : 一条请求链路 (Trace) 的唯 一 标识。
除了TraceID外还需要SpanID用于记录调用父子关系。每个服务会记录下parent id和span id通过他们可以组织一次完整调用链的父子关系。
## 一、简介
在微服务架构中,几乎每一个前端的请求都会经过多个服务单元协调来提供服务,形成复杂的服务调用链路。当服务发生问题时候,很难知道问题来源于链路的哪一个环节,这时候就需要进行链路追踪。
zipkin 是一个开源的分布式跟踪系统,可以使用 spring cloud sleuth 来轻松的集成 zipkin。
## 二、项目结构
这里的项目是在之前的 [spring-cloud-zuul](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-zuul) 进行集成zuul 项目的产品接口调用链路从 网关 -> consumer -> producer,历经三个环节的调用链路可以直观展示 zipkin 对链路追踪可视化的好处。
+ common: 公共的接口和实体类;
+ consumer: 服务的消费者,采用 feign 调用产品服务
+ producer服务的提供者
+ eureka: 注册中心
+ zuul: api 网关。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/spring-cloud-sleuth-zipkin.png"/> </div>
## 三、构建 zipkin 服务端
zipkin 客户端可以不用自己构建,直接从[官网](https://zipkin.io/pages/quickstart) 上下载对应的 jar 包启动即可,默认端口 9411
```shell
java -jar zipkin.jar
```
可以直接从 docker 仓库拉取,然后启动容器:
```shell
docker run -d -p 9411:9411 openzipkin/zipkin
```
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin-download.png"/> </div>
## 四、集成zipkin
这里我们对 zuul、consumer、producer 三个模块都进行集成
#### 4.1 对三个模块(zuul、consumer、producer )添加依赖
```xml
<!--zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
```
#### 4.2 分别在三个模块的application.yml 配置文件中指定zipkin的地址
```yaml
spring:
zipkin:
base-url: http://localhost:9411/
# 可以指定监控数据的采样率
sleuth:
sampler:
probability: 1
```
## 五、启动项目
分别启动eurekazuulconsumerproducerzuul ,访问 http://localhost:9411/ ,查看我们的服务调用链路
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin.png"/> </div>
点击链路,则可以查看具体的调用情况
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zipkin-detail.png"/> </div>
展示信息说明:
Span 基本工作单元,发送一个远程调度任务就会产生一个 Span。
Trace由一系列 Span 组成的,呈树状结构。 所有由这个请求产生的 Span 组成了这个 Trace 。
SpanId ; 工作单元 (Span) 的唯一标识。
TraceId : 一条请求链路 (Trace) 的唯 一 标识。
除了 TraceID 外,还需要 SpanID 用于记录调用父子关系。每个服务会记录下 parent id 和 span id通过他们可以组织一次完整调用链的父子关系。
注:关于以上概念可以比对链表的实现原理来理解。

View File

@ -19,25 +19,25 @@
api 网关是整个微服务系统的门面,所有的外部访问需要通过网关进行调度和过滤。它实现了请求转发、负载均衡、校验过滤、错误熔断、服务聚合等功能。
下图是直观的显示api Gateway 在微服务网关中的作用图片引用自spring boot 官网)。
下图是直观的显示 api Gateway 在微服务网关中的作用(图片引用自 spring boot 官网)。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/apiGateway.png"/> </div>
### 1.2 zuul
spring cloud 中提供了基础Net flix Zuul 实现的网关组件这就是Zuul,它除了实现负载均衡、错误熔断、路由转发等功能还能与spring 其他组件无缝配合使用。
spring cloud 中提供了基础 Net flix Zuul 实现的网关组件,这就是 Zuul,它除了实现负载均衡、错误熔断、路由转发等功能,还能与 spring 其他组件无缝配合使用。
## 二、项目结构
[spring-cloud-feign](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-feign)用例已经实现通过feign实现服务间的调用且提供了两个业务服务单元(consumer、producer)可以方便直观的测试zuul的路由、负载均衡、和错误熔断等功能所以本用例在其基础上进行zuul的整合。
[spring-cloud-feign](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring-cloud/spring-cloud-feign) 用例已经实现通过 feign 实现服务间的调用,且提供了两个业务服务单元 (consumer、producer),可以方便直观的测试 zuul 的路由、负载均衡、和错误熔断等功能,所以本用例在其基础上进行 zuul 的整合。
+ common: 公共的接口和实体类;
+ consumer: 服务的消费者采用feign调用产品服务
+ consumer: 服务的消费者,采用 feign 调用产品服务;
+ producer服务的提供者
+ eureka: 注册中心;
+ zuul: api网关。
+ zuul: api 网关。
聚合项目目录如下:
@ -131,7 +131,7 @@ zuul 项目目录如下:
#### 3.2 在启动类上添加注解@EnableZuulProxy和@EnableDiscoveryClient
@EnableZuulProxy会自动设置Zuul服务器端点并在其中开启一些反向代理过滤器,以便将请求转发到后端服务器。
@EnableZuulProxy 会自动设置 Zuul 服务器端点并在其中开启一些反向代理过滤器,以便将请求转发到后端服务器。
```java
@SpringBootApplication
@ -150,7 +150,7 @@ public class ZuulApplication {
#### 3.3 指定注册中心、配置网关的路由规则
zuul 需要指定注册中心的地址zuul 会从eureka获取其他微服务的实例信息然后按照指定的路由规则进行请求转发。
zuul 需要指定注册中心的地址zuul 会从 eureka 获取其他微服务的实例信息,然后按照指定的路由规则进行请求转发。
```yaml
server:
@ -212,7 +212,7 @@ public class CustomZuulFallbackProvider implements FallbackProvider {
return new ClientHttpResponse() {
/**
* 返回响应的HTTP状态代码
* 返回响应的 HTTP 状态代码
*/
@Override
public HttpStatus getStatusCode() throws IOException {
@ -220,7 +220,7 @@ public class CustomZuulFallbackProvider implements FallbackProvider {
}
/**
* 返回HTTP状态代码
* 返回 HTTP 状态代码
*/
@Override
public int getRawStatusCode() throws IOException {
@ -228,7 +228,7 @@ public class CustomZuulFallbackProvider implements FallbackProvider {
}
/**
* 返回响应的HTTP状态文本
* 返回响应的 HTTP 状态文本
*/
@Override
public String getStatusText() throws IOException {
@ -262,7 +262,7 @@ public class CustomZuulFallbackProvider implements FallbackProvider {
}
```
正确返回了内容、同时返回的http状态码也和我们设置的一样。
正确返回了内容、同时返回的 http 状态码也和我们设置的一样。
<div align="center"> <img src="https://github.com/heibaiying/spring-samples-for-all/blob/master/pictures/zuul-broker.png"/> </div>
@ -270,12 +270,12 @@ public class CustomZuulFallbackProvider implements FallbackProvider {
## 五、zuul 过滤器
创建自定义过滤器继承自CustomZuulFilter当我们访问网关的时候如果判断session 中没有对应的 code,则跳转到我们自定义的登录页面。
创建自定义过滤器继承自 CustomZuulFilter当我们访问网关的时候如果判断 session 中没有对应的 code,则跳转到我们自定义的登录页面。
```java
/**
* @author : heibaiying
* @description : 自定义filter过滤器
* @description : 自定义 filter 过滤器
*/
@Component
@ -306,7 +306,7 @@ public class CustomZuulFilter extends ZuulFilter {
}
/**
* ZuulFilter的核心校验方法
* ZuulFilter 的核心校验方法
*/
@Override
public Object run() throws ZuulException {
@ -314,7 +314,7 @@ public class CustomZuulFilter extends ZuulFilter {
HttpServletRequest request = currentContext.getRequest();
String code = (String)request.getSession().getAttribute("code");
if (StringUtils.isEmpty(code)){
// 设置值为false 不将请求转发到对应的服务上
// 设置值为 false 不将请求转发到对应的服务上
currentContext.setSendZuulResponse(false);
// 设置返回的状态码
currentContext.setResponseStatusCode(HttpStatus.NON_AUTHORITATIVE_INFORMATION.value());
@ -372,7 +372,7 @@ index.ftl:
## 七、附:关于版本问题可能导致的 zuul 启动失败
如果出现以下错误导致启动失败,是 spring boot 版本不兼容导致的错误Finchley SR2版本 spring cloud 中的 zuul 和 spring boot 2.1.x 版本存在不兼容。如果出现这个问题,则将 spring boot 将至 2.0.x 的版本即可,用例中采用的是 2.0.8 版本。在实际的开发中应该严格遵循spring 官方的版本依赖说明。
如果出现以下错误导致启动失败,是 spring boot 版本不兼容导致的错误Finchley SR2 版本 spring cloud 中的 zuul 和 spring boot 2.1.x 版本存在不兼容。如果出现这个问题,则将 spring boot 将至 2.0.x 的版本即可,用例中采用的是 2.0.8 版本。在实际的开发中应该严格遵循 spring 官方的版本依赖说明。
```java
APPLICATION FAILED TO START