为运行Java映像的Pod启用休息通信

时间:2018-12-15 15:28:43

标签: java docker kubernetes microservices

因此,这是设置:

  • 每个吊舱将运行一个容器(java应用程序)
  • 每个吊舱都提供自己的UI
  • 每个Java应用都有一个需要访问的mysql数据库
  • 对于每个Java应用,必须使用rest调用来检索和提供信息

这是一种经典的容器化微服务架构。

要求是使应用程序能够为运行在不同Pod上的其他应用程序请求并提供信息。但是由于我需要在将这些调用推送到我拥有的集群之前进行设置,因此老实说,不知道它应该如何工作。

例如我有一个应用程序正在使用另一个rest接口来请求数据:

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 :(得分:2)

每个 Pod 创建时都会有其自己的群集专用IP,但是您永远不必依赖它,因为Pod是临时。如果您想与 Pod 进行通话,请创建一个Service,将流量路由到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 的方式是通过标签选择器。现在,您可以使用以下网址访问您的广告连播:

http://serviceA:80

在第二个应用程序中,您将具有以下Pod定义:

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,因为它为您提供了更大的灵活性和对容器的控制。

如果要对数据库进行容器化,则可能要签出Persistent Volume