[000-01-016].第5节:SpringCloud-> Consul- 服务配置与刷新

我的后端学习大纲

SpringCloud学习大纲


1.1.分布式系统面临的问题:

  • 1.微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。如我们需要解决如下配置问题:
    • 比如某些配置文件中的内容大部分都是相同的,只有个别的配置项不同,就拿数据库配置来说吧,如果每个微服务使用的技术栈都是相同的,则每个微服务中关于数据库的配置几乎都是相同的,有时候主机迁移了,我希望一次修改,处处生效
    • 比如当下我们每一个微服务自己带着一个application.yml,上百个配置文件的管理,每个都依次修改是不太现实的
      在这里插入图片描述

1.2.使用服务配置官网说明:

在这里插入图片描述


1.3.服务配置:

a.需求:

  • 1.把通用的全局配置信息,直接注册进Consul服务器
  • 2.要是从Consul获取,那就需要遵守Consule的配置规则要求

b.修改8001支付服务:

b1.修改支付8001模块的pom文件:
<!--SpringCloud consul config-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency
b2.yml文件修改:
  • 1.配置规则说明
    在这里插入图片描述
  • 2.新增bootstrap.yml文件:
    • applicaiton.yml是用户级的资源配置项
    • bootstrap.yml系统级的,优先级更加高
    • Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
    • Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap contextApplication Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap ContextApplication Context配置的分离。
    • application.yml文件改为bootstrap.yml,这是很关键的或者两者共存。因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
  • 3.bootstrap.yml内容如下:
spring:
  application:
    name: cloud-payment-service
    ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
      config:
        profile-separator: '-' # default value is ",",we update '-'
        format: YAML

# config/cloud-payment-service/data
# config/cloud-payment-service-dev/data
# config/cloud-payment-service-prod/data
  • 4.application.yml文件修改:
server:
  port: 8001

# ==========applicationName + druid-mysql8 driver===================
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
    username: root
    password: 123456
  profiles:
    active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置

# ========================mybatis===================
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.atguigu.cloud.entities
  configuration:
    map-underscore-to-camel-case: true

c.consul服务器key/value配置填写:

c1.参考规则:
  • 1.我们填写的key/value只有consule能够识别才由意义,填写的内容主要是全局配置和动态刷新的一些规则,要想consule能够识别,就必须遵照它的一些配置规则
    在这里插入图片描述
c2.创建config文件夹,以“/”结尾
  • 1.书写key-value:必须是config开头
    在这里插入图片描述
c3.在config文件夹下分别创建其他3个文件夹,以 / 来结尾

在这里插入图片描述

c4.上述的三个文件夹下分别创建data内容,data不再是文件夹

在这里插入图片描述


d.controller修改:

@Value("${server.port}")
private String port;

@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${atguigu.info}") String atguiguInfo){
    return "atguiguInfo: "+atguiguInfo+"\t"+"port: "+port;
}

e .测试:

  • 1.通过修改application.yml里面的激活配置部分,进行内容的验证
    在这里插入图片描述

1.4.动态刷新:

a.问题引出:

我们在consul的dev配置分支上修改了内容,马上访问,但是却没有效果,没有做到及时刷新

b.实现及时更新步骤:

  • 1.@RefreshScope主启动类添加
package com.atguigu.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * @auther zzyy
 * @create 2023-11-03 17:54
 */
@SpringBootApplication
@MapperScan("com.atguigu.cloud.mapper") //import tk.mybatis.spring.annotation.MapperScan;
@EnableDiscoveryClient //服务注册和发现
@RefreshScope // 动态刷新
public class Main8001
{
    public static void main(String[] args)
    {
        SpringApplication.run(Main8001.class,args);
    }
}
  • 2.bootstrap.yml修改下生效时间(只是为了体验效果),在实际应用的时候,最好别改!!
    在这里插入图片描述
spring:
  application:
    name: cloud-payment-service
    ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}
      config:
        profile-separator: '-' # default value is ",",we update '-'
        format: YAML
        watch:
          wait-time: 1
# config/cloud-payment-service/data
#       /cloud-payment-service-dev/data
#       /cloud-payment-service-prod/data
  • 3.controller代码不用变更,然后下面进行请求接口测试:
@Value("${server.port}")
private String port;

@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${atguigu.info}") String atguiguInfo)
{
    return "atguiguInfo: "+atguiguInfo+"\t"+"port: "+port;
}

1.4.consul的配置持久化:

上述在consul中配置的属性在consul重启后就全部都没了,所以consul默认是没有持久化的,需要进行持久化配置

a.Consul持久化实现并注册为Windows服务:

  • 1.在指定目录下,新建一个文件夹和一个文件:
    在这里插入图片描述
  • 2.consul_start.bat的文件内容是:
@echo.服务启动......  
@echo off  
@sc create Consul binpath= "D:\devSoft\consul_1.17.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir D:\devSoft\consul_1.17.0_windows_386\mydata   "
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul start is OK......success
@pause
  • 3.右键管理员权限打开:
    在这里插入图片描述

  • 4.启动结果:
    在这里插入图片描述

  • 5.win后台:
    在这里插入图片描述

  • 6.后面consul的配置数据对保存到mydata文件夹下,,再重启就有数据了

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值