Включить связь покоя для модулей, работающих с Java-изображениями - PullRequest
0 голосов
/ 15 декабря 2018

Итак, это настройка:

  • каждый модуль запускает один контейнер (приложение Java)
  • каждый модуль предоставляет свой собственный пользовательский интерфейс
  • для каждого JavaВ приложении есть база данных mysql, к которой ему необходимо получить доступ
  • для каждого Java-приложения, которое необходимо извлекать и предоставлять информацию с помощью вызовов покоя

Это своего рода классическая контейнерная архитектура микросервиса.

Требуется разрешить приложениям запрашивать и предоставлять информацию для других приложений, работающих на разных модулях. Но так как мне нужно настроить эти вызовы, прежде чем я отправлю их в кластер, яя, честно говоря, понятия не имею, как это должно работать.

Например, я получил приложение, которое использует другой интерфейс отдыха для запроса данных:

public List<Article> getArticles() {
        String url = http://ip:port/article/getAllArticles/;
        HttpEntity entity = prepareHttpEntity();
        ResponseEntity<List> response = restTemplate.exchange(url, HttpMethod.GET, entity, List.class);
        return response.getBody();
    }

Как я могу сделатьВы уверены, что он подключается к нужному сервису (pod)?

То же самое для настройки БД.Мне нужно сообщить приложению datasource, который пока неизвестен.

Есть ли какая-нибудь лучшая практика для решения этих проблем?

1 Ответ

0 голосов
/ 15 декабря 2018

Каждый Pod при создании будет иметь свой собственный частный IP-адрес кластера, но вы никогда не будете зависеть от него, так как pods ephemeral .Если вы хотите поговорить с Pod , вы создаете Сервис , который направляет трафик в модуль.

restCall --> Service --> Pod

Допустим, у вас есть следующее определение Pod

apiVersion: v1
kind: Pod
metadata:
  name: appAPod
  labels:
    app: appA
spec:
  containers:
  - name: aNameForApp1Container
    image: yourRepository/imageName:tag
    ports:
    - containerPort: 8080
  ...

Затем вы сделаете его доступным, создав определение сервиса:

kind: Service
apiVersion: v1
metadata:
  name: serviceA
spec:
  selector:
    app: appA
  ports:
  - name: serviceAPort
    protocol: TCP
    port: 80
    targetPort: 8080 

Таким образом, вы подключаете Pod и Service через метки и селектор .Теперь вы можете поразить ваш модуль следующим URL:

http://serviceA:80

Во втором приложении у вас будет следующее определение модуля:

apiVersion: v1
kind: Pod
metadata:
  name: appBPod
  labels:
    app: appB
spec:
  containers:
  - name: aNameForApp2Container
    image: yourRepository/imageName2:tag
    ports:
    - containerPort: 8080
    env:
    - name: "APP_A_ADDRESS"
      value: serviceA
    - name: "APP_A_PORT"
      value: 80

Поскольку вы используете RestTemplate,Я предполагаю, что вы используете Spring.Итак, в вашем application.properties:

..
..
appA.baseUrl=http://${APP_A_ADDRESS}:${APP_A_PORT}

А в вашем коде:

@Value("${appA.baseUrl}")
String appABaseUrl;

public List<Article> getArticles() {
        String url = appABaseUrl + "/article/getAllArticles/";
        HttpEntity entity = prepareHttpEntity();
        ResponseEntity<List> response = restTemplate.exchange(url, HttpMethod.GET, entity, List.class);
        return response.getBody();
}

Вы должны рассматривать Deplyments вместо Pod, какон предлагает вам больше гибкости и контроля над вашими контейнерами.

Если вы собираетесь контейнировать свою БД, то вы можете проверить Постоянный том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...