SpringCloud(3)

SpringCloud

1 分布式配置中心SpringCloudConfig

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,所以需要分布式配置中心组件。
在使用分布式配置中心之前必须要有一个 git 服务器和对应的账号密码(这里以码云作为讲解使用)
解决痛点:改配置,不用重启服务

1.1 创建Gitee仓库

config-server
创建一个装配置文件的文件夹:
在这里插入图片描述
上传几个写好的配置文件到文件夹:
在这里插入图片描述
配置内容很easy:
在这里插入图片描述

1.2 使用分布式配置中心

新模块:springcloud-config
在这里插入图片描述
修改pom,启动类加注解@EnableDiscoveryClient,@EnableConfigServer
配置文件

spring:
  application:
    name: config-server # 服务名
  cloud:
    config:
      server:
        git:
          # gitee仓库地址,去掉.git
          uri: https://gitee.com/lixixixi/config-server
          # 装配置文件的文件夹
          search-paths: config
          # 仓库私有必须配置用户名密码,公开的不用
          username:
          password:
server:
  port: 5666 # 端口
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/

启动eureka和config,访问http://localhost:1111/查看服务
在这里插入图片描述
然后访问http://localhost:5666/application/dev(注意访问路径和配置文件名字的关联,一定是中划线)
http 请求地址:/{application}/{profile}[/{label}]
label: 指的是分支名字,默认 master 可以不写
资源文件:
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
示例:
本例中资源文件是 application-prod.yml,其中 application 就是 application,prod就是 profile,匹配资源文件的第三种,访问地址就是/application(application)/prod(profile)
在这里插入图片描述

1.3 配置中心客户端

新建模块springcloud-config-client
在这里插入图片描述
修改pom文件,启动类添加注解@EnableDiscoveryClient
配置
Spring cloud config 的客户端在启动的时候,默认会从 classpath 中加载配置信息并启动应用,只有当我们配置了 spring.cloud.config.uri 的时候,客户端才会尝试从 spring cloud config 的服务端来获取远程配置信息 并初始化 Spring 环境,同时我们必须将该参数配置在bootstrap.properties/bootstrap.yml,放置于 resources 中,环境变量或者优先级高于应用jar 包内的配置信息中才能正确加载到远程配置。
bootstrap.yml

spring:
  application:
    name: config-client
  cloud:
    config:
      discovery:
        # 开启访问配置中心的功能
        enabled: true
        # 对应 配置中心的服务名
        service-id: CONFIG-SERVER
      # 对应配置文件的后缀
      profile: dev
server:
  port: 5777
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/

创建一个controller获取配置信息

@RestController
@RefreshScope
public class ConfigController {
    @Value("${web.name}")
    private String siteName;
    @GetMapping("/config/get")
    public String getConfig() {
        return siteName;
    }
}

启动应用访问:http://localhost:5777/config/get,获取配置成功
在这里插入图片描述
在这里插入图片描述
失败快速响应配置,获取配置重试 当前版本不可用
动态刷新配置
先改了 git 上的配置,应用拿到的不是最新配置,为了让应用拿到最新的配置,最笨的办法就是重启应用,但是这种做法在生产环境是不允许的。我们可以为客户端配置 actuator 来动态刷新。
在客户服务端config-client加入依赖:

<!--监控服务-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

暴露/refresh接口(这个可以直接配置在application.yml中):

management:
  endpoints:
    web:
      # 前缀
      base-path: /lxy
      exposure:
        # 暴露监控的端口
        include: health,info,refresh

每次改完 gitee 上的配置文件,直接 post 请求一下/lxy/refresh 接口即可:http://localhost:5777/lxy/refresh
在这里插入图片描述
注意:需要在对应的控制器或者获取配置的地方加上注解:@RefreshScope
这样修改了配置文件后,依然每个服务都要去访问一次refresh接口,很多很多配置文件的话,这样还是很麻烦,所以引出了spring cloud bus 消息总线来实现批量更新。但是学习消息总线之前,就要先学习RabbitMQ/Kafka相关知识。

2 消息总线SpringCloudBus

用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。可以为微服务做监控,也可以实现应用程序之间的相互通信。
如果有几十个微服务,而每一个服务又是多实例,当更改配置时,需要重新启动多个微服务实例,会非常麻烦。 Spring Cloud Bus 的一个功能就是让这个过程变得简单,当远程 Git 仓库的配置更改后,只需要向某一个微服务实例发送一个 Post 请求,通过消息组件通知其他微服务实例重新拉取配置文件。

2.1 第一种架构

在这里插入图片描述
改动之前的service
添加相关依赖:bus-amqp, actuator, spring-retry, aop, spring-cloud-starter-config
配置文件bootstrap.yml

spring:
  application:
    name: my-service
  rabbitmq:
    host: 122.51.64.14
    virtual-host: my_vhost
    username: root
    password: 1111
    port: 5672
    connection-timeout: 6000
  cloud:
    config:
      discovery:
        # 开启访问配置中心的功能
        enabled: true
        # 对应 配置中心的服务名
        service-id: CONFIG-SERVER
      # 对应配置文件的后缀
      profile: dev
      # 失败快速响应
      # fail-fast: true
server:
  port: 5777
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/
management:
  endpoints:
    web:
      base-path: /lxy
      exposure:
        include: info,health,bus-refresh
# 暴露配置刷新接口

创建获取配置的controller

@RestController
public class ConfigController {
    @Value("${web.name}")
    private String webName;
    @GetMapping("/config/get")
    public String getConfig() {
        return webName;
    }
}

可以通过向启动一个 service 发送刷新配置接口,来更新所有 service 实例的配置

2.2 第二种架构

