为运行java映像的POD启用rest通信

为运行java映像的POD启用rest通信,java,docker,kubernetes,microservices,Java,Docker,Kubernetes,Microservices,这就是设置: 每个pod将运行一个容器(java应用程序) 每个pod都提供自己的UI 每个java应用程序都需要访问一个mysql数据库 对于每个java应用程序,都需要使用rest调用检索和提供信息 它是一种典型的容器化微服务体系结构 要求是使应用程序能够请求并为运行在不同POD上的其他应用程序提供信息。但由于我需要在将这些调用推送到集群之前设置它们,老实说,我不知道它应该如何工作 例如,我有一个应用程序正在使用另一个rest接口请求数据: public List<Article&

这就是设置:

  • 每个pod将运行一个容器(java应用程序)
  • 每个pod都提供自己的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();
    }
public List getArticles(){
字符串url=http://ip:port/article/getAllArticles/;
HttpEntity=prepareHttpEntity();
ResponseEntity response=restemplate.exchange(url,HttpMethod.GET,entity,List.class);
返回response.getBody();
}
我如何确保它连接到正确的服务(pod)?

DB设置也一样。我需要告诉应用程序
数据源
,这是未知的


是否有某种最佳实践来处理这些问题?

每个Pod在创建时都有自己的群集专用IP,但您永远不会依赖它,因为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 
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
因此,您连接Pod服务的方式是通过标签和选择器。现在,您可以使用以下url点击pod:

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

kind: Service
apiVersion: v1
metadata:
  name: serviceA
spec:
  selector:
    app: appA
  ports:
  - name: serviceAPort
    protocol: TCP
    port: 80
    targetPort: 8080 
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();
}
@Value(${appA.baseUrl})
字符串地址;
公共列表,而不是Pod,因为它为您提供了更多的灵活性和对容器的控制


如果要对数据库进行容器化,那么您可能需要签出

每个Pod在创建时都有自己的集群专用IP,但您永远不会依赖它,因为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 
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
因此,您连接Pod服务的方式是通过标签和选择器。现在,您可以使用以下url点击pod:

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

kind: Service
apiVersion: v1
metadata:
  name: serviceA
spec:
  selector:
    app: appA
  ports:
  - name: serviceAPort
    protocol: TCP
    port: 80
    targetPort: 8080 
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();
}
@Value(${appA.baseUrl})
字符串地址;
公共列表,而不是Pod,因为它为您提供了更多的灵活性和对容器的控制

如果您要将数据库容器化,那么您可能需要签出