Как обновить конфигурации с помощью сервера конфигурации Spring Cloud и шины Spring Cloud с помощью Rabbit MQ? - PullRequest
1 голос
/ 30 марта 2020

Я не смог найти ни одной актуальной и / или рабочей документации, и / или примера того, как это настроить, поэтому я занимался поиском, попыткой и ошибкой. Пока я не смог запустить его.

У меня config-server со следующими зависимостями:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

config-server имеет следующее bootstrap.yml:

spring:
  application:
    name: config-server
  rabbitmq:
    host: ${RABBIT_MQ_HOST:localhost}
    port: ${RABBIT_MQ_PORT:5672}
    username: ${RABBIT_MQ_URSER_NAME:guest}
    password: ${RABBIT_MQ_URSER_PASSWORD:guest}

И следующее application.yml

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/MyGit/config-repository.git
          cloneOnStart: true

management:
  endpoints:
    web:
      exposure:
        include: "*"

server:
  port: 8888

Все мои клиенты имеют следующие зависимости:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

Их bootstrap.yml, например, выглядит так:

spring:
  application:
    name: user-service
  cloud:
    config:
      uri: http://${CONFIG_HOST:localhost}:${CONFIG_PORT:8888}
  rabbitmq:
    host: ${RABBIT_MQ_HOST:localhost}
    port: ${RABBIT_MQ_PORT:5672}
    username: ${RABBIT_MQ_URSER_NAME:guest}
    password: ${RABBIT_MQ_URSER_PASSWORD:guest}

И их application.yml вот так:

management:
  endpoints:
    web:
      exposure:
        include: "*"

server:
  port: 8000

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka

Я использую пружины @ConfigurationProperties, например:

@Component
@ConfigurationProperties("user")
@Getter
@Setter
public class UserConfiguration {
    private String role;
}

Я запускаю все свои сервисы (включая rabbitmq), используя docker и docker-compose:

version: "3"

services:

  rabbitmq:
    image: bitnami/rabbitmq:latest
    container_name: rabbitmq
    environment:
      RABBITMQ_USERNAME: admin
      RABBITMQ_PASSWORD: admin
    ports:
      - "4369:4369"
      - "5672:5672"
      - "15672:15672"
      - "25672:25672"

  config-server:
    build:
      context: config-server
      dockerfile: Dockerfile
    container_name: config-server
    depends_on:
      - rabbitmq
    environment:
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
    ports:
      - "8888:8888"

  eureka-server:
    build:
      context: eureka-server
      dockerfile: Dockerfile
    container_name: eureka-server
    depends_on:
      - rabbitmq
      - config-server
    environment:
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
      CONFIG_HOST: "config-server"
      CONFIG_PORT: "8888"
    ports:
      - "8761:8761"

  zuul-gateway:
    build:
      context: zuul-gateway
      dockerfile: Dockerfile
    container_name: zuul-gateway
    depends_on:
      - rabbitmq
      - config-server
      - eureka-server
    environment:
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
      CONFIG_HOST: "config-server"
      CONFIG_PORT: "8888"
      EUREKA_HOST: "eureka-server"
      EUREKA_PORT: "8761"
    ports:
      - "8765:8765"

  user-service:
    build:
      context: user-service
      dockerfile: Dockerfile
    container_name: user-service
    depends_on:
      - rabbitmq
      - config-server
      - eureka-server
    environment:
      SPRING_PROFILES_ACTIVE: "development"
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
      CONFIG_HOST: "config-server"
      CONFIG_PORT: "8888"
      EUREKA_HOST: "eureka-server"
      EUREKA_PORT: "8761"
    ports:
      - "8000:8000"

  user-service-2:
    build:
      context: user-service
      dockerfile: Dockerfile
    container_name: user-service-2
    depends_on:
      - rabbitmq
      - config-server
      - eureka-server
    environment:
      SPRING_PROFILES_ACTIVE: "development"
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
      CONFIG_HOST: "config-server"
      CONFIG_PORT: "8888"
      EUREKA_HOST: "eureka-server"
      EUREKA_PORT: "8761"
    ports:
      - "8001:8000"

  user-service-3:
    build:
      context: user-service
      dockerfile: Dockerfile
    container_name: user-service-3
    depends_on:
      - rabbitmq
      - config-server
      - eureka-server
    environment:
      SPRING_PROFILES_ACTIVE: "development"
      RABBIT_MQ_HOST: "rabbitmq"
      RABBIT_MQ_PORT: "5672"
      RABBIT_MQ_URSER_NAME: "admin"
      RABBIT_MQ_URSER_PASSWORD: "admin"
      CONFIG_HOST: "config-server"
      CONFIG_PORT: "8888"
      EUREKA_HOST: "eureka-server"
      EUREKA_PORT: "8761"
    ports:
      - "8002:8000"

Когда все мои сервисы запущены, сначала все вроде нормально , Все сервисы зарегистрированы в eureka, все сервисы доступны на localhost и могут общаться друг с другом. Но конфиг refre sh не работает.

Когда я что-то изменяю в своем конфигурационном репозитории и фиксирую, а pu sh это не влияет на мои сервисы. Конфигурация у них остается прежней. Когда я вручную вызываю команду refre sh на моем config-сервере:

http://localhost:8888/bus/refresh

с POST, как это описано почти во всех руководствах, которые я смог найти до сих пор, я получаю ответ:

{
    "timestamp": "2020-03-30T09:33:57.818+0000",
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "path": "/bus/refresh"
}

Когда я использую GET вместо этого, я получаю:

{
    "name": "bus",
    "profiles": [
        "refresh"
    ],
    "label": null,
    "version": "03759e798f3516da6a18fc8b61a265d37ddeff4e",
    "state": null,
    "propertySources": []
}

, и это также не влияет на конфигурацию моих услуг. И когда я звоню по шине refre sh на любой из моих услуг, я получаю:

{
    "timestamp": "2020-03-30T09:35:39.643+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/bus/refresh"
}

Что мне нужно сделать, чтобы работала автоматическая настройка refre sh?

Ручной вызов конечных точек /actuator/refresh на сервисах работает. Затем они тянут новый конфиг. Похоже, кролик mq просто не работает.

1 Ответ

0 голосов
/ 31 марта 2020

Я нашел решение. На самом деле мои файлы настройки и конфигурации полностью в порядке, я просто назвал неправильную конечную точку. Вместо того, чтобы звонить:

http://localhost:8888/bus/refresh

Мне нужно позвонить:

http://localhost:8888/actuator/bus-refresh

Это работает на любом сервисе, который я запустил. Он автоматически отправит сообщение rabbitmq, которое затем опубликует sh refre sh для всех потребителей. Затем все конфигурации обновляются.

Хотя я до сих пор не знаю, почему bus/refresh не работает. Он используется во многих примерах / руководствах.

...