spring-cloud第三天

spring cloud 3

1Config 分布式配置中心

1.1Config 概述

在这里插入图片描述

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

好处:

• 集中管理配置文件

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

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

1.2Config 快速入门

在这里插入图片描述

config server:

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

    config-dev.yml

  2. 搭建 config-server 模块

    ConfigServerApp

    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);
        }
    }
    
  3. 导入 config-server 依赖

    pom

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

    application.yml

    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 # 分支配置
    
  5. 测试访问远程配置文件

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

config client: provider

  1. 导入 starter-config 依赖

    <!--config client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    
  2. 配置config server 地址,读取配置文件名称等信息

    bootstrap.yml

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

    GoodsController

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

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

Config 客户端刷新

在这里插入图片描述

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

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

    GoodsController

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

    bootstrap.yml

management: # 开启自动刷新
  endpoints:
    web:
      exposure:
        include: '*'
  1. 使用curl工具发送post请求

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

1.3Config 集成Eureka

在这里插入图片描述

config-client配置:

pom

<!-- eureka-client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

ProviderApp

@EnableEurekaClient

bootstrap.yml

# 配置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

    <!-- eureka-client -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

ConfigServerApp

@EnableEurekaClient

application.yml

eureka:
   client:
    service-url:
      defaultZone: http://localhost:8761/eureka

2Bus 消息总线

2.1Bus 概述

在这里插入图片描述

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

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

2.2RabbitMQ 回顾

message queue

在这里插入图片描述
在这里插入图片描述

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

路由模式、Topics 主题模式、RPC 远程调用模式(远程调用,不太算 MQ;暂不作介绍)。
在这里插入图片描述

2.3Bus 快速入门-运维

在这里插入图片描述

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

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

    server 的配置文件

    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

    # 配置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

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

3Stream 消息驱动

3.1Stream 概述

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

kafka.send()

在这里插入图片描述
在这里插入图片描述

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

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

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

Stream 组件

在这里插入图片描述

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

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

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

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

3.2Stream 消息生产者 stream-producer

pom

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

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

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

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

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

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

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

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

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概述

在这里插入图片描述

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

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

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

4.2快速入门

  1. 安装启动zipkin。 java –jar zipkin.jar
    在这里插入图片描述

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

在这里插入图片描述

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

            <!-- 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>
    
  2. 分别配置服务提供方和消费方。

    provider

    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

    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
    
  3. 启动,测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值