Spring Boot 2 .0.6 整合 Spring Clod Bus + Kafka
整体说明
本文是对 纯洁的微笑 的技术文章 springcloud(九):配置中心和消息总线(配置中心终结版) 的SpringBoot版本改到2.0.6以及支持整合Kafka的相关处理。对整合过程中出现的问题作了记录,供大家参考。
前置条件
- kafka 集群,本文使用3个结点kafka。kafka具体搭建不多作说明,可参考 搭建kafka集群详细教程
- 一个自己可控的github账号及已建好的项目
功能说明
1. spring cloud bus 实现多个结点共用github上指定配置文件,对该配置文件push到github上以后,会自动更新到各个结点。
2. 因为webhook涉及到自有域名,本文未实现通过webhook自动更新。
本文实现功能:
多个结点共用github上指定配置文件,对该配置文件push到github上以后,手动调用refresh url,
配置更新到所有结点
实现代码见 上传到git https://github.com/zx11010617/learning上的demo项目
限制说明
-
kafka 集群的版本应该至少在1.*以上,0.*的版本会报如下错误
java.lang.IllegalArgumentException: Magic v1 does not support record headers -
高版本springboot如2.1.6对下文所述内容不支持
-
本地测试时,存在一个bug。对一个config-client项目,通过修改配置文件server.port,启动两个config-client服务,分别调用两次bus-refresh会将第其中一个服务下线。
因此建议,通过写两份配置文件本地分别高用不同配置文件启动服务,或者建两个服务或者打两个jar包等方式测试。
整合及测试
下面主要列出pom和properties文件以及java文件。具体代码可以见前述git链接。
1、 搭建eureka-server
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fs</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for eureka-server</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</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.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</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>
application.properties如下:
spring.application.name=eureka
server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
启动类如下:
package com.fs.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class ErukaServerApplication {
// http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html
public static void main(String[] args) {
SpringApplication.run(ErukaServerApplication.class, args);
}
}
2、搭建config-server
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fs</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-server</name>
<description>Demo project for config-server</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/>
</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.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!--config-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--高可用添加-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>RELEASE</version>
</dependency>
<!--消息总线支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
<version>2.0.0.RELEASE</version>
</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>
application.properties如下:
spring.application.name=spring-cloud-config-server
server.port=8001
### git配置 ###
spring.cloud.config.server.git.uri=https://github.com/zx11010617/mysp.git
spring.cloud.config.server.git.search-paths=demo/src/main/conf
spring.cloud.config.server.git.username=zx11010617
spring.cloud.config.server.git.password=**********
### kafka配置。注意的是kafka集群的版本要是1.x以上 ###
## 消费者配置
spring.kafka.consumer.group-id=test-consumer-group0
spring.kafka.bootstrap-servers=bg14:9092,bg15:9092,bg16:9092
## 生产者配置
#不配置此项有可能造成bus的springCloudBus无法初始化
spring.cloud.stream.kafka.binder.autoCreateTopics=true
spring.cloud.stream.kafka.binder.auto-add-partitions=true
spring.cloud.stream.kafka.binder.replication-factor=3
spring.cloud.stream.bindings.springCloudBusOutput.producer.partitionCount=3
### bus配置 ###
# 添加对refresh支持
spring.cloud.bus.refresh.enabled=true
# bus用这个对应的,对应的刷新url是 http://localhost:8005/actuator/bus-refresh。这里经测试只能写bus-refresh
management.endpoints.web.exposure.include=bus-refresh
bootstrap.properteis如下:
spring.cloud.config.name=config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
eureka.client.serviceUrl.defaultZone=http://bg16:8000/eureka
spring.cloud.config.discovery.serviceId=spring-cloud-config-server
添加启动类
package com.fs.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.stream.binder.PartitionKeyExtractorStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.M