近來因工作需要,springboot / spring cloud 構(gòu)建的產(chǎn)品需要提供嵌入k8s的能力,所以手動部署了一下。
目標(biāo):部署服務(wù)A與B,請求到達(dá)服務(wù)A,服務(wù)A內(nèi)部請求服務(wù)B,然后返回結(jié)果。
要實現(xiàn)在k8s上面通信,筆者使用了 spring-cloud-kubernetes 這個依賴包來完成,且使用的 maven 來構(gòu)建 project,讀者可以自行更換 gradle 等以及對應(yīng)版本,個人只貼出pom依賴,且version并未貼出,請自行尋找與自己使用的springboot版本對應(yīng)的veision:
org.springframework.cloud spring-cloud-starter-kubernetes
1.編寫兩個springboot應(yīng)用,分別名字為 demo-request 以及 demo-data,實現(xiàn)以上功能,具體如何構(gòu)建不再贅述,
demo-data服務(wù)部分核心服務(wù)代碼如下(忽略了部分重要的導(dǎo)包):
1.1 定義一個controller,返回了當(dāng)前請求的 ip 與 hostname@RestController
public class DataController {@GetMapping("/data")
public ResponseVOdata(){HashMapmap = new HashMap<>();
try {InetAddress address = InetAddress.getLocalHost();
map.put("name",address.getHostName());
map.put("address",address.getHostAddress());
System.out.println("Host Name: " + address.getHostName());
System.out.println("Host Address: " + address.getHostAddress());
} catch (UnknownHostException e) {e.printStackTrace();
}
return ResponseVOUtil.success(map);
}
}
1.2 main class標(biāo)記為一個web應(yīng)用啟動這里有一個比較重要的點,是通過 @EnableDiscoveryClient 開啟服務(wù)發(fā)現(xiàn)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class DataApp {public static void main(String[] args) {SpringApplication.run(DataApp.class, args);
}
}
1.3 appliaction.yml配置其中定義了服務(wù)的端口、名稱以及指定 namespace。
(筆者懶,直接使用之前測試es用的namespace,讀者可以提前構(gòu)建,命令如下:kubectl create ns ${your define namespace})
server:
port: 12001
spring:
application:
name: demo-data
cloud:
kubernetes:
discovery:
namespaces:
- myes
demo-request 服務(wù)部分核心服務(wù)代碼如下(忽略了部分重要的導(dǎo)包),大體與 demo-data 類似:
1.3 定義一個請求其他服務(wù)的請求筆者這里使用openFeign組件調(diào)用 demo-data 服務(wù)中的 /data 請求拿到結(jié)果,讀者可以自行使用其他組件比如 RestTemplate、okhttp等等
@RestController
public class RequestController {@Resource
private DataServer dataServer;
@GetMapping("request")
public ResponseVO data(){return dataServer.data();
}
}
1.4 feign接口配置這里的url很重要,因為未引入其他組件,此處的 url 采用了 k8s的 dns 尋址,拼接規(guī)則采用的 {service-name}.{namespace},讀者也可使用{namespace}.{service-name}等等,還可以使用環(huán)境變量,可以自行查看官方文檔描述。
但是在 spring-cloud-kubernetes 的官網(wǎng)中有這個描述:使用 spring-cloud-starter-kubernetes-discoveryclient 這個依賴包的全的命名規(guī)則為:{service-name}.{namespace}.svc.{cluster}.local:{service-port}。這里是官網(wǎng)描述,但是本人嘗試過沒有連通,如果有大佬能告知感激不盡!
@FeignClient(name = "demo-data", url = "http://demo-data.myes:12001")
public interface DataServer {@GetMapping("data")
public ResponseVOdata();
}
1.5 application.yml配置server:
port: 12002
spring:
application:
name: demo-request
cloud:
kubernetes:
discovery:
namespaces:
- myes
1.6 構(gòu)建鏡像自行測試以上服務(wù)能夠正常請求即可,打包以及構(gòu)建過程省略,請自行構(gòu)建鏡像
貼一個簡單的構(gòu)建demo-request服務(wù)的Dockerfile,筆者此處只寫了最小功能,如有需要可以自行修改
FROM java:8
MAINTAINER jyu
ADD ./demo-request-1.0-SNAPSHOT.jar /app.jar
EXPOSE 12002
ENTRYPOINT ["java","-jar","-Xms512m","-Xmx512m","-Dfile.encoding=utf-8","/app.jar"]
二、編寫k8s的yaml文件筆者自行創(chuàng)建 namespace 以及修改對應(yīng)的配置,其實這塊沒什么好寫的,因為是為了實現(xiàn)本文的目標(biāo)寫最小資源清單,筆者可以自行根據(jù)需要新增配置。
2.1 配置demo-data的yaml文件apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-data
namespace: myes
spec:
# 副本數(shù)增加為了測試service的負(fù)載均衡
replicas: 2
selector:
matchLabels:
run: demo-data
template:
metadata:
labels:
run: demo-data
spec:
# 此處筆者懶,指定了機(jī)器加載鏡像,但是在實際開發(fā)過程中,pod的構(gòu)建應(yīng)該交給k8s本身,讀者可以去掉
nodeName: node4
containers:
# 此處自行傳到自己的鏡像倉庫或者使用本地鏡像
- image: demo-data:1.0
name: demo-data
ports:
- containerPort: 12001
---
kind: Service
apiVersion: v1
metadata:
name: demo-data
namespace: myes
labels:
run: demo-data
spec:
type: NodePort
selector:
run: demo-data
ports:
- port: 12001
protocol: TCP
nodePort: 31991
2.2 配置demo-request的yaml文件總體與demo-data類似
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-request
namespace: myes
spec:
selector:
matchLabels:
run: demo-request
template:
metadata:
labels:
run: demo-request
spec:
nodeName: node4
containers:
- image: demo-request:1.0
name: demo-request
ports:
- containerPort: 12002
---
kind: Service
apiVersion: v1
metadata:
name: demo-request
namespace: myes
labels:
run: demo-request
spec:
type: NodePort
selector:
run: demo-request
ports:
- port: 12002
protocol: TCP
nodePort: 31992
2.3 結(jié)果測試根據(jù)2.1以及2.2的資源清單創(chuàng)建以后,會有如下資源出現(xiàn):
其中 pod/curl-test 為筆者創(chuàng)建的一個用于 curl 測試的臨時鏡像,命令如下,自行修改 namespace:
kubectl run -i --tty --image radial/busyboxplus:curl curl-test --restart=Never --rm -n myes
此時我們在 curl-test 這個 pod 中 ping 一下 service/demo-request 的預(yù)定義名稱,看看 ip 是否對應(yīng)的上:
ping demo-request.myes
結(jié)果如下,可以很清楚的看得到 demo-request.myes 這個域名能夠?qū)?yīng) service/demo-request 的 cluster-ip:
那么下一步請求一下 1.3 中預(yù)定義的請求:
curl demo-request.myes:12002/request
結(jié)果如下:
這里能夠正常返回,注意此處的結(jié)果,實際上是 demo-data 服務(wù)返回的結(jié)果,注意看返回的 name 與 address 字段。
那么整個請求單向鏈路圖為:
那么多來幾次就能看到負(fù)載能力,可以很清楚的看到 ip 是變了的:
總結(jié):本文屬于入門級教程,只告訴了讀者 springboot application 在 k8s 內(nèi)部如何內(nèi)部不通過其他組件實現(xiàn)通信,有一些更深入的玩法請自行了解官網(wǎng)。
比如 service 的負(fù)載均衡策略,配合 ingress 使用等等。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:如何將多個springboot應(yīng)用部署在k8s并實現(xiàn)互相通信-創(chuàng)新互聯(lián)
當(dāng)前URL:http://m.newbst.com/article28/jgicp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站設(shè)計、企業(yè)建站、動態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)