spring cloud 3

flag

全名: facebook linkin amazon google

1Config 分布式配置中心

1.1Config 概述

image-20200613065037444

Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护。

好处:

• 集中管理配置文件

• 不同环境不同配置,动态化的配置更新

• 配置信息改变时,不需要重启即可更新配置信息到服务

1.2Config 快速入门

image-20200613065223808

config server:

  1. 使用gitee创建远程仓库,上传配置文件

    config-dev.yml或者直接创建

    以provider的application.yml为例 把里面的内容复制到config-dev.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    server:
    port: 8002


    eureka:
    instance:
    hostname: localhost # 主机名
    prefer-ip-address: true # 将当前实例的ip注册到eureka server 中。默认是false 注册主机名
    ip-address: 127.0.0.1 # 设置当前实例的ip
    instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
    lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
    lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
    client:
    service-url:
    defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
    spring:
    application:
    name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径


    itheima: What 5555555555
  1. 搭建 config-server 模块

    ConfigServerApp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.itheima.config;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;

    @SpringBootApplication
    @EnableConfigServer // 启用config server功能
    public class ConfigServerApp {

    public static void main(String[] args) {
    SpringApplication.run(ConfigServerApp.class,args);
    }
    }
  2. 导入 config-server 依赖

    pom

    1
    2
    3
    4
    5
    <!-- config-server -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  3. 编写配置,设置 gitee 远程仓库地址

    application.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 9527

    spring:
    application:
    name: config-server
    # spring cloud config
    cloud:
    config:
    server:
    # git 的 远程仓库地址
    git:
    uri: https://gitee.com/itheima_cch/itheima-configs.git
    label: master # 分支配置
  4. 测试访问远程配置文件

    http://localhost:9527/master/config-dev.yml

config client: provider

  1. 导入 starter-config 依赖

    1
    2
    3
    4
    5
    <!--config client -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
  2. 配置config server 地址,读取配置文件名称等信息(此时的application.yml可以删除了)

    bootstrap.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 配置config-server地址
    # 配置获得配置文件的名称等信息
    spring:
    cloud:
    config:
    # 配置config-server地址
    uri: http://localhost:9527
    # 配置获得配置文件的名称等信息
    name: config # 文件名
    profile: dev # profile指定, config-dev.yml
    label: master # 分支
  3. 获取配置值

    GoodsController

    1
    2
    3
    4
    @Value("${itheima}") //从gitee获取文件里的属性
    private String itheima;

    goods.setTitle(goods.getTitle() + ":" + port+":"+itheima);//将端口号,设置到了 商品标题上
  4. 启动测试

    http://localhost:8001/goods/findOne/7

Config 客户端刷新

image-20200613070913278

  1. 在 config 客户端引入 actuator 依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. 获取配置信息类上,添加 @RefreshScope 注解

    GoodsController

    1
    @RefreshScope // 开启刷新功能
  3. 添加配置

    bootstrap.yml

1
2
3
4
5
management:
endpoints:
web:
exposure:
include: '*'
  1. 使用curl工具发送post请求

    curl -X POST http://localhost:8001/actuator/refresh

1.3Config 集成Eureka

image-20200613071442840

config-client配置:

pom

1
2
3
4
5
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

ProviderApp

1
@EnableEurekaClient

bootstrap.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 配置config-server地址
# 配置获得配置文件的名称等信息
spring:
cloud:
config:
# 配置config-server地址
#uri: http://localhost:9527
# 配置获得配置文件的名称等信息
name: config # 文件名
profile: dev # profile指定, config-dev.yml
label: master # 分支
discovery:
enabled: true
service-id: CONFIG_SERVER

management:
endpoints:
web:
exposure:
include: '*'

config-server配置:

pom

1
2
3
4
5
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

ConfigServerApp

1
@EnableEurekaClient

application.yml

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka

2Bus 消息总线

远程的配置文件更新了,运维只需要发一个请求,所有用到这个配置文件的几百个应用更新了。

2.1Bus 概述

image-20200613073444822

Spring Cloud Bus 是用轻量的消息中间件将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。关键的思想就是,消息总线可以为微服务做监控,也可以实现应用程序之间相通信。

Spring Cloud Bus 可选的消息中间件包括 RabbitMQ 和 Kafka 。

2.2RabbitMQ 回顾

message queue

image-20200613074044506

image-20200613074052830

RabbitMQ 提供了 6 种工作模式:简单模式、work queues、Publish/Subscribe 发布与订阅模式、Routing

路由模式、Topics 主题模式、RPC 远程调用模式(远程调用,不太算 MQ;暂不作介绍)。

image-20200613074109383

2.3Bus 快速入门-运维

