上一篇我們介紹到了Azure Spring Cloud的部署方式,可是上面只有單個服務的部署,那我們如果要使用微服務的架構部署該怎麼辦呢?不同的Micro-service之間又是怎麼溝通的呢,前一篇講到Azure Spring Cloud,看來逃不掉介紹微服務了,今天只好把這個坑填起來了XD
準備
這篇用的範例是PiggyMetrics
git clone https://github.com/sqshq/piggymetrics.git
接下來將下面的bash script填上自己的資訊並且儲存為setup.sh
setup.sh
# Azure
export RESOURCE_GROUP=INSERT-your-resource-group-name
export REGION=eastus
export SPRING_CLOUD_SERVICE=INSERT-your-spring-cloud-service-name
# Mongo DB
export MONGODB_DATABASE=INSERT-your-mongodb-database-name
export MONGODB_USER=INSERT-your-cosmosdb-account-name
export MONGODB_URI="INSERT-your-mongodb-connection-string"
export MONGODB_RESOURCE_ID=INSERT-your-mongodb-resource-id
# Rabbit MQ
export RABBITMQ_RESOURCE_GROUP=INSERT-your-rabbitmq-resource-group-name
export VM_NAME=INSERT-your-rabbitmq-virtual-machine-name
export ADMIN_USERNAME=INSERT-your-rabbitmq-admin-user-name
export RABBITMQ_HOST=INSERT-your-rabbitmq-host-public-ip-address
export RABBITMQ_PORT=5672
export RABBITMQ_USERNAME=INSERT-your-rabbitmq-username
export RABBITMQ_PASSWORD=INSERT-your-rabbitmq-password
讓export生效
source setup.sh
登入azure
az login
安裝Spring Cloud Extension
az extension add --name spring-cloud
再來建立一個資源群組
az group create --name ${RESOURCE_GROUP} \
--location ${REGION}
建立 Spring Cloud 資源
az spring-cloud create --name ${SPRING_CLOUD_SERVICE} \
--resource-group ${RESOURCE_GROUP} \
--location ${REGION}
因為再來有一長串指令,所以可以先設定預設的Resource Group
az configure --defaults \
group=${RESOURCE_GROUP} \
location=${REGION} \
spring-cloud=${SPRING_CLOUD_SERVICE}
首先,先創建Gateway的instance
az spring-cloud app create --name gateway --instance-count 1 --is-public true
回傳的部分可以看到一個URL,打開之後就會發現有一個Spring Cloud的畫面了
再來可以把其他的instance也都建立好
az spring-cloud app create --name account-service --instance-count 1
az spring-cloud app create --name auth-service --instance-count 1
az spring-cloud app create --name statistics-service --instance-count 1
az spring-cloud app create --name notification-service --instance-count 1
再來Build出Jar檔
mvn clean package -DskipTests -Denv=cloud
接著把全部服務都部署上Azure
az spring-cloud app deploy --name gateway \
--jar-path ./gateway/target/gateway-1.0-SNAPSHOT.jar
az spring-cloud app deploy --name account-service \
--jar-path ./account-service/target/account-service-1.0-SNAPSHOT.jar \
--env MONGODB_DATABASE=${MONGODB_DATABASE} \
MONGODB_URI=${MONGODB_URI} \
RABBITMQ_HOST=${RABBITMQ_HOST} \
RABBITMQ_PORT=${RABBITMQ_PORT} \
RABBITMQ_USERNAME=${RABBITMQ_USERNAME} \
RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD}
az spring-cloud app deploy --name auth-service \
--jar-path ./auth-service/target/account-service-1.0-SNAPSHOT.jar \ \
--env MONGODB_DATABASE=${MONGODB_DATABASE} \
MONGODB_URI=${MONGODB_URI}
az spring-cloud app deploy --name statistics-service \
--jar-path ./statistics-service/target/statistics-service-1.0-SNAPSHOT.jar \ \
--env MONGODB_DATABASE=${MONGODB_DATABASE} \
MONGODB_URI=${MONGODB_URI} \
RABBITMQ_HOST=${RABBITMQ_HOST} \
RABBITMQ_PORT=${RABBITMQ_PORT} \
RABBITMQ_USERNAME=${RABBITMQ_USERNAME} \
RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD}
az spring-cloud app deploy --name notification-service \
--jar-path ./notification-service/target/notification-service-1.0-SNAPSHOT.jar \ \
--env MONGODB_DATABASE=${MONGODB_DATABASE} \
MONGODB_URI=${MONGODB_URI} \
RABBITMQ_HOST=${RABBITMQ_HOST} \
RABBITMQ_PORT=${RABBITMQ_PORT} \
RABBITMQ_USERNAME=${RABBITMQ_USERNAME} \
RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD}
接下來只要瀏覽一樣URL就可以看到
經過上面漫長的步驟就可以完成把微服務架在Azure上拉~但這時候應該就會有人問,那如果我想把微服務部署到Kubernetes上呢?該怎麼辦,前陣子我也有做過這件事,但自己用起來會感覺有點奇怪,因為兩邊重疊的地方太多了,比如說: Kubernetes的ingress跟Spring Cloud的Zuul,兩個都是可以扮演API Gateway的角色,所以就會有點尷尬,因為同時也只需要一個功能就好了,不過如果有時候可以善加運用兩邊的優點,也會是個好方式!!