Spring Boot 2.0.6 整合 Spring Clod Bus + Kafka

本文介绍了如何将Spring Boot 2.0.6与Spring Cloud Bus和Kafka进行整合,详细阐述了配置中心和消息总线的设置过程,包括Eureka Server、Config Server、Config Client的搭建,以及测试步骤。文章还提到了整合过程中可能遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

Spring Boot 2 .0.6 整合 Spring Clod Bus + Kafka

整体说明

本文是对 纯洁的微笑 的技术文章 springcloud(九):配置中心和消息总线(配置中心终结版) 的SpringBoot版本改到2.0.6以及支持整合Kafka的相关处理。对整合过程中出现的问题作了记录,供大家参考。

前置条件

  1. kafka 集群,本文使用3个结点kafka。kafka具体搭建不多作说明,可参考 搭建kafka集群详细教程
  2. 一个自己可控的github账号及已建好的项目

功能说明

1. spring cloud bus 实现多个结点共用github上指定配置文件,对该配置文件push到github上以后,会自动更新到各个结点。

2. 因为webhook涉及到自有域名,本文未实现通过webhook自动更新。
   本文实现功能:
   多个结点共用github上指定配置文件,对该配置文件push到github上以后,手动调用refresh url,
   配置更新到所有结点

实现代码见 上传到git https://github.com/zx11010617/learning上的demo项目

限制说明

  1. kafka 集群的版本应该至少在1.*以上,0.*的版本会报如下错误
    java.lang.IllegalArgumentException: Magic v1 does not support record headers

  2. 高版本springboot如2.1.6对下文所述内容不支持

  3. 本地测试时,存在一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值