image-20200613074151032

  1. 分别在 config-server 和 config-client中引入 bus依赖:bus-amqp

    1
    2
    3
    4
    5
    <!-- bus -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
  2. 分别在 config-server 和 config-client中配置 RabbitMQ

    server 的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    server:
    port: 9527

    spring:
    application:
    name: config-server
    # spring cloud config
    cloud:
    config:
    server:
    # git 的 远程仓库地址
    git:
    uri: https://gitee.com/itheima_cch/itheima-configs.git
    label: master # 分支配置
    #配置rabbitmq信息
    rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /


    # 将自己注册到eureka中
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:8761/eureka



    # 暴露bus的刷新端点
    management:
    endpoints:
    web:
    exposure:
    include: 'bus-refresh'

    client的配置文件 bootstrap.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # 配置config-server地址
    # 配置获得配置文件的名称等信息
    spring:
    cloud:
    config:
    # 配置config-server地址
    # uri: http://localhost:9527
    # 配置获得配置文件的名称等信息
    name: config # 文件名
    profile: dev # profile指定, config-dev.yml
    label: master # 分支
    # 从注册中心去寻找config-server地址
    discovery:
    enabled: true
    service-id: CONFIG-SERVER
    #配置rabbitmq信息
    rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /

    management:
    endpoints:
    web:
    exposure:
    include: '*'
  3. 在config-server中设置暴露监控断点:bus-refresh

    1
    2
    3
    4
    5
    6
    # 暴露bus的刷新端点
    management:
    endpoints:
    web:
    exposure:
    include: 'bus-refresh'
  4. 启动测试

    往配置中心发请求

    curl -X POST http://localhost:9527/actuator/bus-refresh

3Stream 消息驱动

3.1Stream 概述

rabbitTemplate.convertAndSend(“交换机”,luyoukey,”消息体”)

kafka.send()

image-20200613074619301

image-20200613074632920

1Spring Cloud Stream 是一个构建消息驱动微服务应用的框架。

2Stream 解决了开发人员无感知的使用消息中间件的问题,因为Stream对消息中间件的进一步封装,可以做到代码层面对中间件的无感知,甚至于动态的切换中间件,使得微服务开发的高度解耦,服务可以关注更多自己的业务流程。

3Spring Cloud Stream目前支持两种消息中间件RabbitMQ和Kafka

Stream 组件

image-20200613074759833

Spring Cloud Stream 构建的应用程序与消息中间件之间是通过绑定器 Binder 相关联的。绑定器对于应用程序而言起到了隔离作用, 它使得不同消息中间件的实现细节对应用程序来说是透明的。

binding 是我们通过配置把应用和spring cloud stream 的 binder 绑定在一起

output:发送消息 Channel,内置 Source接口

input:接收消息 Channel,内置 Sink接口

3.2Stream 消息生产者 stream-producer

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>stream-parent</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>stream-producer</artifactId>


<dependencies>

<!--spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>


<!-- stream -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

</dependencies>

</project>

ProducerApp

1
2
3
4
5
6
7
8
9
10
11
12
package com.itheima.stream;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProducerApp {
public static void main(String[] args) {

SpringApplication.run(ProducerApp.class,args);
}
}

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server:
port: 8000

spring:
cloud:
stream:
# 定义绑定器,绑定到哪个消息中间件上
binders:
itheima_binder: # 自定义的绑定器名称
type: rabbit # 绑定器类型
environment: # 指定mq的环境
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
bindings:
output: # channel名称
binder: itheima_binder #指定使用哪一个binder
destination: itheima_exchange # 消息目的地

消息发送类 MessageProducer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.itheima.stream.producer;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

@Component
@EnableBinding(Source.class)
public class MessageProducer {

@Autowired
private MessageChannel output;

public void send(){
String msessage = "hello stream~~~";

//发送消息
output.send(MessageBuilder.withPayload(msessage).build());

System.out.println("消息发送成功~~~");

}
}

调用的controller ProducerController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.itheima.stream.producer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProducerController {

@Autowired
private MessageProducer producer;


@RequestMapping("/send")
public String sendMsg(){
producer.send();
return "success";
}
}

3.3Stream 消息消费者 stream-consumer

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>stream-parent</artifactId>
<groupId>com.itheima</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>stream-consumer</artifactId>


<dependencies>

<!--spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>


<!-- stream -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

</dependencies>
</project>

ConsumerApp

1
2
3
4
5
6
7
8
9
10
11
12
package com.itheima.stream;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {

SpringApplication.run(ConsumerApp.class,args);
}
}

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server:
port: 9000



spring:
cloud:
stream:
# 定义绑定器,绑定到哪个消息中间件上
binders:
itheima_binder: # 自定义的绑定器名称
type: rabbit # 绑定器类型
environment: # 指定mq的环境
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
bindings:
input: # channel名称
binder: itheima_binder #指定使用哪一个binder
destination: itheima_exchange # 消息目的地

消息接收类 MessageListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.itheima.stream.consumer;

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

