> 服務發現與負載均衡。 # 一、背景 在微服務架構中,這裡以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、註冊中心、配置中心等相關服務,可以被集群外部訪問; ) ;
private static final String SERVER_NAME = "http://app-service:8082/serve";
private static final String SERVER_IP = "http://10.103.252.94:8082/serve";
/**
* 每30秒執行一次
*/
@Scheduled(fixedDelay = 30000)
public void systemDate () {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(3000);
factory.setConnectTimeout(6000);
RestTemplate restTemplate = new RestTemplate(factory);
try {
Map<String, String> paramMap = new HashMap<>();
String result = restTemplate.getForObject(SERVER_NAME, String.class, paramMap);
LOG.info("service-name-resp::::" + result);
} catch (Exception e) {
e.printStackTrace();
}
try {
Map<String, String> paramMap = new HashMap<>();
String result = restTemplate.getForObject(SERVER_IP, String.class, paramMap);
LOG.info("service-ip-resp::::" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在代碼中通過服務名:埠
和IP:埠
都可以正常訪問,在Pod中查看兩個應用的日誌,請求和響應都正常;
四、外部服務發現
1、NodePort類型
指定類型為NodePort
的腳本:app-np-service.yaml
;
apiVersion: v1
kind: Service
metadata:
name: app-np-service
spec:
type: NodePort
selector:
app: auto-serve
ports:
- protocol: TCP
port: 8082
targetPort: 8082
nodePort: 30010
創建【Service】
kubectl apply -f app-np-service.yaml
使用NodePort
類型,K8S控制平面會在指定的範圍內分配埠,如果需要特定的埠號可以指定nodePort
欄位中的值,但是該類型需要自己設置負載均衡解決方案;
2、LoadBalancer類型
指定類型為LoadBalancer
的腳本:app-lb-service.yaml
;
apiVersion: v1
kind: Service
metadata:
name: app-lb-service
spec:
type: LoadBalancer
selector:
app: auto-serve
ports:
- protocol: TCP
port: 8082
targetPort: 8082
創建【Service】
kubectl apply -f app-lb-service.yaml
查看【Service】
在查看「app-lb-service」時,值得註意一下Endpoints
的欄位屬性,這裡就是Pod選擇器選中的Pod
;
kubectl get svc app-lb-service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
app-lb-service LoadBalancer 10.111.65.220 localhost 8082:30636/TCP 6m49s app=auto-serve
kubectl describe svc app-lb-service
Name: app-lb-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=auto-serve
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.111.65.220
IPs: 10.111.65.220
LoadBalancer Ingress: localhost
Port: <unset> 8082/TCP
TargetPort: 8082/TCP
NodePort: <unset> 30636/TCP
Endpoints: 10.1.0.160:8082,10.1.0.161:8082,10.1.0.162:8082
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
serve-deployment-f6f6c5bbd-9qvgr 1/1 Running 0 39m 10.1.0.162 docker-desktop
serve-deployment-f6f6c5bbd-w7nj2 1/1 Running 0 39m 10.1.0.161 docker-desktop
serve-deployment-f6f6c5bbd-x7v4d 1/1 Running 0 39m 10.1.0.160 docker-desktop
五、參考源碼
文檔倉庫:
https://gitee.com/cicadasmile/butte-java-note
腳本倉庫:
https://gitee.com/cicadasmile/butte-auto-parent
Gitee主頁: https://gitee.com/cicadasmile/butte-java-note