概要
前回投稿したSpring Cloudを使ったマイクロサービスシステム構築(シングル構成編)の構成もとに、多重構成化する。
マイクロサービスの多重化
シングル構成だと、一つのマイクロサービスが停止した場合、そのサービスが利用できなくなる。またある特定のサービスへのアクセスが多い場合、多重化することでサービスを負荷分散できるようになる。
マイクロサービスのポートが同じなので、異なるサーバにマイクロサービスを構築する。ms01
とms02
のサーバを用意し、それにマイクロサービスを配置する。各サーバで動作するマイクロサービスと受信ポートのイメージは以下のようなもの。
Service1-#3
はポートを変えるので後で設定する。
Eurekaの多重化
Spring Cloudの本家の記事を参考にEurekaをPeer Awareness
構成にする。
やっていることは、profilesを2つ用意して、それぞれがお互いのEurekaをサーバとして認識することっぽい。
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
spring:
cloud:
inetutils:
preferredNetworks:
- 10.10.10
---
spring:
profiles: peer1
eureka:
instance:
hostname: ms01
client:
serviceUrl:
defaultZone: http://ms02:8761/eureka/
---
spring:
profiles: peer2
eureka:
instance:
hostname: ms02
client:
serviceUrl:
defaultZone: http://ms01:8761/eureka/
Javaのソースコードは前回から変更なしのため必要なら昔の記事を参照。これでms01
とms02
サーバにそれぞれ配置する。起動の際はどのような条件で起動するか、peerを指定して動作条件を決める。
[root@ms01 ~]# java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
[root@ms02 ~]# java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
正しく動作しているか確認。ms01のEureka管理コンソールを見ると、レプリカとしてms02のEurekaが登録されていて正常に登録されているようだ。
Service-1/Service-2のマイクロサービス多重化
Eurekaとほぼ同じ構成になる。サーバ毎に条件を分けるpeer指定がないので記載してないが必要ならpeer指定してサーバ毎に動きを変えることも可能。
サンプルとしてService-1のapplication.ymlの設定を載せるがService-2も読み替えて設定。
spring:
application:
name: app1-service
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://ms01:8761/eureka/, http://ms02:8761/eureka/
Gatewayの多重化
Gatewayも一緒。
server:
port: 8080
eureka:
client:
serviceUrl:
defaultZone: http://ms01:8761/eureka/, http://ms02:8761/eureka/
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: app1Module
# uri: http://ms01:8081/ #単体で動かす場合はこれでもOK
uri: lb://APP1-SERVICE # application:name を指定する
predicates:
- Path=/hello/**
- id: app2Module
# uri: http://ms01:8082/
uri: lb://APP2-SERVICE
predicates:
- Path=/goodbye/**
サービスの登録と起動
Service-1/Service-2とGatewayをそれぞれms01,ms02両方のサーバで起動してみる。Eurekaに二重登録されているっぽい。
シングル構成の時と同様、マイクロサービスのURLにアクセスすると正常応答が返ってくる。
今回は二重起動しているので、下記それぞれで応答が返ってくる。
http://ms01:8080/hello
http://ms02:8080/hello
http://ms01:8080/goodbye
http://ms02:8080/goodbye
2台のサーバで3多重サービスをする
サーバがms01,ms02の2台でサービスを3多重にしたい場合、ポートを分けて起動する。
例えばService-1をms01で2つ起動する場合、既に8081ポートが利用済みなので、8083ポートで起動できるようにする。
spring:
application:
name: app1-service
server:
port: 8081 # デフォルトだと8081ポートで起動する
eureka:
client:
serviceUrl:
defaultZone: http://ms01:8761/eureka/, http://ms02:8761/eureka/
---
spring:
profiles: peer1 # peer1のプロファイルを指定して起動すると、8083ポートで起動する
server:
port: 8083
あとは、これを起動するとよい。
[root@ms01 ~]# java -jar app1-service-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
Eurekaの管理コンソールで見てみると、APP1-SERVICEのサービスがms01サーバの8081と8083ポートで動いているのがわかる。他にもms02サーバの8081ポートで動いているので、合計3多重で動いているのがわかる。
確認のため、ms01,ms02サーバの8081で動いているAPP1-SERVICEを停止し、ms01サーバの8083ポートでサービスが状態にしても、従来通りのアクセス方法で(つまりポートを意識することなく)アクセス可能。
この状態でも従来同様、http://ms01:8080/hello にアクセスすることでAPP1-SERVICEを呼び出せる。
他にも、ms01のサーバ自体を停止させてもシングル構成で動く。