在这里插入图片描述
将config Server中加入springCloud bus。所以只需要改造configServer服务端即可。

  1. springcloud-config引入依赖:消息总线bus-amqp,监控服务actuator
  2. 修改配置application.yml
rabbitmq:
    host: 122.51.64.14
    virtual-host: my_vhost
    username: root
    password: 1111
    port: 5672
    connection-timeout: 6000
# 暴露刷新接口
management:
  endpoints:
    web:
      base-path: /lxy
      exposure:
        include: info,health,bus-refresh

每次改动配置文件只需访问configServer的刷新配置接口即可,访问http://localhost:5666/actuator/bus-refresh

3 消息驱动的微服务SpringCloudStream

实现了MDB功能,更加简化方便的整合消息组件。
工作原理:
处理架构
在这里插入图片描述
最底层是消息服务,中间层是绑定层, 绑定层和底层的消息服务进行绑定,顶层是消息生产者和消息消费者,顶层可以向绑定层生产消息和获取消息消费。
优点:只关注业务,缺点:配置文件没有命令提示。

3.1 消息生产者模块:springcloud-producer-stream

在这里插入图片描述

  1. 依赖:spring-cloud-starter-stream-rabbit
  2. 配置文件
spring:
  application:
    name: stream-producer # 应用名字
  cloud:
    stream:
      binders: # 在此处配置要绑定的 rabbitmq 的服务信息
        java-rabbit: # 表示定义的名称,用于于 binding 整合
        type: rabbit # 消息组件类型
        environment: # 设置 rabbitmq 的相关的环境配置
          spring:
            rabbitmq:
              host: 122.51.64.14
              username: root
              password: 1111
              connection-timeout: 15000
              virtual-host: my_vhost
              port: 5672
      bindings: # 服务的整合处理
        output: # 这个名字是一个通道的名称 内置的输出通道
          destination: stream_exchange # 表示要使用的 Exchange 名称定义
          content-type: application/json # 设置消息类型,本次为对象 json,如果是文本则设置“text/plain”
          binder: java-rabbit # 设置要绑定的消息服务的具体设置
server:
  port: 8666 # 端口
eureka:
  client:
    service-url:
    # 注册中心地址
    defaultZone: http://eureka1:1111/eureka/,http://eureka2:1112/eureka/
  1. service层:SendServiceImpl.java
@Service
@EnableBinding(Source.class)
public class SendServiceImpl implements SendService {
    @Autowired
    private MessageChannel output;
    @Override
    public void sendMsg(String msg) {
        // 发送消息
        output.send(MessageBuilder.withPayload(msg).build());
    }
}
  1. 控制层:
@RestController
public class StreamConrtoller {
    @Autowired
    private SendService sendService;
    @GetMapping("/stream/send/{msg}")
    public String send(@PathVariable String msg) {
        sendService.sendMsg(msg);
        return "success";
    }
}

3.2 消费者模块springcloud-consumer-stream

同生产一致,引入相同依赖,只需修改配置文件,输出改为输入
在这里插入图片描述
创建监听器

@Component
@EnableBinding(Sink.class)
public class MessageListener {
    @StreamListener(Sink.INPUT)  // 监听输入
    public void getMsg(Message<String> message) {
        System.out.println("获取的消息:"+message.getPayload());
    }
}

可以先启动消费者,再启动生产者,然后发送消息即可测试。
测试时,mq会创建一个随机队列,消息通过这个队列传递。
在这里插入图片描述

由此可见,代码中没有出现rabbitMQ相关的代码,进行隔离,stream这个框架把这些输入输出都做了。如果换中间件,只需要改配置就可,不用改业务代码,优势就是可以方便切换中间件。

4 分布式服务跟踪SpringCloudSleuth

服务链路跟踪功能可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能
span:基本的工作单元。包括一个64位的唯一的id,一个64位trace码,描述信息,时间戳事件,key-value注解(tags),span处理者的ID(通常为IP)。
Trace:包含一系列的工作单元span,他们组成一个树形结构。
Annotation:及时记录存在事件。

Zipkin-server搭建
Springboot2.x 之后,官方不再推荐自己搭建 zipkin 服务,而是推荐使用docker/java 的方式去搭建,这里我们使用 docker 的方式搭建:
搜索:docker search zipkin
下载:docker pull docker.io/openzipkin/zipkin
运行:docker run -d -p 9411:9411 openzipkin/zipkin
搭建成功,访问:外网ip:9411/zipkin/
在这里插入图片描述

4.1 准备调用服务

主要是要形成调用链服务,直接在之前的service,feign服务上改造

  1. 改造feign服务
    加入依赖:spring-cloud-starter-sleuth,spring-cloud-sleuth-zipkin
  2. 修改feign的配置文件,添加 spring.zipkin.base-url:http:外网ip:9411/
  3. 改造service服务:加入和 feign 相同的依赖以及相同的配置即可
  4. 启动注册中心eureka,配置中心config(才能启动service),service服务,feign服务,然后利用feign去调用service服务,查看控制台日志:
    在这里插入图片描述
    红框里面有四个参数:
    第一个参数是:应用名字
    第二个参数是:Trace ID , 一条链路上的 Trace ID 是相同的
    第三个参数是:Span ID, 一个基本工作单元. 因为只调用了一个服务, 所以只有一个 SpanID
    第四个参数是:表示是否要将该信息输出到 Zipkin 等服务中来收集和展示
  5. 访问http://localhost:7501/feign/hello,然后去查看服务
    在这里插入图片描述
    在这里插入图片描述
    出问题的话,可以借助跟踪链查错误根源

项目架构

在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1815

猜你喜欢

转载自blog.csdn.net/weixin_45044097/article/details/103899558