因此,这是设置:
这是一种经典的容器化微服务架构。
要求是使应用程序能够为运行在不同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
,目前还未知。
是否存在某种最佳实践来解决这些问题?
答案 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