1 环境说明
- JDK:1.8
- MAVENT:3.5
- SpringBoot:2.0.5.RELEASE
- SpringCloud:Finchley.SR1
2 创建服务注册中心 (Eureka 服务端)
说明: 本博文仅仅以一个单例的注册中心为例, 高可用的服务注册中心请参见
2.1 引入依赖
利用 IDEA 创建服务注册中心项目时只需要引入 spring-cloud-starter-netflix-eureka-server 一个依赖就可以啦
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
- <?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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>eureka</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>eureka</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.5.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR1</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
pom.xml
2.2 配置文件
配置服务注册中心端口以及服务服务注册中心的应用名
技巧 01: 单例模式下的服务注册中心需要关闭向其他服务注册中心注册本服务信息功能和从其他服务注册中心拉取注册服务信息功能
- server:
- port: 8761
- spring:
- application:
- name: eureka
- eureka:
- client:
- fetch-registry: false # 关闭从其他服务注册中心拉取服务信息
- register-with-eureka: false # 不向其他服务注册中心注册本服务的信息
- application.yml
2.3 引入服务注册中心配置
需要在启动类上利用 @EnableEurekaServer 将 SpringBoot 为我们提供的 Eureka 的相关配置引入到系统应用中, 否则 Eureka 服务注册中心不会生效
技巧 01:@EnableEurekaServer 的作用就是将某个配置了 Eureka 相关配置的类引入到应用容器中
2.4 启动服务注册中心
通过 IP 和端口访问的效果如果所示
3 创建 Eureka 客户端
3.1 引入依赖
利用 IDEA 创建 SpringBoot 项目时引入 spring-boot-starter-web,spring-cloud-starter-netflix-eureka-client 即可, 我这里同时引入了 devtools,lombok 只是为了开发方便而已
- <?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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>consumer</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>consumer</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.5.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR1</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
pom.xml
3.2 配置文件
需要配置应用名和应用端口, 配置注册中心连接信息
3.4 启动 Eureka 客户端
在启动类上利用 @EnableEurekaClient 将 Eureka 客户端的相关配置引入到应用容器中
3.5 启动 Eureka 客户端
Eureka 客户端启动成功后就可以在 Eureka 服务端的控制页面看到注册成功的服务信息, 例如
4 创建 ConfigServer
技巧 01:ConfigServer 也是一个 Eureka 客户端, 同样需要向 Eureka 服务端进行注册; 只不过这个服务专门负责管理一些配置文件
4.1 引入依赖
利用 IDEA 创建 SpringBoot 项目时引入 spring-cloud-starter-netflix-eureka-client ,spring-cloud-config-server 依赖
- <?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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>config</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>config</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.5.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.SR1</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-server</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
pom.xml
4.2 配置文件
需要配置应用端口, 应用名, 服务注册中心, 远程代码仓库
4.3 引入默认配置
利用 @EnableEurekaClient 将 Eureka 客户端的默认配置引入到应用容器中, 利用 @EnableConfigServer 将配置中心的的默认配置引入到应用容器中
4.4 启动配置中心应用
技巧 01: 启动成功后可以在 Eureka 的控制面板中查看到相关的服务注册信息, 例如
4.5 查看远程仓库中的配置信息
技巧 01: 配置服务中心启动时会暴露一些 URL, 可以利用这些 URL 访问远程仓库中的配置文件信息, 例如
4.5.1 访问规则说明
/{name}-{profiles} -> / 配置文件 - 环境
/{label}/{name}-{profiles} -> /git 分支 / 配置文件 - 环境
技巧 01: 以上两种格式都同时支持 yml,json,properties 三种数据格式
4.5.2 git 仓库配置文件命名
4.5.3 通过配置中心访问指定的配置文件信息
技巧 01: 访问任何一个 consumer-xxx.yml 的配置文件时都会和 consumer.yml 进行整合; 可以将 consumer.yml 作为共有配置的存放文件
技巧 02: 使用 /{name}-{profiles} 访问时默认访问 master 分支, 可以在配置中心的配置文件中指定使用哪一个分支
4.6 配置本地仓库路径和远程仓库分支
技巧 01: 配置中心服务从远程仓库获取到配置文件后会存放到本地的一个默认目录, 可以在配置中心服务的配置文件中配置这个本地仓库地址
技巧 02: 配置中心配置远程仓库地址信息时可以指定使用远程仓库的哪一个分支; 如果配置了分支后再使用 /{name}-{profiles} 这种格式获取配置文件信息时就会返回配置分支中的配置文件信息; 当然亦可以使用 /label/ /{name}-{profiles} 这种格式访问指定分支的配置文件信息
5 配置中心客户端
技巧 01: 需要从配置中心服务获取配置信息的服务都可叫作配置中心客户端
5.1 引入依赖
修改第三节的 Eureka 客户端, 只需要再引入 spring-cloud-config-client 即可
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-client</artifactId>
- </dependency>
5.2 修改配置
将原有的配置全部剪切到远程仓库中对应的 consumer.yml 配置文件中, 并将这个 cnsumer.yml 多复制几份并制定环境
5.3 配置启动配置文件
场景: config 是服务配置中心, consumer 是一个需要从 config 服务中获取配置信息的服务, eureka 是服务注册中心
技巧 01:config 和 consumer 都必须在 eureka 中心注册, consumer 是通过 eureka 从 config 中获取服务的; 所以不能直接将配置中心的连接信息配置到 application.yml 中, 而是需要新建一个启动配置文件 bootsttap.yml, 需要将应用名, 配置中心信息, 注册中心信息中心配置到 bootstrap.yml 中
技巧 02: 在 bootstrap.yml 中配置的应用名必须和远程仓库中的配置文件保持一致, 因为需要通过应用名到配置中心去获取该应用的配置信息
5.4 启动 consumer 服务
技巧 01: 启动 consumer 服务时控制台会打印出配置中心的信息, 例如
5.4 使用远程 git 中的配置文件
技巧 01: 和使用在 application.yml 中配置的信息一样, 例如
5.5 高可用配置中心搭建
将配置中心打包后分别部署就可以啦, 版案例利用 IDEA 通过不同端口启动实现
启动了两个配置中心后, 多次重启 consumer 服务时就会从不同的配置中心获取数据, 例如
6 整合消息中线
说明: 虽然 consumer 可以通过配置中心获取到远程仓库中的配置信息, 但是我们修改远程仓库中的配置文件时并不能生效; 想用时远程仓库的配置生效我们必须一起重启 config 服务和 consumer 服务; 如果不想通过从前来实现的话就需要使用消息总线来实现.
6.1 集成消息总线
6.1.1 安装 RabbitMQ
参考博文
rabbitMQ 控制台
6.1.2 添加依赖
分别在 consumer 和 config 服务中添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bus-amqp</artifactId>
- </dependency>
6.1.3 添加 RabbitMQ 配置
技巧 01:consumer 服务可以配置到远程服务的 consumer.yml 文件中
技巧 02:config 服务必须在 application.yml 中进行配置
6.1.4 配置 config 服务
开启 config 服务的所有映射端口, 想要让修改远程仓库中的仓库生效, 在修改后必须向 config 服务发送一个 post 请求, 请求路径为:/actuator/bus-refresh
6.1.5 添加 @RefreshScope
在用到了远程配置的类级别添加 @RefreshScope 注解, 否则修改远程仓库后及时向 config 的 / actuator/bus-refresh 发送了 post 请求也不会进行更新
6.1.6 启动 config 和 consumer 服务
启动服务后会自动在 RabbitMQ 中创建每个服务各自的 queue, 和一个 springcloudbus 对应 exchange
6.1.7 修改刷新
》修改远程仓库的配置信息, 修改后通过 config 可以获取到最新的配置, 但是其他服务不会拿到配置; 这时 ocnfig 服务必须触发一个事件将配置更新放到总线队列中去
》想 config 服务的 /actuator/bus-refresh 发送一个 post 请求就可以让 consumer 服务也获取到最新的配置信息
6.1.8 利用远程仓库向 config 服务的 /actuator/bus-refresh 发送 POST 请求
》利用 natapp 在远程仓库配置 webhooks
》在 config 服务中引入依赖 (如果不引入这个依赖就不会自动刷新, 必须手动向 config 服务发送 post 请求才能实现动态刷新)
- <!-- 自己添加的依赖: 解决了利用 github+rabbitmq 实现配置动态刷新的功能 -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-monitor</artifactId>
- </dependency>
》修改仓库配置信息并提交后 config 控制台会输出日志信息, 同时 rabbitMQ 中也会出现消息的推送和订阅
来源: https://www.cnblogs.com/NeverCtrl-C/p/9645990.html