SpringCloudで遊ぶ 3日目
SpringBootAdminを入れる
SpringBootAdminを入れてみる。Eureka経由でサービスを見つけてくれるようになる。
project("admin") { dependencies { implementation 'de.codecentric:spring-boot-admin-starter-server' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' } }
@Configuration @EnableAutoConfiguration @EnableAdminServer public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } }
eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: startup: ${random.int} #needed to trigger info and endpoint update after restart prefer-ip-address: true client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS spring: application: name: admin
version: '3.7' services: hello-app: image: net.orekyuu/hello:0.0.5 ports: - 8080:8080 deploy: replicas: 2 environment: EUREKA_URI: http://eureka:8761/eureka eureka: image: net.orekyuu/eureka:0.0.5 ports: - 8761:8761 deploy: replicas: 1 admin: image: net.orekyuu/admin:0.0.5 ports: - 18080:8080 environment: EUREKA_URI: http://eureka:8761/eureka
デプロイ…! よし!動いてる!
API Gatewayを作ってみる
API Gatewayでhello-appを叩けるようにしてみる
project(':api-gateway') { dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // actuatorはsubprojectsのdependenciesに移動した。どうせ全部のプロジェクトで必要だし } }
@SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("hello_app_route", r -> r .path("/hello") .uri("http://hello-app:8080/hello")) .build(); } }
ガッっとアプリケーションコードを書く。
RouteLocatorBuilderでメソッドチェーンしながら組み立てていくっぽい。/helloにアクセスが来たらkubernetes内のhello-appiの/helloにプロキシするようにした。
hello-appの名前解決はeurekaでやってくれる。便利~!
spring: application: name: api-gateway eureka: instance: leaseRenewalIntervalInSeconds: 10 health-check-url-path: /actuator/health metadata-map: startup: ${random.int} #needed to trigger info and endpoint update after restart prefer-ip-address: true client: registryFetchIntervalSeconds: 5 serviceUrl: defaultZone: ${EUREKA_URI:http://localhost:8761/eureka} management: endpoints: web: exposure: include: "*" endpoint: health: show-details: ALWAYS
application.ymlはコピペ。spring.application.nameだけ変えてる。似たような設定が散らばるのやだなー。
一応ルーティングの設定はapplication.ymlでも書けるらしいけど、個人的にはJavaConfigのほうがコンパイルできるし補完も効くのですき。
version: '3.7' services: hello-app: image: net.orekyuu/hello:0.0.5 deploy: replicas: 2 environment: EUREKA_URI: http://eureka:8761/eureka eureka: image: net.orekyuu/eureka:0.0.5 ports: - 8761:8761 deploy: replicas: 1 admin: image: net.orekyuu/admin:0.0.5 ports: - 18080:8080 environment: EUREKA_URI: http://eureka:8761/eureka api-gateway: image: net.orekyuu/api-gateway:0.0.5 environment: EUREKA_URI: http://eureka:8761/eureka ports: - 8080:8080
最後にapi-gatewayの設定を追加して8080で受けるようにする。もともとhello-appが使っていたけど、直接叩くことはなくなったのでportsは削除。
全部api-gatewayを通してリクエスト
デプロイして8080を確認するとhello-appのときと変わらない画面が見える。
結局API Gatewayが使われているかわからん!
Adminを見てみる。
ちゃんとリクエストきてる!やったー!