/**
* 消息接收类
*/
@EnableBinding({Sink.class})
@Component
public class MessageListener {

@StreamListener(Sink.INPUT)
public void receive(Message message){

System.out.println(message);
System.out.println(message.getPayload());
}
}

测试

4Sleuth+Zipkin 链路追踪-运维

4.1概述

image-20200613075737263

Spring Cloud Sleuth 其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程,捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

1
2
3
耗时分析 
可视化错误
链路优化

Zipkin 是 Twitter 的一个开源项目,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现

4.2快速入门

  1. 安装启动zipkin。 java –jar zipkin.jar

    image-20200613075957898

  2. 访问zipkin web界面。 http://localhost:9411/

    image-20200613080015686

  3. 在服务提供方和消费方分别引入 sleuth 和 zipkin 依赖

    由于 zipkin 集成了 sleuth 所以 可省略导入 sleuth

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- sleuth-zipkin -->
    <!--<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>-->

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
  4. 分别配置服务提供方和消费方。

    provider

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server:
    port: 8001

    eureka:
    client:
    service-url:
    defaultZone: http://localhost:8761/eureka
    spring:
    application:
    name: feign-provider
    zipkin:
    base-url: http://localhost:9411/ # 设置zipkin的服务端路径

    sleuth:
    sampler:
    probability: 1 # 采集率 默认 0.1 百分之十。

    consumer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    server:
    port: 9000


    eureka:
    instance:
    hostname: localhost # 主机名
    client:
    service-url:
    defaultZone: http://localhost:8761/eureka
    spring:
    application:
    name: feign-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
    zipkin:
    base-url: http://localhost:9411/ # 设置zipkin的服务端路径

    sleuth:
    sampler:
    probability: 1 # 采集率 默认 0.1 百分之十。


    logging:
    level:
    com.itheima: debug
  5. 启动,测试

总结: eureka feign gateway

1软件架构演进 springcloud

​ 1.1 单体架构—》垂直拆分—》分布式架构—-》soa服务总线——》微服务架构

​ 1.2springcloud

​ 微服务治理框架 拿来主义

​ boot改造 版本号 地铁站a-z排列

​ greenwich ——-> 2.1.x

​ 1.3dubbo区别

​ dubbo 功能少 rpc 快

​ cloud 功能多 restful 慢

2注册中心

工作原理

image-20210124153129573

eureka

​ eureka-server 导包 主启动类@EnableEurekaServer 配置文件

​ 微服务 导包eureka-client 主启动类@EnableEurekaClient 配置文件

​ 调用 discoveryClient

配置文件

​ instance prefer-ip-address:true ip-address:127.0.0.1 心跳时间30 驱逐时间90

​ server 自我保护:true 驱逐时间120

​ clinet server地址 注册 拉取

​ dashboorad 开着

高可用 互相注册

consule 起起来

nacos 起起来

3服务调用

3.1ribbon @LoadBalanced url=”http://eureka-provider/goods

服务端负载均衡 客户端负载均衡

3.2负载均衡算法改

代码 配置类 主启动类 调用哪个微服务用哪个算法

配置 简单

feign

用法

​ 1导包 openfeign

 2注解@EnableFeignClients 

 3定义feign客户端

辅助功能

​ 超时时间

1
2
3
ribbon:
ConnectTimeout: 1000 # 连接超时时间 默认1s
ReadTimeout: 3000 # 逻辑处理的超时时间 默认1s

​ 日志

​ 1配置

1
2
3
logging:
level:
com.itheima: debug

​ 2配置类

​ 3feign接口 configuration = FeignLogConfig.class

4熔断器 hystrix

隔离 线程池隔离 信号量隔离

降级 返回一个特殊对象

​ 提供方降级 导包 降级方法 主方法(@HystrixCommand(fallbackMethod = “findById_fallbak”)

​ 超时 出错立马执行降级方法,返回特殊对象

​ 调用方降级

​ 1开启

1
2
3
feign:
hystrix:
enabled: true

​ 2实现类 返回特殊对象

​ 3feign客户端 fallback = GoodsFeignFallbak.class

熔断

image-20210124155622802

限流 有但我们不用

5网关gateway 路由+过滤

image-20210124155902523

路由:配置文件

1
2
3
4
5
6
7
- id: gateway-provider
# 静态路由
#uri: http://localhost:8000/
# 动态路由
uri: lb://EUREKA-PROVIDER
predicates:
- Path=/goods/**

过滤:

内置局部过滤器

1
2
filters:
- AddResponseHeader=a,b

内置全局过滤器

1
2
default-filters:
- AddResponseHeader=c,d

自定义全局

1
implements GlobalFilter, Ordered

6 spring cloud config

image-20210124160300286

7bus 服务总线

8stream 消息驱动

image-20210124160604249

9链路追踪 运维

启动 zipkin

微服务往ziplin